sudoers语法错误会导致sudo完全失效,须按四步顺序排查:先用sudo -n true定位报错文件及行号;再用visudo -c逐个校验主文件和.d目录下各文件;接着验证用户组、命令路径及#include顺序是否匹配;最后查/var/log/auth.log日志确认真实拒绝原因。

sudoers 语法错误会导致 sudo 完全失效,连 sudo -l 都报错退出。排查必须按顺序推进,不能跳步,否则容易误判或反复锁死。
第一步:用 sudo -n true 快速触发并定位错误源
该命令不执行操作、不提示输密码,只做权限校验和配置解析。失败时会直接打印出错文件和行号,例如:
sudo: parse error in /etc/sudoers.d/01-deploy near line 7-
sudo: no valid sudoers sources found, quitting(说明主文件或首个被加载的 .d 文件就崩了)
如果报错指向 /etc/sudoers.d/xxx,说明问题不在主文件;若只提 /etc/sudoers,则优先检查它。
第二步:用 visudo -c 逐个验证配置文件
切勿用 vim 直接改,必须用 visudo 自带的语法检查能力:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 检查主配置:
sudo visudo -c - 检查某个 .d 文件:
sudo visudo -f /etc/sudoers.d/10-custom - 检查全部 .d 文件:
for f in /etc/sudoers.d/*; do [[ -f "$f" ]] && echo "== $f ==" && sudo visudo -f "$f" 2>&1; done
注意:.d 目录下文件名不能含点(如 nginx.conf 可能被忽略),权限必须是 0440,且文件内不能单独写 Defaults 行(需在主文件中定义)。
第三步:确认规则是否被正确加载和匹配
语法正确 ≠ 权限生效。还需验证上下文是否满足:
- 运行
id -nG确认用户当前所属组,比如加了%sudo却没登出重登录,组信息不会自动更新 - 执行
sudo -l查看实际解析出的权限列表,空输出或报no matches表示规则未命中 - 检查命令路径是否完全一致:规则里写
/usr/bin/systemctl,但你运行的是systemctl(依赖 PATH),就会不匹配 - 留意
#includedir /etc/sudoers.d是否写在主文件靠前位置——它之后的规则可能被覆盖
第四步:查日志确认真实拒绝原因
报错信息有时模糊,/var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)才是最终依据:
- 执行失败后立即运行:
sudo grep 'sudo' /var/log/auth.log | tail -5 - 重点找关键词:
NOT in sudoers(用户不在授权名单)、match error(规则匹配失败)、no tty present(requiretty 导致远程脚本失败) - 若看到
unable to initialize policy plugin,基本可断定是语法错误尚未修复










