sudoers 语法错误导致全局 sudo 失效的单用户模式恢复

13次阅读

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

sudoers 语法错误导致全局 sudo 失效的单用户模式恢复

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

  • 若系统未安装 vimvisudo 可能回退到 vinano,可用 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 默认扫描范围里,得手动逐个过一遍。

text=ZqhQzanResources