跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

visudo 保存失败导致 sudo 失效的 su -c visudo 恢复

不能,因为 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
配置里的策略,一旦主文件崩了,它大概率也失效——别指望图形环境下的替代命令能救场。

相关文章