
用 Cmnd_Alias 定义标准化运维指令,核心是把一类安全可控的命令聚合成一个可复用、易审计、好维护的逻辑名称,而不是在每条授权规则里重复写路径和参数。
必须用绝对路径,且命名全大写
sudoers 不识别相对路径或命令别名(如 systemctl),所有命令必须写完整路径,例如 /usr/bin/systemctl 而不是 systemctl。别名名称只能含大写字母和下划线,比如 Cmnd_Alias DEPLOY_CMD —— 写成 deploy_cmd 或 DeployCmd 都会导致 visudo -c 报错。
按功能归类,支持通配符和排除
可以把同一类操作归入一个别名,提升可读性和一致性:
Cmnd_Alias BACKUP = /usr/bin/rsync, /usr/bin/tar, /bin/gzip-
Cmnd_Alias LOG_CLEAN = /usr/local/bin/clean-logs.sh(建议封装为固定路径的 wrapper 脚本) -
Cmnd_Alias NGINX_CTL = /usr/bin/systemctl reload nginx, /usr/bin/systemctl restart nginx, !/usr/bin/systemctl stop nginx(!排除特定子命令,注意拒绝规则要放在允许项之后)
通配符只作用于文件名层级,/usr/bin/rsync* 合法,但 /usr/*/rsync 不合法;也不能用 shell 特性(如 |、;、$HOME)。
授权时直接引用,参数必须显式写出
定义完别名后,在用户规则中直接使用即可,无需展开:
deployer ALL=(root) NOPASSWD: DEPLOY_CMD%ops ALL=(root) LOG_CLEAN, NGINX_CTL
注意:/usr/bin/systemctl * nginx 是非法写法,sudo 不解析 shell 风格通配;若需灵活参数,应通过 wrapper 脚本控制输入范围,再把该脚本路径加入别名。
拆分配置到 /etc/sudoers.d/ 目录
避免直接修改主文件 /etc/sudoers,推荐把 Cmnd_Alias 和对应授权规则单独存为 /etc/sudoers.d/deploy-alias 等文件。这样:
- 多人协作时 Git diff 更清晰
- 上线/回滚只需增删文件,不碰主配置
- visudo 加载更快(不用每次解析全部注释和默认规则)
记得用 visudo -c 校验语法,确认无误后再保存。











