必须用 visudo 编辑 /etc/sudoers,因其编辑前锁定文件、保存时强制语法校验并拒绝写入错误配置,避免sudo全局失效;推荐通过/etc/sudoers.d/分离管理,且所有文件权限须为0440。

在 Linux 系统中,必须用 visudo 编辑 /etc/sudoers 文件,不能直接用 vim、nano 或其他编辑器打开修改。这是因为该文件控制整个系统的提权逻辑,语法出错会导致 sudo 完全失效,甚至无法恢复,除非进单用户模式或用 Live CD 修复。
为什么要坚持用 visudo 而不是直接编辑
visudo 不是普通编辑器包装,它做了三件关键事:
- 编辑前自动锁定 /etc/sudoers,防止多人同时修改引发冲突
- 保存时强制执行语法校验(sudoers 格式非常严格,空格、冒号、括号都可能报错)
- 校验失败时拒绝写入,保留原配置,避免系统“锁死”
基本操作流程
执行以下命令启动安全编辑:
sudo visudo
系统会用默认编辑器(Ubuntu 默认 nano,CentOS/RHEL 默认 vi)打开文件。编辑完成后,按对应编辑器的保存退出方式(如 nano 是 Ctrl+O → Enter → Ctrl+X;vi 是 :wq)。visudo 会在真正写入前自动检查语法。
如果不确定当前配置是否合法,可先运行:
sudo visudo -c
输出 sudo: parsed OK 表示语法无误;若提示某行错误,需返回修正。
推荐的配置方式:用 /etc/sudoers.d/ 分离管理
不建议直接在 /etc/sudoers 主文件里加规则,容易污染默认配置。更稳妥的做法是:
- 在
/etc/sudoers.d/目录下新建独立文件(如/etc/sudoers.d/myuser) - 用 visudo 指定编辑该文件:
sudo visudo -f /etc/sudoers.d/myuser - 内容示例(允许 user1 免密执行所有命令):
user1 ALL=(ALL) NOPASSWD: ALL - 确保该文件权限为 0440:
sudo chmod 0440 /etc/sudoers.d/myuser
常见错误与避坑提醒
这些细节看似小,但极易引发问题:
- 所有路径必须写绝对路径,比如
NOPASSWD: /usr/bin/systemctl restart nginx,不能只写systemctl - 不要在规则末尾加中文标点、多余空格或注释符号 # 后没空格
- 修改前建议备份:
sudo cp /etc/sudoers /etc/sudoers.bak - 如果当前用户没有 sudo 权限,需先切到 root:
su -,再运行visudo











