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

Sep*_*ini 28 linux bash

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

A=3;
ssh host@name "B=3; echo $A; echo $B;"
Run Code Online (Sandbox Code Playgroud)

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

但在以下示例中:

A=3;
ssh host@name 'B=3; echo $A; echo $B;'
Run Code Online (Sandbox Code Playgroud)

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

是否可以访问A和B?

sam*_*hen 63

我想这就是你想要的:

A=3;
ssh host@name "B=3; echo $A; echo \$B;"
Run Code Online (Sandbox Code Playgroud)

当您使用双引号时:

你的shell在前缀为变量的变量上进行自动扩展$,所以在你的第一个例子中,它看到了

ssh host@name "B=3; echo $A; echo $B;"
Run Code Online (Sandbox Code Playgroud)

bash将其扩展为:

ssh host@name "B=3; echo 3; echo ;"
Run Code Online (Sandbox Code Playgroud)

然后传递host@name "B=3; echo 3; echo ;"作为参数ssh.这是因为您定义AA=3,但从未定义过B,因此$B在本地解析为空字符串.


当您使用单引号时:

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

ssh host@name 'B=3; echo $A; echo $B;'
Run Code Online (Sandbox Code Playgroud)

B=3; echo $A; echo $B;登录到远程服务器后将运行说明.你已经B在远程shell中定义了,但是你从来没有告诉它是什么A,所以$A将解析为空字符串.


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

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

ssh host@name 'B=3; echo 3; echo $B;'
Run Code Online (Sandbox Code Playgroud)