如何通过SSH动态传递参数至远程Shell脚本并处理含空格值
解决SSH传递带空格参数及远程脚本动态加载参数问题
问题1:处理含空格的参数传递
你的本地脚本中,SSH命令的参数顺序需要调整,才能确保带空格的参数不被错误拆分。修改后的SSH命令如下:
ssh -o StrictHostKeyChecking=no myuser@server_ip "/bin/bash -s" "${params[@]}" < deploy_script.sh
原理:
"${params[@]}"会将数组中的每个元素作为独立参数传递给SSH,完整保留参数内的空格和特殊字符。- 远程的
/bin/bash -s会接收这些参数,并将它们作为脚本的位置参数($1、$2...),避免被远程shell错误拆分。
你本地构建params数组的逻辑是正确的,用双引号包裹变量(如"$MASTER")确保了含空格的值被作为单个数组元素处理。
问题2:远程脚本动态加载参数
修改远程的deploy_script.sh,提取固定参数后,将剩余的动态参数直接传递给可执行文件:
#!/bin/bash set -e # 提取固定的前4个参数 AR_MASTER="$1" AR_NAME="$2" AR_QUEUE="$3" AR_SER_EN="$4" # 移除已处理的前4个参数,剩余的就是动态生成的--conf参数 shift 4 main() { my-executable \ "--master" "$AR_MASTER" \ "--name" "$AR_NAME" \ "--queue" "$AR_QUEUE" \ "--conf" "service.enabled=$AR_SER_EN" \ "$@" # 传递剩余的所有动态参数 } main "$@"
关键说明:
shift 4会把位置参数列表向左移动4位,原来的$5及之后的参数变成新的$1、$2,此时"$@"就代表所有动态生成的--conf参数。- 参数写法采用
"--master" "$AR_MASTER"而非"--master $AR_MASTER",确保当AR_MASTER含空格时,会被解析成两个独立参数(选项和对应值),符合可执行文件的参数格式要求。
这样不管你在本地添加多少动态--conf参数,远程脚本都会自动接收并传递给my-executable。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

