【发布时间】:2020-09-29 23:18:47
【问题描述】:
让我们考虑以下代码:
CMD=echo $(hostname --fqdn) >> /tmp/hostname_fqdn
ssh some_user@10.9.11.4 -i ~/.ssh/id_rsa $CMD
现在,在远程端创建的文件/tmp/hostname_fqdn 包含客户端的主机名而不是远程端的主机名。是否可以评估部分命令(远程端的hostname --fqdn)?怎么做?
【问题讨论】:
让我们考虑以下代码:
CMD=echo $(hostname --fqdn) >> /tmp/hostname_fqdn
ssh some_user@10.9.11.4 -i ~/.ssh/id_rsa $CMD
现在,在远程端创建的文件/tmp/hostname_fqdn 包含客户端的主机名而不是远程端的主机名。是否可以评估部分命令(远程端的hostname --fqdn)?怎么做?
【问题讨论】:
ssh some_user@10.9.11.4 -i ~/.ssh/id_rsa hostname --fqdn >> /tmp/hostname_fqdn
或者,如果CMD 可能在运行时发生变化:
CMD="hostname --fqdn" && ssh cloud.luminrobotics.com $CMD >> /tmp/xxx
但是,您不能将输出的重定向 (>> filename) 保留为命令变量的一部分,因为该命令将在远程主机上执行。
PS:如果您想在运行时对输出进行更改,那么您需要使用管道和单独的命令变量,例如:
CMD_REMOTE="hostname --fqdn"
CMD_LOCAL="tee /tmp/hostname_fqdn"
ssh cloud.luminrobotics.com $CMD | $CMD_LOCAL
【讨论】:
首先,
CMD=echo $(hostname --fqdn) >> /tmp/hostname_fqdn
可能不会像你期望的那样做。
CMD=echo 将被传递为将echo 设置为$CMD 的值,然后从hostname 子shell 返回我们将被执行,并且可能会失败,创建一个空文件/tmp/hostname_fqdn
另一方面,ssh 非常灵活。你可以使用
ssh some_user@10.9.11.4 -i ~/.ssh/id_rsa 'hostname --fqdn >> /tmp/hostname_fqdn'
如果您希望将远程主机名保存到远程主机上的文件中,或者
ssh some_user@10.9.11.4 -i ~/.ssh/id_rsa 'hostname --fqdn' >> /tmp/hostname_fqdn
如果你想要本地服务器上的远程主机名,或者
hostname --fqdn | ssh some_user@10.9.11.4 -i ~/.ssh/id_rsa 'cat >> /tmp/hostname_fqdn'
如果你想要远程服务器上的本地主机名...
你有选择。 :)
【讨论】: