如何在SSH命令中包含本地和远程变量

时间:2012-12-11 18:22:03

标签: linux bash

如何在ssh命令中同时拥有本地和远程变量?例如,在以下示例代码中:

A=3;
ssh host@name "B=3; echo $A; echo $B;"

我可以访问A但无法访问B.

但是在下面的例子中:

A=3;
ssh host@name 'B=3; echo $A; echo $B;'

我没有A,只有B可以访问。

有没有办法让A和B都可以访问?

1 个答案:

答案 0 :(得分:61)

我认为这就是你想要的:

A=3;
ssh host@name "B=3; echo $A; echo \$B;"

使用双引号时

您的shell会对前缀为$的变量进行自动扩展,因此在您的第一个示例中,当它看到

ssh host@name "B=3; echo $A; echo $B;"

bash将其扩展为:

ssh host@name "B=3; echo 3; echo ;"

然后host@name "B=3; echo 3; echo ;"作为参数传递给ssh。这是因为您使用A定义了A=3,但您从未定义B,因此$B会在本地解析为空字符串。


使用单引号时

单引号括起来的所有东西都被解释为字符串文字,所以当你这样做时:

ssh host@name 'B=3; echo $A; echo $B;'

登录到远程服务器后,将运行说明B=3; echo $A; echo $B;。您已在远程shell中定义了B,但您从未告诉它A是什么,因此$A将解析为空字符串。


因此,当您使用\$时,就像在解决方案中一样:

\$表示从字面上解释$字符,因此我们将字面echo $B作为远程执行的指令之一发送,而不是首先在本地扩展$B 。我们最终告诉ssh要做的事情等同于:

ssh host@name 'B=3; echo 3; echo $B;'