首页/系统/Linux 运维命令速查/sudoers 语法深潜:别名与 NOPASSWD

sudoers 语法深潜:别名与 NOPASSWD

sudoers 支持 User_Alias/Host_Alias/Cmnd_Alias 组织策略:按角色授权、按命令白名单最小化;NOPASSWD 只给自动化账号。

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

sudoers 是什么

sudoers 是 sudo 的策略文件,一条规则由四段构成:谁(用户或别名)在哪些主机上、以什么身份(Runas)、可以执行哪些命令。它支持 User_Alias、Host_Alias、Cmnd_Alias、Runas_Alias 四类别名,把「角色」和「命令集合」从具体规则里抽出来,多人多机环境下才维护得动。文件必须用 visudo 编辑:它会先做语法检查再原子替换,避免把 sudo 锁死。

基本信息

适用平台Linux/Unix(sudo 包)
规则格式用户 主机=(目标用户:目标组) 命令
四类别名User_Alias、Host_Alias、Cmnd_Alias、Runas_Alias
关键字段NOPASSWD 免密、! 取反、Defaults 默认项、%组名 表示用户组
推荐组织主文件只保留 Defaults 与 include,规则拆到 /etc/sudoers.d/ 下按团队或服务分文件
权限要求文件属主 root、权限 0440;目录 /etc/sudoers.d 通常 0750

典型使用场景

  • 最小权限运维:只放行 restart、status 这类具体子命令,而不是整个 systemctl
  • 按角色授权:用 User_Alias 把同一职责的人分组,规则只写一次
  • 自动化免密:只给服务账号需要的少数命令配 NOPASSWD
  • 禁止危险操作:用取反排除 shell 入口、编辑器与包管理命令
  • 多机一致:把同一份 sudoers.d 文件分发到一批机器

企业常用范式

企业常用范式
User_Alias  DEVOPS = alice, bob
Cmnd_Alias  SVC    = /usr/bin/systemctl restart app*, /usr/bin/systemctl status app*
Cmnd_Alias  BACKUP = /opt/scripts/backup.sh

DEVOPS  ALL=(root) NOPASSWD: SVC          # 自动化与值守常用免密
DEVOPS  ALL=(root) BACKUP                 # 默认仍要求输入密码
# 取反:先放行再排除更危险的形态
# DEVOPS  ALL=(root) BACKUP, !/opt/scripts/backup.sh --purge

Defaults:DEVOPS !requiretty               # 允许无 tty 的自动化执行

校验与查看

校验与查看
sudo visudo -c                    # 全量语法检查,改前改后都跑
sudo visudo -cf /etc/sudoers.d/app   # 只校验某个片段
sudo -l -U alice                  # 查看 alice 被授予的权限
sudo -l                           # 查看当前用户的实际权限与生效来源

别名与写法读法

元素作用注意
User_Alias把一批用户命名别名名用大写,避免与用户名混淆
Cmnd_Alias把一批命令命名命令必须写绝对路径,相对路径不生效
Runas_Alias把可选身份命名用于切换到非 root 的特定账号
Defaults全局或按用户的行为开关如 !requiretty、secure_path、logfile
%组名按用户组授权组成员变化自动跟随
! 取反在放行后排除特例位置与顺序会影响最终匹配结果
@includedir包含整个目录用于拆分到 sudoers.d
命令通配符可以被参数绕开:授权 /bin/sh、/usr/bin/vi、/usr/bin/systemctl 这类「能执行任意命令」的入口等于授了全权。凡是允许带参数执行的二进制都要显式排除,或用 !/usr/bin/sh -c 之类的取反规则收紧。
把规则拆进 /etc/sudoers.d/ 每个团队或服务一个文件,便于审计与回滚;文件属主 root、权限 0440,文件名不要带点号与波浪号,否则会被忽略。改完用 sudo -l -U 用户名 验证实际生效结果,而不是只读文件。

易错点

  • 用 sed 或重定向直接改 sudoers 是高危动作:语法错误会让所有人失去 sudo,永远走 visudo
  • 通配符授权带参数的命令要防参数注入,授权脚本类命令等于授权脚本里的全部内容
  • Cmnd_Alias 里的命令必须写绝对路径,写相对路径时规则静默不匹配
  • sudoers.d 下文件名含点号或以 ~ 结尾会被忽略,权限不是 0440 也可能被拒绝加载
  • NOPASSWD 只应给自动化账号与必须值守的命令,给人配免密等于放弃了最后一道确认

数据来源与参考

  • man 5 sudoers
  • man 8 visudo
  • sudo 官方文档:sudoers 手册

相关工具

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