You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:02:31