2012-07-19 76 views
0

我需要远程机器上执行的多个命令,并使用ssh这样做,如何将本地变量传递给远程ssh命令?

SSH根@ remote_server的“CD /根/ DIR; ./run.sh '

在脚本中,我想执行run.sh时,像

SSH根@ remote_server的传递一个局部变量$argument' CD /根/ DIR; ./run.sh $参数'

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

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

+1

只有副作用是插入引用字符串中的变量。如果在该字符串中有其他非变量相关的'$',则需要转义那些不适用于变量的变量。 – 2012-07-19 15:06:05

+0

这对我有用'argument = 10; ssh [email protected]'head - '$ argument'some.php''; – Tamil 2012-07-19 15:34:06

+0

@MarcB如果你让它成为答案,我会接受它 – Richard 2012-07-19 15:51:31

回答

2

您可以运行在远程端xargs

$ echo "$argument" | ssh [email protected]_server 'cd /root/dir; xargs -0 ./run.sh' 

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

2

您可以放心地在这里使用双引号。

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。

相关问题