如何在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
相关产品推荐
相关产品推荐

