我需要在远程机器上执行多个命令,并使用 ssh 来执行此操作,
ssh root@remote_server 'cd /root/dir; ./run.sh'
在脚本中,我想$argument
在执行时传递一个局部变量run.sh
,比如
ssh root@remote_server 'cd /root/dir; ./run.sh $argument'
它不起作用,因为在单引号中 $argument 没有按预期方式解释。
编辑:我知道可以使用双引号,但是有任何副作用吗?
您可以在这里安全地使用双引号。
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 来包装命令序列。那时您将返回到您的正常外壳。
您可以xargs
在远程端运行:
$ echo "$argument" | ssh root@remote_server 'cd /root/dir; xargs -0 ./run.sh'
这完全避免了任何引用问题——除非你的论点中有空字符,我想。