如何通过ssh使用参数执行远程命令?
在我的.bashrc
我定义了一个可以在命令行中使用的函数:
function mycommand() { ssh user@123.456.789.0 cd testdir;./test.sh "$1" }
使用此命令时,只需在远程主机上执行cd
命令; test.sh
命令在本地主机上执行。 这是因为分号分隔了两个不同的命令: ssh
命令和test.sh
命令。
我试着按如下方式定义函数(注意单引号):
function mycommand() { ssh user@123.456.789.0 'cd testdir;./test.sh "$1"' }
我试图保持cd
命令和test.sh
命令在一起,但参数$1
不解决,独立于我给的function。 总是试图执行一个命令
./test.sh $1
在远程主机上。
如何正确定义mycommand
,所以脚本test.sh
在更改到testdir
目录后在远程主机上执行,并且能够将给mycommand
的参数mycommand
给test.sh
?
这样做,而不是:
function mycommand { ssh user@123.456.789.0 "cd testdir;./test.sh \"$1\"" }
您仍然需要将整个命令作为单个string传递,但是在这个单个string中,您需要先将$1
展开,然后才能将其发送到ssh,因此您需要使用""
作为它。
更新
另一个正确的方法是使用printf %q
正确地引用参数。 这将使参数安全地parsing,即使它有空格,单引号,双引号或任何其他可能对shell有特殊含义的字符:
function mycommand { printf -v __ %q "$1" ssh user@123.456.789.0 "cd testdir;./test.sh $__" }
- 当用
function
声明函数时,()
不是必需的。 - 不要仅仅因为你是POSIXist就评论这件事。
振兴旧的线程,但这个相当干净的方法没有列出。
function mycommand() { ssh user@123.456.789.0 <<+ cd testdir;./test.sh "$1" + }