如何使用ssh和bash脚本将本地变量传递到远程主机?

5
ssh remotecluster 'bash -s' << EOF
> export TEST="sdfsd"
> echo $TEST
> EOF

这不会输出任何内容。

即使我将变量存储到文件中并复制到远程服务器上,它仍然无法工作。

TEST="sdfsdf"
echo $TEST > temp.par
scp temp.par remotecluster
ssh remotecluster 'bash -s' << EOF
> export test2=`cat temp.par`
> echo $test2
> EOF

仍然没有打印任何内容。

我的问题是如何将本地变量作为变量传递到远程机器上?

答案已经在此处给出。

3个回答

4
在此文档中给定的变量赋值TEST="sdfsd"并不是真正的变量赋值,即变量赋值实际上不会直接在此处文档的声明/定义中执行(而是在此处文档由shell评估时执行)。
此外,在未转义或未引用的此处文档中包含的$TEST变量将由本地shell在执行ssh命令之前展开。结果是,如果未在本地shell中在ssh命令或此处文档之前定义$TEST,它将解析为空字符串。
因此,在此处文档中的变量分配export TEST="sdfsd"不会在本地shell中生效,而是首先发送到远程主机的shell中,然后才会被展开,这就是你“什么也没有打印”的经历。
解决方案是使用转义或单引号的此处文档,<<\EOF<<'EOF';或只转义此处文档中的\$TEST变量;或在执行ssh命令(和此处文档)之前定义$TEST变量。
# prints sdfsd
export TEST="sdfsd"
ssh localhost 'bash -s' << EOF
echo $TEST
EOF

# prints sdfsd
ssh localhost 'bash -s' << EOF
export TEST="sdfsd"
echo \$TEST
EOF

# prints sdfsd
ssh localhost 'bash -s' <<'EOF'
export TEST="sdfsd"
echo $TEST
EOF

1

我知道这篇文章有点老,但是我想就这个话题发表一下我的看法,以防有人不熟悉heredoc。我只想补充一下Carlo的帖子,使用heredoc时可以添加变量和ssh会话,并且可能需要用不同的引号:

TEST="sdfsd"
ssh remotehost bash -s "$TEST" <<-'HEREDOC'
    export $1
    echo $1
HEREDOC

大多数人想要更改一个变量而不是在heredoc中进行硬编码,我通常发现这对我有效,但应该有人验证一下。同时注意如果使用<<-则需要避免空格和"tabs"。空格总是让我出错,所以用"tab"键缩进。如果失败了,请去掉短横线和"tabs"。


0

导出变量,ssh发送导出的(环境)变量到服务器 export VAR=test ssh -v 127.0.0.1 echo $VAR 测试上述命令并查看结果


1
远程服务器必须配置允许将本地环境发送到远程会话。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接