sudoers语法错误会导致sudo全局失效,需通过GRUB单用户模式挂载根为读写后用visudo修复,并检查include的外部文件及权限。

sudoers 文件语法错误触发 sudo 全局失效
一旦 /etc/sudoers 文件存在语法错误(比如漏了逗号、多写了等号、用了未定义的别名),sudo 会直接拒绝所有请求,并报错 sudo: parse error in /etc/sudoers near line X。此时普通用户连 sudo su 都无法执行,常规提权路径中断——但 root 用户本身仍可登录系统,关键在于能否进入单用户模式并修复。
进入单用户模式后无法挂载根文件系统为读写
多数现代发行版(如 Ubuntu 22.04+、RHEL 8/9)默认启用只读根文件系统启动,即使进了 GRUB 单用户模式,/ 仍是只读状态,直接编辑 /etc/sudoers 会提示 Read-only file system。
- 在 GRUB 启动菜单按
e编辑启动项,在linux行末尾追加rd.break(RHEL/CentOS)或init=/bin/bash(Ubuntu/Debian) - Ubuntu 方案中,需在进入 shell 后手动执行
mount -o remount,rw /;RHEL 方案则需先switch_root切入真实根,再mount -o remount,rw /sysroot,然后chroot /sysroot - 确认可写:运行
touch /etc/test && rm /etc/test,不报错即成功
用 visudo 安全修复 sudoers 而非直接 vim 编辑
visudo 不仅调用编辑器,还会在保存前自动校验语法;而直接 vim /etc/sudoers 修改后一旦出错,重启即再次锁死。即使在单用户模式下,也应优先使用 visudo。
- 若系统未安装
vim,visudo可能回退到vi或nano,可用export EDITOR=/bin/nano显式指定 - 常见低级错误:误写
%wheel ALL=(ALL) NOPASSWD:ALL为%wheel ALL=(ALL NOPASSWD:ALL)(括号位置错)、在别名定义里漏掉Host_Alias前缀 - 修复后务必执行
visudo -c手动验证,输出sudoers file parsed OK才算真正安全
重启后 sudo 仍报错?检查 include 指令引用的外部文件
/etc/sudoers 中若有 #includedir /etc/sudoers.d 或 #include /etc/sudoers.local,这些被包含的文件同样参与语法校验。一个 /etc/sudoers.d/10-custom 里的拼写错误,也会导致全局 sudo 失效。
- 执行
sudoers -c -f /etc/sudoers.d/10-custom单独检查(注意:部分老版本用visudo -c -f) - 临时重命名可疑文件:如
mv /etc/sudoers.d/10-custom /etc/sudoers.d/10-custom.bak,再试sudo -l - 注意权限:所有
sudoers相关文件必须是root:root且权限 ≤0440,否则visudo -c会警告并拒绝加载
真正麻烦的不是进不了单用户模式,而是修完主文件却忘了 /etc/sudoers.d/ 下某个带空格或 BOM 的 UTF-8 文件也在悄悄破坏语法——这种问题不会出现在 visudo -c 默认扫描范围里,得手动逐个过一遍。










