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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:45:32