我想在脚本中执行类似以下操作
$ 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