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

