sudo 是什么
sudo 让被授权的用户以另一个身份(默认 root)执行命令,授权策略来自 /etc/sudoers 及其包含的 /etc/sudoers.d/ 目录。它替代直接登录 root 的价值有三点:权限最小化——可以只授权某几个命令而不是整个 shell;审计——每次调用都记录调用者、命令与结果;以及免共享口令——每人用自己账号即可完成特权操作。执行时需要验证调用者本人的口令,通过后有一段时间的凭证缓存,默认 5 分钟内不用重复输入。
基本信息
| 适用平台 | Linux 与 macOS(sudo 1.8/1.9);最小化容器镜像里常常没有 sudo,取而代之的是 doas 或直接以 root 运行 |
|---|---|
| 命令语法 | sudo [-u 目标用户] [-i|-s] 命令 |
| 常用选项 | -u 指定目标用户、-i 登录式 shell(重置环境、切换到家目录)、-s 以 shell 执行但不改家目录、-l 列出当前用户被授权的内容、-k 立即清除凭证缓存、-n 非交互模式(需要口令时直接失败)、-E 保留当前环境变量 |
| 配置文件 | /etc/sudoers 与 /etc/sudoers.d/ 下的片段;必须用 visudo 编辑,它会做语法检查 |
| 日志位置 | Debian/Ubuntu 写入 /var/log/auth.log,RHEL 系写入 /var/log/secure,systemd 环境下也可以 journalctl 查看 |
典型使用场景
- 日常提权:重启服务、改系统配置文件、安装软件包时使用,避免长期保持 root 会话
- 切换服务账号:sudo -u postgres psql 以应用账号执行,验证权限边界是否配置正确
- 核对授权范围:sudo -l 查看自己被授权了哪些命令,排查「为什么这条命令执行不了」
- 自动化免密:CI 与运维脚本里对特定命令配置 NOPASSWD,范围要尽可能窄
- 审计追溯:通过 auth 日志确认谁在什么时候执行了什么特权命令
- 完整环境操作:sudo -i 获得登录式 root shell,适合需要完整环境变量的排查
常用示例
常用示例
sudo systemctl restart nginx
sudo -u postgres psql -c 'select 1'
sudo -l # 查看当前用户被授权什么
sudo -i # 登录式 root shell
sudo -k # 立即失效已缓存的凭证
sudo -n true || echo '需要口令' # 非交互探测
sudo -u appuser -H /opt/app/bin/start # 指定用户并设置 HOME
sudo tee /etc/app/app.conf > /dev/null # 用 tee 写特权文件:shell 重定向本身不提权sudoers 规则要素
| 要素 | 含义 | 示例 |
|---|---|---|
| 用户或组 | % 开头表示组,ALL 表示所有人 | %ops ALL=(ALL) ALL |
| 主机 | 规则生效的主机名,便于集中分发同一份文件 | ALL 表示任意主机 |
| (目标用户:组) | 允许切换到的身份 | (ALL) 或 (root) 收紧范围 |
| 命令 | 必须写命令的绝对路径 | /usr/bin/systemctl restart nginx |
| NOPASSWD | 命令前缀,表示执行该命令免口令 | ALL=(root) NOPASSWD: /usr/bin/systemctl |
| Alias 与 Defaults | 命令别名便于管理长列表,Defaults 调整全局行为 | Defaults:%ops timestamp_timeout=2 |
sudo 默认启用 env_reset 与 secure_path,会把 PATH 重置成安全路径。脚本里出现「手动执行正常、sudo 下找不到命令」,多半是被重置的 PATH 导致的,改用绝对路径即在 sudoers 里调整 secure_path。
多条规则同时匹配时以最后一条为准,所以 /etc/sudoers.d/ 里的片段顺序会影响最终结果,阅读包含目录时要按加载顺序从后往前看。凭证缓存时间由 timestamp_timeout 控制,设为 0 表示每次都要输口令,设为负值则永不过期。
编辑 sudoers 必须用 visudo:写错语法会让所有用户都用不了 sudo。如果真被锁在外面,可以尝试 pkexec(依赖 polkit)或进入单用户模式修复。配置文件写完后用 visudo -c 校验语法是成本最低的自保。
sudo 与 su 的区别:su 需要知道目标账号的口令并直接获得一个完整 shell,权限粒度粗、难以追责;sudo 验证的是调用者自己的口令,按命令授权,每次调用单独记录日志。生产环境的常见做法是禁止 root 直接登录(sshd_config 里设 PermitRootLogin no),给运维账号配置 sudo 规则,并把 sudo 日志接入集中日志平台,避免本机日志被清理后无法追溯。