我想在脚本中执行以下操作
$ 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
您的命令替换正在本地扩展,因为双引号允许外壳程序。
双引号将允许 shell 解释
$
,`
,\
, 以及是否启用历史扩展!
另一方面,单引号将保留所有特殊字符的文字值。
因此,当您单引号您的命令替换时,您确保它按原样传递给远程机器。如果您必须保留局部变量作为命令替换的一部分,您也可以为此使用转义字符。