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 会话,只能进单用户或救援模式修复,处理成本很高。