加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 通过ssh将脚本和二进制数据传递给stdin

发布时间:2020-12-15 21:10:24 所属栏目:安全 来源:网络整理
导读:我想远程执行一个bash脚本,它使用tarball并对它执行一些逻辑.诀窍是我只想使用一个ssh命令来执行它(而不是scp用于tarball,然后是脚本的ssh). bash脚本如下所示: cd /tmptar -zx./archive/some_script.shrm -r archive 我意识到我可以简单地将这个脚本重新格
我想远程执行一个bash脚本,它使用tarball并对它执行一些逻辑.诀窍是我只想使用一个ssh命令来执行它(而不是scp用于tarball,然后是脚本的ssh).

bash脚本如下所示:

cd /tmp
tar -zx
./archive/some_script.sh
rm -r archive

我意识到我可以简单地将这个脚本重新格式化为单行并使用

tar -cz ./archive | ssh $HOST bash -c '<commands>'

但是我的实际脚本很复杂,我必须通过stdin将它传递给bash.这里的挑战是ssh只提供了一个我想用于bash脚本和tarball的输入管道(stdin).

解决方法

我想出了两个解决方案,其中包括bash脚本和stdin中的tarball.

1.将base64编码的tarball嵌入到heredoc中

在这种情况下,服务器接收一个bash脚本,其中tarball嵌入在heredoc中:

base64 -d <<'EOF_TAR' | tar -zx
<base64_tarball>
EOF_TAR

这是完整的例子:

ssh $HOST bash -s < <(
# Feed script header
cat <<'EOF'
cd /tmp
base64 -d <<'EOF_TAR' | tar -zx
EOF

# Create local tarball,and pipe base64-encoded version
tar -cz ./archive | base64

# Feed rest of script
cat <<'EOF'
EOF_TAR
./archive/some_script.sh
rm -r archive
EOF
)

但是,在这种方法中,tar不会开始提取tarball,直到它完全通过网络传输.

2.在脚本之后提供tar二进制数据

在这种情况下,bash脚本通过管道传输到stdin,然后是原始tarball数据. bash将控制传递给tar,后者处理stdin的tar部分:

ssh $HOST bash -s < <(
# Feed script.
cat <<'EOF'
function main() {
  cd /tmp
  tar -zx
  ./archive/some_script.sh
  rm -r archive
}
main
EOF
# Create local tarball and pipe it
tar -cz ./archive
)

与第一种方法不同,这种方法允许tar在通过网络传输时开始提取tarball.

边注

你问我们为什么需要主要功能?为什么首先提供整个bash脚本,然后是二进制tar数据?好吧,如果二进制数据放在bash脚本的中间,那么就会出现错误,因为tar消耗的时间超过了tar文件的结尾,在这种情况下会占用一些bash脚本.因此,main函数用于强制整个bash脚本在tar数据之前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读