不能,因为 visudo 依赖 sudoers 语法检查器,即使 root 身份运行也会读取并校验已损坏的 /etc/sudoers,语法错误(如多 Defaults、漏引号)导致其拒绝启动。

visudo 保存失败后 sudo 不可用,还能用 su -c visudo 吗?
不能直接用 su -c visudo 恢复——因为 visudo 本身依赖 sudo 的配置去校验语法,而保存失败通常意味着 /etc/sudoers 文件已损坏或语法错误。此时 visudo 会拒绝启动,哪怕你用 su 切换到 root,它仍会读取并校验当前损坏的 /etc/sudoers,然后报错退出。
为什么 su -c 'visudo' 会失败?
visudo 不是普通编辑器,它会在写入前调用 sudoers 语法检查器(sudoers_parse)。只要 /etc/sudoers 存在语法错误(比如多了一个 Defaults、漏了引号、路径含空格未转义),visudo 就会拒绝保存,也不允许你进入编辑状态——哪怕你是 root。
- 常见错误现象:
visudo: >>> /etc/sudoers: syntax error near line 23 ,接着直接退出 -
su -c visudo和sudo visudo在语法校验环节行为一致,只是执行身份不同 - 即使你用
su -登录 root shell,再手动运行visudo,结果一样
真正能恢复的方法:绕过 visudo,直接编辑 /etc/sudoers
必须放弃 visudo,改用基础编辑器(如 vi、sed 或 cp)修复文件。前提是 root 密码可用,且系统未禁用 su。
- 先用
su -切到 root(输入 root 密码) - 备份当前损坏文件:
cp /etc/sudoers /etc/sudoers.broken - 用
vi /etc/sudoers手动删掉最后几行可疑修改,或还原到上一版(如果有/etc/sudoers.d/下的片段,也检查是否误删了关键行) - 最保险做法:用默认最小配置覆盖(仅保留必要行):
root ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL
(注意:发行版不同,组名可能是sudo或admin) - 编辑完后,用
visudo -c手动验证语法:visudo -c—— 这步不打开编辑器,只做检查
如果连 su 都被禁用或 root 密码忘了怎么办?
只能进单用户模式或 recovery 模式。Ubuntu/Debian 系统在 GRUB 启动时按 Shift,CentOS/RHEL 按 e 编辑内核参数,在 linux 行末尾加 rd.break(RHEL8+)或 init=/bin/bash(旧版),然后 remount /sysroot 为可写,chroot /sysroot,再编辑 /etc/sudoers。
这个路径没有快捷方式,每一步都得手敲;而且 visudo 在 recovery 下依然会校验失败,所以还是得用 vi 或 echo 直接写。
最容易被忽略的一点:很多教程说「用 pkexec visudo」,但 pkexec 本身也依赖 sudoers 配置里的策略,一旦主文件崩了,它大概率也失效——别指望图形环境下的替代命令能救场。










