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
相关产品推荐
相关产品推荐

