一尘不染

如何通过带参数的ssh执行远程命令?

linux

在我的.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解析不取决于我给函数的内容。总是试图执行命令

./test.sh $1

在远程主机上。

如何正确定义mycommand,所以剧本test.sh正在改变进入目录后,在远程主机上执行testdir,具有传递给参数的能力mycommandtest.sh


阅读 1375

收藏
2020-06-03

共1个答案

一尘不染

改为这样:

function mycommand {
    ssh user@123.456.789.0 "cd testdir;./test.sh \"$1\""
}

您仍然必须将整个命令作为单个字符串传递,但是在该单个字符串中,您需要先进行$1扩展,然后再将其发送到ssh,因此您需要使用""它。

更新资料

实际上,执行此操作的另一种正确方法是使用printf %q正确引用该参数的方法。即使参数中包含空格,单引号,双引号或任何其他可能对shell具特殊含义的字符,这也将使参数的解析变得安全:

function mycommand {
    printf -v __ %q "$1"
    ssh user@123.456.789.0 "cd testdir;./test.sh $__"
}
  • 当使用声明函数时function()没有必要。
  • 不要仅仅因为您是POSIXist就对此发表评论。
2020-06-03