【问题标题】:How to pass local variable to remote ssh commands?如何将本地变量传递给远程 ssh 命令?
【发布时间】:2012-07-18 19:19:46
【问题描述】:

我需要在远程机器上执行多个命令,并使用 ssh 来执行此操作,

ssh root@remote_server 'cd /root/dir; ./run.sh'

在脚本中,我想在执行run.sh时传递一个局部变量$argument,比如

ssh root@remote_server 'cd /root/dir; ./run.sh $argument'

它不起作用,因为在单引号中 $argument 没有按预期方式解释。

编辑:我知道可以使用双引号,但这有什么副作用吗?

【问题讨论】:

  • 唯一的副作用是在引用的字符串中插入变量。如果您在该字符串中有其他与变量无关的$,则需要转义那些不是变量的。
  • 这对我有用argument=10;ssh root@x.x.x.x 'head -'$argument' some.php';
  • @MarcB 如果你把它作为一个答案,我会接受它

标签: linux bash


【解决方案1】:

您可以在此处安全地使用双引号。

ssh root@remote_server "cd /root/dir; ./run.sh $argument"

这将扩展 $argument 变量。没有其他东西会带来任何风险。

如果您确实需要扩展某些变量,但不需要扩展其他变量,则可以使用反斜杠对其进行转义。

$ argument='-V'
$ echo "the variable \$argument is $argument"

会显示

the variable $argument is -V

您始终可以使用双引号进行测试,以发现任何可能让您措手不及的隐藏问题。您始终可以使用 echo 安全地进行测试。

此外,运行多个命令的另一种方法是将标准输入重定向到 ssh。这在脚本中特别有用,或者当您有超过 2 或 3 个命令时(尤其是任何控制语句或循环)

$ ssh user@remoteserver << EOF
> # commands go here
> pwd
> # as many as you want
> # finish with EOF
> EOF
output, if any, of commands will display
$ # returned to your current shell prompt

如果您在命令行上执行此操作,您将获得一个标准输入提示来编写您的命令。在命令行上,在您使用 EOF 指示完成之前,甚至不会尝试 SSH 连接。因此,您不会看到任何结果,但您可以 Ctrl-C 退出并重新开始。无论是在命令行上还是在脚本中,您都可以使用 EOF 来包装命令序列。届时您将返回到您的正常外壳。

【讨论】:

    【解决方案2】:

    您可以在远程端运行xargs

    $ echo "$argument" | ssh root@remote_server 'cd /root/dir; xargs -0 ./run.sh'
    

    这完全避免了任何引用问题——除非你的论点中有空字符,我想。

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 2013-03-24
      • 2014-05-21
      • 2011-10-08
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      相关资源
      最近更新 更多