sed无法读取环境变量$HOSTNAME,sudoers脚本更新失败求助
问题:脚本更新sudoers文件时$HOSTNAME环境变量无法正常替换
预期效果
需在sudoers文件中添加以下两行配置,其中MYHOST为环境变量$HOSTNAME的实际值:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %MYHOST-localadmin@mydomain.net ALL=(ALL:ALL) ALL
已尝试的命令及错误结果
以下是多次使用sed命令的尝试及对应的输出:
尝试1
sed -i "/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL ""%"${HOSTNAME}"-localadmin@mydomain.net ALL=(ALL:ALL) ALL" /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试2
sed -i "/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %${HOSTNAME}-localadmin@mydomain.net ALL=(ALL:ALL) ALL" /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试3
sed -i "/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %"${HOSTNAME}"-localadmin@mydomain.net ALL=(ALL:ALL) ALL" /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试4
sed -i "/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %'${HOSTNAME}'-localadmin@mydomain.net ALL=(ALL:ALL) ALL" /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %''-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试5
sed -i "/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %'$HOSTNAME'-localadmin@mydomain.net ALL=(ALL:ALL) ALL" /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %''-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试6
sed -i "/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %"$HOSTNAME"-localadmin@mydomain.net ALL=(ALL:ALL) ALL" /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试7
sed -i '/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL '"%{$HOSTNAME}"'-localadmin@mydomain.net ALL=(ALL:ALL) ALL' /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %{}-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试8
sed -i '/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %'"$HOSTNAME"'-localadmin@mydomain.net ALL=(ALL:ALL) ALL' /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %-localadmin@mydomain.net ALL=(ALL:ALL) ALL
尝试9
sed -i "/#My Customization.*/a%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %""${HOSTNAME}""-localadmin@mydomain.net ALL=(ALL:ALL) ALL" /tmp/sudoers.bak1
输出:
%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL %-localadmin@mydomain.net ALL=(ALL:ALL) ALL
解决方法
问题核心是shell变量替换时机与sed引号语法冲突,同时需先确认$HOSTNAME变量是否有有效值(可执行echo $HOSTNAME检查)。以下是两种可靠的解决方式:
方式1:用printf构造内容再传入sed
先让shell解析变量生成完整内容,再通过管道传给sed追加:
printf "%s\n%s\n" "%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL" "%${HOSTNAME}-localadmin@mydomain.net ALL=(ALL:ALL) ALL" | sed -i '/#My Customization.*/r /dev/stdin' /tmp/sudoers.bak1
方式2:拆分sed命令参数
用-e参数将两个追加命令分开,确保变量被正确解析:
sed -i \ -e "/#My Customization.*/a\%mydomain-localadmin@mydomain.net ALL=(ALL:ALL) ALL" \ -e "/#My Customization.*/a\%${HOSTNAME}-localadmin@mydomain.net ALL=(ALL:ALL) ALL" \ /tmp/sudoers.bak1
内容的提问来源于stack exchange,提问作者shanester
相关产品推荐
相关产品推荐

