首页/系统/Linux 运维命令速查/visudo 安全编辑 sudoers

visudo 安全编辑 sudoers

visudo 带语法检查地编辑 sudoers 配置:保存时校验,拒绝写入错误语法,避免一次手滑让全机失去 sudo。

Linux 运维命令速查系统更新于 2026-10-13

visudo 是什么

visudo 是编辑 sudo 授权配置的专用入口,目标是 /etc/sudoers 以及 /etc/sudoers.d/ 下的片段文件。它做两件普通编辑器做不到的事:编辑期间给文件加锁,避免两人同时改互相覆盖;保存时先做语法解析,语法有错就拒绝落盘并指出出错行。这条保护非常必要——sudoers 一旦语法错误,sudo 会对所有人失效,除 root 之外的提权路径会整体断开。

基本信息

用途安全地编辑 sudoers 主文件与 /etc/sudoers.d/ 片段
语法visudo [-f 文件] [-c 校验] [-s 严格检查]
所属软件包sudo(各发行版默认安装)
权限要求只有 root 或已获授权者可运行;普通用户连文件都读不到

典型使用场景

  • 给运维人员开提权:按人写规则,而不是把账号加进 wheel 组给全权
  • 只放开单条命令:允许部署账号免密重启指定服务,其它命令一律不给
  • 批量授权:用 %组名 授权整个组,人员变动时只调组成员
  • 免交互执行:CI/自动化脚本需要 NOPASSWD 时精准限定命令与参数
  • 改完立刻校验:每次修改后跑 visudo -c 确认所有 sudoers 文件语法无误

常用写法

常用写法
visudo -f /etc/sudoers.d/deploy     # 编辑片段文件,比改主文件安全
# 片段文件内容示例:
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp
%developers ALL=(ALL) /usr/bin/less /var/log/app/*.log
Defaults env_keep += "http_proxy https_proxy"
Cmnd_Alias SVC = /bin/systemctl restart myapp, /bin/systemctl status myapp

语法校验与权限验证

语法校验与权限验证
visudo -c                          # 校验全部 sudoers 文件(改完后必做)
visudo -cf /etc/sudoers.d/deploy   # 只校验单个文件
grep -rn deploy /etc/sudoers /etc/sudoers.d/   # 盘点配置位置
sudo -l -U deploy                  # 列出该用户实际生效的授权(需 root)
sudo -n -l                         # 以当前用户视角看权限,-n 不提示密码

常见规则写法

写法含义注意
用户 ALL=(ALL) ALL任意主机以任意用户执行任意命令,需输密码范围过大,优先给具体命令
NOPASSWD: 命令免密执行该命令命令路径要写绝对路径,否则不匹配
%组名 ALL=(ALL) ...按组授权组名前的百分号不能少
Cmnd_Alias 别名 = 命令列表把多条命令打包复用别名名用大写,便于与主机名区分
Defaults 项目设置全局或用户级默认行为Defaults:用户名 只对该用户生效
主文件里那行 includedir 指令以井号开头但不是注释,是语法要求:它负责加载 /etc/sudoers.d/ 目录。清理配置时把这一行误删,所有片段会同时失效。
不要用普通编辑器直接改 /etc/sudoers。语法错误后 sudo 会拒绝服务,此时若还没有可用的 root 会话,只能进单用户或救援模式修复,处理成本很高。

易错点

  • /etc/sudoers.d/ 下的文件权限不满足 0440 时会被 sudo 忽略,规则不生效却没有任何报错,排查先看权限
  • 片段文件名里含点号(例如 deploy.conf)会被跳过,文件名只用字母数字与下划线最稳,也别用 ~ 结尾的备份名
  • NOPASSWD 限定命令时用通配符要谨慎:像 /bin/systemctl restart * 这类写法会连带放开参数,等于给了一半的 root
  • 改完不校验不看生效结果:visudo -c 加 sudo -l -U 用户名 两步做完,才算确认授权正确

数据来源与参考

  • man 8 visudo
  • sudoers(5) man

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌