如何通过带参数的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
解析不取决于我给函数的内容。总是试图执行命令
./test.sh $1
在远程主机上。
如何正确定义mycommand
,所以剧本test.sh
正在改变进入目录后,在远程主机上执行testdir
,具有传递给参数的能力mycommand
来test.sh
?
回答:
改为这样:
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就对此发表评论。
以上是 如何通过带参数的ssh执行远程命令? 的全部内容, 来源链接: utcz.com/qa/434297.html