1

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

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

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

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

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

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

4

2 回答 2

4

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

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 来包装命令序列。那时您将返回到您的正常外壳。

于 2016-08-29T20:03:05.683 回答
2

您可以xargs在远程端运行:

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

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

于 2012-07-19T15:09:08.257 回答