31

如何在 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?

4

1 回答 1

73

我认为这就是你想要的:

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 ;"sshAA=3B$B


当您使用单引号时

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

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

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


因此,当您使用 时\$,如解决方案中所示:

\$意思是按字面意思解释$字符,所以我们按字面意思echo $B作为指令之一发送远程执行,而不是让 bash$B先在本地展开。我们最终告诉ssh要做的事情是这样的:

ssh host@name 'B=3; echo 3; echo $B;'
于 2012-12-11T18:26:43.987 回答