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

新手求助:编写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权限);
  • 友好提示:添加了清晰的提示信息,新手也能看懂运行状态。

使用方法

  1. 把脚本保存为add-sudo-users.sh;
  2. 给脚本加执行权限:chmod +x add-sudo-users.sh;
  3. 以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:36:15