如何通过带有参数的 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 ,并能够传递参数给 mycommandtest.sh

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

改为这样做:

 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 就对此发表评论。

从 Bash 4.4 版开始,也可以简化为:

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

请参阅 Shell Parameter Expansion 中的 ${parameter@operator} 部分。

原文由 konsolebox 发布,翻译遵循 CC BY-SA 4.0 许可协议

我正在使用以下命令在本地计算机上执行远程命令:

 ssh -i ~/.ssh/$GIT_PRIVKEY user@$IP "bash -s" < localpath/script.sh $arg1 $arg2

原文由 muratgozel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题