如何在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都可以访问?
答案 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;'