当/etc/sudoers语法错误时,sudo命令全部失效,需进GRUB单用户模式修复:按Shift/Esc调出菜单→e编辑→linux行尾加init=/bin/bash→Ctrl+X启动→mount -o remount,rw /→visudo -c定位错误→vi修正→exec /sbin/reboot -f重启验证。

当 /etc/sudoers 文件语法错误时,sudo 会直接拒绝执行任何命令(包括 sudo su 或 sudo -i),所有普通用户将无法提权——但系统仍可正常启动和登录。此时需进入单用户模式(recovery mode)修复。
进入 GRUB 单用户模式(以 Ubuntu/Debian 为例)
重启机器,在 GRUB 启动菜单出现时按 Shift(BIOS)或 Esc(UEFI)调出菜单;用方向键选中当前内核条目,按 e 编辑启动参数;找到以 linux 开头的行,在行尾空格后添加:
-
init=/bin/bash(推荐,直接启动 bash,绕过 init 系统) - 或
rd.break(RHEL/CentOS 8+) - 或
systemd.unit=rescue.target(较新 systemd 系统,需 root 密码)
编辑完按 Ctrl+X 或 F10 启动。若使用 init=/bin/bash,将直接进入 root shell,但根文件系统默认为只读。
重新挂载根分区为可写
执行以下命令(必须做,否则无法保存修复):
mount -o remount,rw /
验证是否成功:
mount | grep " / "
输出中应含 rw(而非 ro)。
修复 sudoers 文件
运行语法检查并定位错误:
visudo -c
它会提示具体行号和错误类型(如 syntax error near line 25)。常见错误包括:
- 漏掉
Defaults或用户别名后的等号(如Defaults env_reset写成Defaults env_reset没问题,但写成Defaults env_reset =就错) - 权限行末尾多加逗号、分号或引号不匹配
- 使用了未定义的别名(如
%webadmins ALL=(ALL) /usr/bin/systemctl,但没定义%webadmins)
用 vi 或 nano 编辑修复:
vi /etc/sudoers
⚠️ 务必用 visudo(而非直接 vim)编辑,因为它自带语法锁和自动备份;但单用户下 visudo 可能依赖终端环境,若报错可先用 vi 手动修正,再用 visudo -c 验证。
重启并验证
修复完成后,执行:
exec /sbin/init
或直接:
exec /sbin/reboot -f
系统重启后,用普通用户运行 sudo -l 或 sudo whoami 测试是否恢复。










