You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSH远程执行带选项的Shell脚本问题求助

解决SSH传递带选项参数给Shell脚本的问题

这个问题我之前踩过坑!核心原因是SSH会把你写在命令行里的选项优先当成自己的参数处理,根本没传到远程的bash脚本里,所以你的deploy.sh收不到-n和-a这些选项。下面给你几个靠谱的解决办法:

方法1:用--分隔SSH参数和脚本选项

这是最推荐的方式,--是Unix命令里的标准分隔符,用来告诉命令“后面的内容都是位置参数,不要当作选项解析”:

ssh root@$remoteHost 'bash -s' -- -n namespaceA -a appB < deploy.sh

解释:

  • bash -s让远程的bash从标准输入(也就是你本地的deploy.sh内容)读取脚本
  • --之后的-n namespaceA -a appB会被完整传递给deploy.sh作为选项参数

方法2:把脚本选项直接跟在bash -s后面(结合管道)

你也可以用管道传递脚本内容,同时把选项放在远程bash -s的后面:

cat deploy.sh | ssh root@$remoteHost 'bash -s -n namespaceA -a appB'

这里bash -s后面直接跟脚本需要的选项,因为bash会从stdin(管道过来的脚本内容)加载脚本,后面的参数自然会传给脚本。

方法3:先传脚本到远程再执行(适合重复场景)

如果你的脚本需要多次执行,或者内容比较大,也可以先把脚本传到远程机器,再直接带选项执行:

# 先上传脚本到远程临时目录
scp deploy.sh root@$remoteHost:/tmp/
# 远程执行脚本并传选项
ssh root@$remoteHost '/tmp/deploy.sh -n namespaceA -a appB'
# 执行完可以删掉远程脚本(可选)
ssh root@$remoteHost 'rm /tmp/deploy.sh'

这种方式最直观,但需要多一步文件传输。

为什么原来的命令不行?

你原来的命令:

ssh root@$remoteHost 'bash -s' < deploy.sh -n namespaceA -a appB

这里的-n和-a会被本地的SSH命令当作自己的选项解析(比如ssh -n是让SSH从/dev/null读取输入),根本不会传到远程的bash脚本里,所以deploy.sh完全看不到这些参数,自然无法正常工作。

你可以在deploy.sh开头加一行调试代码验证:

echo "Script received args: $@"

用正确的方法执行后,应该能看到输出Script received args: -n namespaceA -a appB,说明参数传递成功了。

内容的提问来源于stack exchange,提问作者George Macus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:28:11