首页/系统/Linux 运维命令速查/sudo 以其他身份执行命令

sudo 以其他身份执行命令

sudo 按 sudoers 策略授权普通用户执行特权命令:-u 切换目标用户、-l 列权限、-i 进入登录 shell;替代 root 直登的核心工具。

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

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 日志接入集中日志平台,避免本机日志被清理后无法追溯。

易错点

  • 给用户 ALL=(ALL) NOPASSWD: ALL 等于变相发放 root:免密全权,安全基线检查必然不通过;应按命令与身份最小授权
  • 直接编辑 /etc/sudoers 而不走 visudo,一处语法错误就会锁死所有 sudo 调用
  • sudo 会重置环境变量与 PATH,脚本里命令找不到时应改用绝对路径,而不是怀疑命令没装
  • sudo echo x > /root/file 不会提权:重定向由当前用户的 shell 完成,应改用 sudo tee 或 sudo sh -c
  • 命令别名里使用通配符(例如允许 /usr/bin/vi 加参数)可能被滥用拿到 root shell,授权路径要收紧到具体命令与参数

数据来源与参考

  • man 8 sudo
  • sudo 官方文档 sudoers(5)

相关工具

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