通过变量传递参数调用ipa host-mod命令失败的问题排查
问题
在处理subiquity自动部署中忽略ssh_deletekeys的问题时,需要更新FreeIPA服务器上的三个SSH主机公钥——这些密钥会在主机安装注册后的首次启动时重新生成,导致SSH连接问题。尝试了以下步骤:
- 执行命令获取格式化后的密钥参数:
user@jose-haverly:~$ HostKeys=$(cat /etc/ssh/ssh_host_*_key.pub | awk 'PRE="--sshpubkey=" {print PRE "\""$0"\""}' | xargs -d$'\n')
- 调用
ipa host-mod命令:
user@jose-haverly:~$ ipa host-mod $HostKeys $(hostname -f)
此时收到报错:ipa: ERROR: command 'host_mod' takes at most 1 argument
但执行echo "ipa host-mod $HostKeys $(hostname -f)"输出的完整命令,直接复制粘贴运行时,仅提示ipa: ERROR: no modifications to be performed,说明命令格式本身正确。想请教为何通过变量或命令替换传递参数会导致ipa host-mod命令失败?
原因与解决方法
根本原因
问题出在变量展开时的引号处理逻辑:
- 你通过
awk给每个--sshpubkey参数添加了双引号,但直接用$HostKeys展开变量时,Shell会把引号当成普通字符串字符,而非参数边界的界定符。 - 这导致原本应该是多个独立的
--sshpubkey="xxx"参数,被Shell错误合并成一个超大参数,最终ipa host-mod只识别到这一个参数加主机名,触发了"最多1个参数"的错误。
解决办法
改用Shell数组存储参数,数组能正确保留每个参数的边界:
- 用循环生成参数数组:
HostKeys=() while IFS= read -r line; do HostKeys+=("--sshpubkey=\"$line\"") done < <(cat /etc/ssh/ssh_host_*_key.pub)
- 调用命令时用数组展开语法:
ipa host-mod "${HostKeys[@]}" $(hostname -f)
或者更简洁的mapfile写法:
mapfile -t HostKeys < <(cat /etc/ssh/ssh_host_*_key.pub | awk '{print "--sshpubkey=\""$0"\""}') ipa host-mod "${HostKeys[@]}" $(hostname -f)
补充说明
用echo输出命令时,变量展开后的引号会被终端重新解析,当作参数分隔符,所以复制粘贴能正常执行;但直接变量展开时,Shell不会二次解析引号,只会按空格分割参数,这就是两种执行方式的核心差异。
内容的提问来源于stack exchange,提问作者dmgeurts
相关产品推荐
相关产品推荐

