BASH 子进程在脚本中使用 SSH?

BASH 子进程在脚本中使用 SSH?

我想在脚本中执行类似以下操作

$ ssh host1 "$(command)"

但是,子进程会在建立 SSH 连接之前执行,因为如果我执行以下操作

$ ssh host1 "$(hostname)"

返回本地计算机的主机名。我希望能够使用子流程,因为这会让我想做的其他事情变得更容易。

编辑:根据要求提供更完整的示例。我有一个主机名列表,需要向其中添加 crontab 条目。每个系统都属于特定用户,因此应在其名称中添加该条目。系统的所有者包含在系统的主机名中,因此通过解析主机名,我可以su找到适当的用户并相应地编辑他们的 crontab。例如这样的事情:

for host in $(cat /tmp/hosts); do
echo -e "----------------------------"
echo -e "# SSH to host $host"
echo -e "----------------------------"
ssh $host "su - $(hostname | cut -b-5-); crontab -e";
done

答案1

您的命令替换正在本地扩展,因为双引号允许 shell 进行扩展。

双引号将允许 shell 解释$, `, \, 以及 如果启用了历史扩展!

另一方面,单引号将保留所有特殊字符的字面值。

因此,当您单引号命令替换时,您可以确保它按原样传递到远程计算机。如果您必须保留局部变量作为命令替换的一部分,您也可以使用转义字符。

ssh user@host "$(command)"    #will expand locally
ssh user@host '$(command)'    #will expand on the remote machine
ssh user@host "\$(command $local_var)"    #will expand local_var locally but send the command substitution to the remote machine

相关内容