【问题标题】:Execute remote SSH command and evaluate this command on remote side执行远程 SSH 命令并在远程端评估此命令
【发布时间】: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)?怎么做?

【问题讨论】:

    标签: linux bash ssh


    【解决方案1】:
    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
    

    【讨论】:

    • 但是,是否存在更通用的方法?我的意思是在 ssh 之后评估部分 bash 命令?
    • 我在答案中添加了更多内容。也许这就是你要找的东西?
    【解决方案2】:

    首先,

    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' 
    

    如果你想要远程服务器上的本地主机名...

    你有选择。 :)

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 2015-03-29
      • 2010-12-25
      • 2017-02-08
      • 1970-01-01
      • 2018-03-03
      • 2020-12-04
      • 2011-09-18
      相关资源
      最近更新 更多