我需要远程机器上执行的多个命令,并使用ssh这样做,如何将本地变量传递给远程ssh命令?
SSH根@ remote_server的“CD /根/ DIR; ./run.sh '
在脚本中,我想执行run.sh
时,像
SSH根@ remote_server的传递一个局部变量
$argument
' CD /根/ DIR; ./run.sh $参数'
它不起作用,因为在单引号$参数不解释预期的方式。
编辑:我知道,可使用双引号,但有没有对任何副作用?
我需要远程机器上执行的多个命令,并使用ssh这样做,如何将本地变量传递给远程ssh命令?
SSH根@ remote_server的“CD /根/ DIR; ./run.sh '
在脚本中,我想执行run.sh
时,像
SSH根@ remote_server的传递一个局部变量
$argument
' CD /根/ DIR; ./run.sh $参数'
它不起作用,因为在单引号$参数不解释预期的方式。
编辑:我知道,可使用双引号,但有没有对任何副作用?
您可以运行在远程端xargs
:
$ echo "$argument" | ssh [email protected]_server 'cd /root/dir; xargs -0 ./run.sh'
这完全避免了任何引号的问题 - 除非你的论点中有空字符,我想。
您可以放心地在这里使用双引号。
ssh [email protected]_server "cd /root/dir; ./run.sh $argument"
这将展开$参数变量。目前没有任何其他风险存在。
如果你有,你就需要扩大一些变量,而不是其他人的情况下,你可以用反斜杠转义。
$ argument='-V'
$ echo "the variable \$argument is $argument"
将显示
the variable $argument is -V
你总是可以用双引号进行测试,以发现可能的惊喜抓住你任何隐患。您始终可以安全地使用echo进行测试。
此外,运行多个命令的另一种方式是将stdin重定向到ssh。这是在脚本中特别有用,或者当你有超过2级或3的命令(特别是任何控制语句或循环)
$ ssh [email protected] << 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打包命令序列。那时你会返回到正常的shell。
只有副作用是插入引用字符串中的变量。如果在该字符串中有其他非变量相关的'$',则需要转义那些不适用于变量的变量。 – 2012-07-19 15:06:05
这对我有用'argument = 10; ssh [email protected]'head - '$ argument'some.php''; – Tamil 2012-07-19 15:34:06
@MarcB如果你让它成为答案,我会接受它 – Richard 2012-07-19 15:51:31