新手求助:编写Shell脚本为用户授予sudo权限并加入sudoers文件
完善Shell脚本:添加用户并授予sudo权限
嘿,作为编程新手你已经迈出了不错的第一步!不过你的脚本里有几个小问题需要修正,而且还缺少授予sudo权限的核心逻辑,我来帮你完善它,同时让脚本更安全、兼容更多Linux发行版。
首先先指出原脚本里的小坑:
- 循环里你用了
$user变量,但实际循环的变量是$rootUser,这会导致useradd和passwd命令出错; - 硬编码密码
s0m3Pw0rdz!非常不安全,生产环境绝对不能这么做,最好改成交互式让用户输入; - 没有检查用户是否已经存在,重复执行会报错;
- 没有处理权限问题,普通用户运行脚本会失败。
接下来是完善后的完整脚本,每一步都加了注释,方便你理解:
完整脚本
#!/bin/bash # 先检查是否以root身份运行,没权限直接退出 if [[ $EUID -ne 0 ]]; then echo "⚠️ 这个脚本必须以root身份运行!" exit 1 fi # 接收传入的用户列表参数(比如运行时传:./script.sh "alice,bob,charlie") ROOT_USERS="$1" # 检查用户有没有传参数,没传就提示用法 if [[ -z "$ROOT_USERS" ]]; then echo "❌ 用法错误!请这样运行:$0 <逗号分隔的用户名>" echo "示例:$0 alice,bob,dave" exit 1 fi # 把逗号分隔的字符串转换成数组 rootUsers=(${ROOT_USERS//,/ }) # 遍历每个用户处理 for rootUser in "${rootUsers[@]}"; do echo "🔧 正在处理用户:$rootUser" # 先检查用户是否已经存在,避免重复创建 if id "$rootUser" &>/dev/null; then echo "ℹ️ 用户$rootUser已经存在,跳过创建步骤" else # 创建用户 useradd "$rootUser" # 交互式设置密码,比硬编码安全太多 echo "请为$rootUser设置密码:" passwd "$rootUser" fi # 授予sudo权限,兼容主流Linux发行版 if grep -q "^sudo:" /etc/group; then # Debian/Ubuntu系:添加到sudo组 usermod -aG sudo "$rootUser" echo "✅ 已将$rootUser添加到sudo组(Debian/Ubuntu风格)" elif grep -q "^wheel:" /etc/group; then # RHEL/CentOS/Rocky系:添加到wheel组 usermod -aG wheel "$rootUser" # 确保wheel组的sudo权限是开启的(有些系统默认注释了) sed -i '/^# %wheel ALL=(ALL) ALL/s/^# //' /etc/sudoers echo "✅ 已将$rootUser添加到wheel组并开启sudo权限(RHEL/CentOS风格)" else # 如果没有上述组,用sudoers.d目录创建独立配置文件(比直接改sudoers安全) echo "$rootUser ALL=(ALL) ALL" > "/etc/sudoers.d/$rootUser" # 必须设置正确的权限,否则sudo会拒绝加载 chmod 0440 "/etc/sudoers.d/$rootUser" echo "✅ 已为$rootUser创建独立sudo配置文件" fi done echo "🎉 所有操作都完成啦!"
关键改进说明
- 权限校验:脚本开头强制检查root身份,避免普通用户运行时一堆权限错误;
- 参数校验:检查用户是否传入了用户名列表,避免无意义的执行;
- 用户存在性检查:防止重复创建用户导致的报错;
- 安全的密码设置:去掉硬编码密码,改为交互式输入,大大提升安全性;
- 跨发行版兼容:自动识别系统的sudo管理组(sudo或wheel),适配绝大多数Linux系统;
- 安全的sudo配置:优先用用户组的方式,其次用
sudoers.d目录的独立文件——永远不要直接编辑/etc/sudoers主文件,除非用visudo命令(它会做语法检查,避免你锁死自己的sudo权限); - 友好提示:添加了清晰的提示信息,新手也能看懂运行状态。
使用方法
- 把脚本保存为
add-sudo-users.sh; - 给脚本加执行权限:
chmod +x add-sudo-users.sh; - 以root身份运行,传入用户名列表:
./add-sudo-users.sh "alice,bob,dave"
额外注意事项
- 如果是生产环境,建议不要给用户
ALL=(ALL) ALL的全权限,而是限制他们只能执行特定命令,比如$rootUser ALL=(ALL) /usr/bin/apt,/usr/bin/systemctl; - 用
sudoers.d创建的文件,文件名不要包含.,否则可能被忽略; - 每次修改sudo配置后,可以用
sudo -l -U $rootUser检查用户的sudo权限是否生效。
内容的提问来源于stack exchange,提问作者user8185098
相关产品推荐
相关产品推荐

