什么是 sudo

sudo(superuser do)用于以 超级用户(root)或其他用户 的权限执行命令。
它比直接 su 切换到 root 更安全,因为能精准授权、记录日志,并只在需要时提升权限。


sudo 的工作原理与密码规则

  • 默认行为:执行 sudo <cmd> 时,系统会检查 /etc/sudoers(或 /etc/sudoers.d/*)判断当前用户是否有权限。
  • 密码:默认要求输入 当前登录用户的密码(不是 root 密码)。
  • 时间缓存:验证通过后会缓存(默认 5 分钟),在此期间再次执行 sudo 无需重复输入密码。
    可用 sudo -ksudo -K 强制失效。
  • 切换登录环境:
    • sudo -i 模拟登录 shell(会加载目标用户的登录环境)
    • sudo -s 保留当前环境但以目标用户身份运行 shell

常用命令与选项(示例)

    # 执行单条命令
    sudo apt update
    sudo apt install -y nginx

    # 以 root 登录交互式 shell(登录环境)
    sudo -i

    # 以其他用户身份执行命令
    sudo -u postgres psql
    sudo -u www-data ls -la /var/www

    # 重新运行上一条命令(带 sudo)
    sudo !!

    # 仅验证密码(不执行命令)
    sudo -v

    # 立即清除密码缓存
    sudo -k

    # 后台运行命令
    sudo -b some-command

    # 列出当前用户可执行的 sudo 命令
    sudo -l

---

常见使用场景与示例

1) 修改系统配置文件

sudo vim /etc/hosts
sudo nano /etc/nginx/nginx.conf

2) 安装/升级软件包

sudo apt update && sudo apt upgrade
sudo apt install docker.io

3) 管理服务

sudo systemctl restart nginx
sudo systemctl status docker

4) 部署脚本(自动化)
/etc/sudoers.d/deploy 添加:

deployer ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp.service

sudoers 文件详解(用 visudo 编辑)

永远用 visudo 编辑 /etc/sudoers,它会在保存前做语法检查。

基本语法:

root ALL=(ALL) ALL
user1 ALL=(ALL) ALL
dev ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx

别名示例:

User_Alias ADMINS = alice, bob
Cmnd_Alias WEB_CMDS = /bin/systemctl restart nginx, /usr/bin/systemctl status nginx
ADMINS ALL=(ALL) NOPASSWD: WEB_CMDS

常用 Defaults 配置:

Defaults timestamp_timeout=5
Defaults env_reset
Defaults log_output

日志、审计与排查

  • Ubuntu / Debian:/var/log/auth.log
  • CentOS / RHEL:/var/log/secure

查看 sudo 记录:

sudo tail -n 200 /var/log/auth.log | grep 'sudo'

常见排查:

  • user NOT in sudoers → 用户无 sudo 权限
  • 密码错误 → 检查输入的是当前用户密码
  • visudo 保存失败 → 修复语法错误

CI / 自动化 与 sudo

CI 中不要全局给 NOPASSWD:ALL,应限定具体命令。

.gitlab-ci.yml 示例:

image: ubuntu:22.04
before_script:
  - apt-get update && apt-get install -y curl nodejs npm
job:
  script:
    - node -v

安全建议

  • sudo -l 检查权限
  • 永远用 visudo 编辑配置
  • 限定具体命令而不是全局 root
  • 定期审计 /var/log/auth.log
  • CI 中最小化 sudo 使用

常见错误与解决方法

  • user is not in the sudoers file → 用 root 添加到 sudoers
  • sudo: command not found → 安装 sudo
  • 密码错误 → 当前用户密码
  • CI 没有权限 → 用有权限的 runner

参考

  • man sudo
  • man sudoers
  • visudo
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐