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

如何在Bash脚本的EOF块内将变量传递至全局变量?

如何将远程SSH会话中的变量传递回本地Shell?

你遇到的问题核心在于:SSH Here Document里的代码是在远程服务器的独立Shell进程中执行的,和你本地的Shell进程完全隔离——所以远程里的var1和你本地定义的var1根本不是同一个变量,自然没法直接传递。

不过有几种简单的方法能实现你的需求,下面逐个说明:

方法1:直接捕获远程命令的输出到本地变量

这是最简洁的方式,如果你的需求只是获取某个远程命令的结果,直接把SSH命令的输出赋值给本地变量就行:

var1=$(ssh xxx@yyy 'bash命令的执行结果')
echo $var1  # 这里就能显示远程命令的输出了

方法2:在远程会话中输出目标变量,本地捕获整个SSH的输出

如果远程需要执行一系列命令,最后才得到var2,可以在远程会话的最后把var2输出出来,然后本地用$()捕获整个SSH命令的输出:

var1=$(ssh xxx@yyy <<'EOF'
# 这里放你需要执行的其他远程命令
[...]
var2=`bash命令的执行结果`
echo $var2  # 只输出我们需要的内容,避免其他干扰
EOF
)
echo $var1  # 现在就能显示远程生成的var2的值了

注意:如果远程命令有其他无关的输出(比如警告、日志),最好把那些输出重定向到/dev/null,避免污染我们需要的结果。比如:

var1=$(ssh xxx@yyy <<'EOF'
# 其他命令,把无关输出扔去/dev/null
some_command >/dev/null 2>&1
var2=`bash命令的执行结果`
echo $var2
EOF
)

为什么原来的写法不行?

再帮你理清楚逻辑:当你用ssh xxx@yyy <<'EOF'时,本地Shell会把EOF之间的所有内容发送给远程服务器的SSH进程,远程服务器会启动一个新的Shell来执行这些代码。远程Shell里的var1、var2都是这个远程Shell的局部变量,执行完后远程Shell就退出了,这些变量也随之消失,根本传不到本地Shell里。

内容的提问来源于stack exchange,提问作者Cascador84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:10:35