bash – 通过ssh将脚本和二进制数据传递给stdin
我想远程执行一个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数据之前. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Bootstrap table 服务器端分页示例
- 虚拟机 – Docker在实际项目中的用例
- shell – rsync排除一个目录,但包含一个子目录
- 错误TS2304:在角度4项目的app.components.ts和main.ts文件
- twitter-bootstrap – Twitter Bootstrap手风琴图标没有改变
- docker – 如何在本地机器和minikube之间传输文件?
- getItemValue方法的妙用
- scala – 如何阻止sbt发布pom.xml
- WebSphere Message Broker(12)--webservice服务调用
- bash – 如何使用’find’返回父目录