【问题标题】:How have both local and remote variable inside an SSH command如何在 SSH 命令中同时拥有本地和远程变量
【发布时间】:2012-12-11 18:22:03
【问题描述】:

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

【问题讨论】:

  • 看起来 A 可以在 2nd 而不是 B。是这样吗?

标签: linux bash


【解决方案1】:

我想这就是你想要的:

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 ;"

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


当您使用单引号时

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

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

一旦您登录到远程服务器,就会运行指令B=3; echo $A; echo $B;。您已经在远程 shell 中定义了 B,但您从未告诉它 A 是什么,所以 $A 将解析为空字符串。


所以当你使用\$时,就像在解决方案中一样:

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

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

【讨论】:

  • 可以查看生成的命令跟在A=3; ssh -v host@name "B=5; echo $A; echo \$B;" 2>&1 | grep -A 2 'Sending command'或者sh -xc 'A=3; ssh host@name "B=5; echo $A; echo \$B;"'之后。
  • 请注意,这也会延迟变量扩展。 ssh host@name 'B=\$(find . -name "*.txt"); echo \$B'
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 2011-03-19
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多