我需要在远程机器上执行多个命令,并使用ssh来执行此操作,
ssh root @ remote_server'cd / root / dir; ./run.sh'
在脚本中,我想在执行$argument
时传递局部变量run.sh
,例如
ssh root @ remote_server'cd / root / dir; ./run.sh $ argument'
它不起作用,因为单引号$参数不会被解释为预期的方式。
编辑:我知道可以使用双引号,但对此有任何副作用吗?
答案 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。