如何将局部变量传递给远程ssh命令?

时间:2012-07-19 15:02:59

标签: linux bash

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

  

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

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

  

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

它不起作用,因为单引号$参数不会被解释为预期的方式。

编辑:我知道可以使用双引号,但对此有任何副作用吗?

2 个答案:

答案 0 :(得分:2)

您可以在远程端运行xargs

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

这完全避免了任何引用问题 - 除非你的参数中包含空字符,我想。

答案 1 :(得分:2)

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

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进行测试。

此外,运行多个命令的另一种方法是将stdin重定向到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

如果在命令行中执行此操作,您将获得stdin提示来编写命令。在命令行上,在使用EOF指示完成之前,甚至不会尝试SSH连接。所以你不会看到结果,但你可以用Ctrl-C离开并重新开始。无论是在命令行还是在脚本中,都可以使用EOF包装命令序列。那时你将被归还给正常的shell。