如何通过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的参数mycommandtest.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" + }