sudoers 文件权限必须为 0440,否则 sudo 硬性拒绝加载;应始终使用 sudo visudo 编辑,避免手动修改导致失效;推荐通过组机制(如 %adminstaff)而非直接写用户名赋权;nopasswd 需严格限制命令范围,禁用通配符;sudo -l 为空需检查组继承、defaults 规则及会话上下文。

sudoers 文件权限必须是 0440,否则直接拒绝加载
修改 /etc/sudoers 后 sudo 报错 sudo: /etc/sudoers is mode 0644, should be 0440 是最常见卡点。这不是警告,是硬性拒绝——哪怕只多一个写权限,sudo 就会彻底失效,连 root 都无法绕过。
- 永远用
sudo visudo编辑,它会在保存前自动校验语法和权限 - 如果手动改坏了,且当前用户已无 sudo 权限:需重启进 recovery mode 或用 live USB 挂载根分区修复
- 临时救急(不推荐):
pkexec chmod 0440 /etc/sudoers(前提是系统装了 polkit 且你有 GUI 登录权限)
给普通用户加 sudo 权限,别直接改 user 行,用 %group 更安全
直接在 /etc/sudoers 里写 username ALL=(ALL:ALL) ALL 虽然能用,但维护成本高、易遗漏、难审计。真实运维中几乎都走组机制。
- 先建专用组:
sudo groupadd adminstaff - 把用户加进去:
sudo usermod -aG adminstaff username - 在 sudoers 里加一行:
%adminstaff ALL=(ALL:ALL) ALL - 注意
%符号不能漏——没它就是匹配用户名,不是组名
NOPASSWD 不等于无限制,慎用 ALL 和 shell 逃逸
写成 %adminstaff ALL=(ALL) NOPASSWD: ALL 看似方便,实则等于开放 root shell。任何能写入临时文件或控制环境变量的程序(比如 git、man、less)都可能被用来提权。
- 最小权限原则:只放开真正需要的命令,例如
%adminstaff ALL=(root) NOPASSWD: /bin/systemctl restart nginx - 避免通配符:
/usr/bin/*或/home/*/script.sh极易被利用 - 如果必须 NOPASSWD,至少加
NOEXEC(需编译时启用)或限制env_reset和setenv
sudo -l 显示为空?检查 Defaults 配置和用户组继承
用户执行 sudo -l 却看不到任何允许命令,不一定是没配,很可能是被 Defaults 规则压制了,或者组没生效。
- 运行
id -nG确认用户当前会话是否已加载新组(刚加组需重新登录或newgrp adminstaff) -
sudo -l默认只显示当前用户匹配的规则;若用了Defaults:user_name这类精确限定,其他用户看不到 - 检查是否有
Defaults !visiblepw或Defaults env_reset导致部分上下文丢失,影响规则匹配
/bin/rbash)、PAM session 模块拦截,这些都不会报 sudoers 错误,但会让规则静默失效。










