ssh 在脚本中使用“command”而不是“command”

ssh 在脚本中使用“command”而不是“command”

我正在尝试通过简单的脚本在集群的各个节点上自动运行命令。我已经看到我可以运行:

#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 'echo Machine: $HOSTNAME;'
echo "Machine: "$HOSTNAME;

我得到了预期的结果:

Machine: machine1
Machine: machine2
Machine: machine1

但是,我想运行更复杂的命令,这将需要变量,所以我需要使用"'不是ssh.但是,如果我这样做,ssh 似乎不起作用:

#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 "echo Machine: $HOSTNAME;"
echo "Machine: "$HOSTNAME;

返回:

Machine: machine1
Machine: machine1
Machine: machine1

我见过其他问题其中明确指出使用以这种方式运行命令",所以我对这里发生的事情感到困惑。

答案1

我认为您想问的是如何将本地评估的变量与需要远程评估的变量混合和匹配。

一种选择是为要远程处理的操作编写一个脚本,从而封装对本地变量的任何引用,以便本地主机的引号无法看到它们以展开它们。

对于非常短的片段,另一个选择是混合引用,如下所示:

FRUIT=apples
ssh machine2 "echo Eating $FRUIT "'on $HOSTNAME'

双引号段中的变量将在本地进行计算(在ssh执行之前)。单引号段中的所有内容都将被视为文字。两个带引号的字符串将连接起来以创建字符串echo Eating apples on $HOSTNAME,并将结果作为要远程计算的文字传递。

答案2

你可以亲自看看:

[user@bluepc ~]$ echo "$HOSTNAME;"
bluepc;
[user@bluepc ~]$ echo '$HOSTNAME;'
$HOSTNAME;

单引号内的环境变量被视为字符串。

对于 ssh,如果使用双引号:

  • 该字符串在本地服务器上被替换。
  • 该命令是远程执行的。

如果您使用单引号:

  • 该字符串将按原样传递到远程服务器。
  • 远程替换
  • 命令已执行

相关内容