嵌套SSH heredoc执行中断求助:远程脚本未完成后续命令
解决嵌套SSH导致原连接提前终止的问题
这个问题我之前也踩过坑,核心原因是内层的ssh server2会抢占外层SSH会话的标准输入(stdin)。你用heredoc给ssh server1传递命令的时候,整个heredoc的内容是通过stdin传给server1上的shell的。当内层ssh server2执行时,它会默认从当前的stdin读取数据,也就是把heredoc里剩下的echo three $HOSTNAME当作自己的输入,而不是留给外层shell继续执行,所以外层SSH会话会提前终止,自然看不到最后那行输出。
下面给你几个可行的解决方案:
方案1:给内层SSH添加-n参数
-n参数会把SSH的stdin重定向到/dev/null,这样内层SSH就不会读取外层heredoc的剩余内容了,外层shell就能正常执行后续命令。修改后的脚本如下:
#!/bin/bash ssh server1 <<'EOF' echo one $HOSTNAME ssh -n server2 'echo two $HOSTNAME' echo three $HOSTNAME EOF
方案2:手动重定向内层SSH的stdin到/dev/null
和方案1原理一致,只是写法更直接,给内层SSH命令加上输入重定向:
#!/bin/bash ssh server1 <<'EOF' echo one $HOSTNAME ssh server2 'echo two $HOSTNAME' < /dev/null echo three $HOSTNAME EOF
方案3:如果需要内层SSH交互(可选)
如果你的内层SSH命令需要交互(比如输入密码,不过更推荐用密钥免密登录提升安全性),可以给内层SSH加上-t参数强制分配伪终端,这样输入会被正确隔离:
#!/bin/bash ssh server1 <<'EOF' echo one $HOSTNAME ssh -t server2 'echo two $HOSTNAME' echo three $HOSTNAME EOF
不过要注意,-t可能会在非交互场景下产生一些额外输出,所以如果只是执行无交互命令,方案1或2会更合适。
内容的提问来源于stack exchange,提问作者rigglesbee
相关产品推荐
相关产品推荐

