使用 ssh 执行多个命令,包括评估远程机器上的环境变量

Executing multiple commands with ssh, including evaluation of environment variables on the remote machine

我有时使用 ssh 运行 远程主机上的多个命令,如下所示:

ssh my_user@my_host "command1; command2"

利用双引号将两个命令发送到远程机器。

现在我想在一个或两个命令中访问环境变量。
这是一个简化的示例,说明了我的尝试:

ssh my_user@my_host "echo $USER; echo $HOSTNAME"

这与我在本地计算机上的 user/hostname 相呼应,而我希望在远程计算机上看到这些名称。

使用单引号我可以实现我想要的单个命令,如下所示:

ssh my_user@my_host echo '$USER'

但是当我像这样在双引号内使用单引号时,我没有得到我想要的行为:

ssh my_user@my_host "echo '$USER'; echo '$HOSTNAME'"

如何通过从单个 ssh 命令执行两个命令来获得我想要的行为?

(请注意我的实际命令更复杂......我确实意识到我可以在一个命令中为我的玩具示例获取两个变量,如下所示,但这并不能解决我的实际问题):

ssh my_user@my_host echo '$USER' '$HOST'

只需使用 \.

转义 $
ssh my_user@my_host "echo $USER; echo $HOSTNAME"

您可以将整个命令 运行 放在单引号中,如下所示:

ssh my_user@my_host 'echo $USER; echo $HOSTNAME'

这将阻止您的 shell 在将环境变量值传递给远程机器之前替换它们,但是当它们到达远程机器时它们没有被引用,因此它们会在那里被评估。

感谢吉尔赫姆·里希特。该解决方案有效! 5 分钟过后,我将接受它。我想记录一下,同时我找到了另一种解决方案,它避免了双引号,而不是通过转义分号来避免单引号:

ssh user@host echo '$USER' \; echo '$USER'