【问题标题】:Ssh and run command upon connectionSSH 并在连接时运行命令
【发布时间】:2016-05-27 20:05:43
【问题描述】:

我想通过 SSH 连接并在连接时运行命令。 我运行以下命令:

ssh 主机 -t "命令"

但我需要更改一些环境变量才能运行该命令,并且似乎 eval 不起作用。

ssh host -t "eval `somescript.sh tcsh`; env | grep variables_that_should be_changed"

它根本不评估脚本并说该命令不存在“somescript.sh”。

somescript.sh 存在于远程机器上,而不是我从中 sshing 的那个。

有没有办法解决这个问题?

【问题讨论】:

  • “我需要更改一些环境变量”是什么意思?这些变量是否需要根据您从 进行 SSH 的地方的条件进行更改? IE。您是否真正需要为脚本提供选项,例如ssh -t remotehost "somescript.sh opt1 opt2 opt3"

标签: linux bash ssh


【解决方案1】:

将设置环境变量和执行命令放在同一个脚本中,然后通过 ssh 运行该脚本。在您的脚本存在之前,环境变量将一直有效。

【讨论】:

    【解决方案2】:

    您已经选择了“最佳答案”,所以我的回答只是帮助您了解问题所在。

    根据您问题中的代码,您似乎遇到了报价问题。你说:

    ssh host -t "eval `somescript.sh tcsh`; env | grep variables_that_should be_changed"
    

    当双引号内有反引号 (`...`) 时,它们会被 调用 shell 而不是您在远程服务器上运行的 shell 扩展。因此,对于您的命令行,somescript.sh 需要在本地存在,并且您可以使用命令行将该脚本的输出嵌入到远程运行的命令行中。可能不是你想要的。

    尽管有其他语法或程序改进,但如果您将双引号替换为单引号,那么反引号将作为您远程运行的命令行的一部分发送,而不是在本地扩展。

    另外,如果您使用反引号,请考虑将它们替换为 $(...) 符号。它更易于阅读,可以嵌套,并且通常被认为是现代 shell 的“更好方式”。

    【讨论】:

    • 谢谢你的解释,这对我帮助很大
    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多