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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:41:17