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

如何将SSH命令选项存入变量以实现条件化调用?

如何正确将SSH选项存入变量复用

你遇到的问题是用单个字符串变量存储SSH选项时,Bash无法正确解析这些选项——因为变量展开后,你添加的额外引号会被当作参数的一部分,而非语法符号。比如你定义o2='"NumberOfPasswordPrompts=1"',执行时会把"NumberOfPasswordPrompts=1"(带引号)作为完整参数传给-o,这不符合SSH的预期格式。

正确方案:用Bash数组存储SSH选项

Bash数组能完美处理多参数场景,每个-o对应的选项作为数组的一个独立元素,展开时会被正确解析为命令行参数。

示例代码

# 初始化空数组用于存储SSH选项
ssh_options=()

# 根据需求动态添加选项
ssh_options+=("-o" "NumberOfPasswordPrompts=1")
ssh_options+=("-o" "ConnectTimeout=100")
# 可根据条件追加更多选项,比如:
# if [ "$some_condition" = "true" ]; then
#     ssh_options+=("-o" "StrictHostKeyChecking=no")
# fi

# 执行SSH命令时展开数组
x=$(sshpass -p "$psw" ssh -q "${ssh_options[@]}" 2>/dev/null "$usr@$srv" <<ZZZ
     ### some command e.g.:
     sudo -u oracle -i
     export LANG=en_US.UTF-8
     ORACLE_HOME=$home
     export ORACLE_HOME   # export ORACLE_BASE ORACLE_HOME
     PATH=\$ORACLE_HOME/bin:\$PATH
     \$ORACLE_HOME/OPatch/opatch lsinv
ZZZ
)

方案原理

${ssh_options[@]}展开数组时,每个元素会被当作独立的命令行参数,正好匹配SSH -o 选项值的参数结构。不需要在选项中添加额外引号,Bash会自动处理参数分隔,避免把引号当作参数内容。

原写法失败的原因

你之前定义的变量包含多余的双引号,比如o2='"NumberOfPasswordPrompts=1"',Bash会把带引号的字符串完整传给-o,SSH会尝试解析这个带引号的字符串作为选项名,自然无法识别。而直接写-o "NumberOfPasswordPrompts=1"时,Bash会去掉引号,只将NumberOfPasswordPrompts=1传给-o,这才是正确的格式。

关于eval的提醒

如果你之前尝试用eval仍未成功,大概率是引号处理不当导致的。此外eval会重新解析命令字符串,若变量包含特殊字符(比如密码里的符号),容易引发安全风险或解析错误,因此优先使用数组方案,避免使用eval。

内容的提问来源于stack exchange,提问作者László Szilágyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:32:08