如何使用ssh和bash脚本将局部变量传递给远程?

时间:2013-04-03 03:34:19

标签: linux bash unix ssh cluster-computing

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

仍然没有打印。

所以我的问题是如何将局部变量作为变量传递给远程机器?

已在this

中提供答案

2 个答案:

答案 0 :(得分:3)

此处文档中给出的变量赋值TEST="sdfsd"不是真正的变量赋值,i。即变量赋值实际上不会直接在here文档的声明/定义中执行(但稍后当shell文档被shell评估时)。

此外,在本地shell执行$TEST命令之前,本地shell 将扩展未转义或未引用此处文档中包含的ssh变量。 结果是$TEST将被解析为空字符串,如果它没有在分别在ssh命令或here文档之前的本地shell 中定义。

因此,here文档中的变量赋值export TEST="sdfsd"将不会在本地shell中生效,但首先会被发送到远程主机的shell,并且只会扩展,因此您的没有打印任何经验。

解决方案是使用转义或单引号的文档<<\EOF<<'EOF';或者只转义here文档中的\$TEST变量;或者只是在$TEST命令(和此处的文档)之前定义ssh变量。

# 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 :(得分:0)

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