su用于切换用户身份并启动新shell,需目标用户密码;sudo委托执行特定命令,用自身密码且权限可精细控制、全程审计。

su 和 sudo 都能提权执行管理操作,但设计目标、使用逻辑和安全机制完全不同。选错命令不仅影响效率,还可能暴露 root 密码或绕过审计。
核心用途不同
su 是“Switch User”,本质是用户身份切换:输入目标用户密码后,启动一个新 shell,完全以该用户身份运行,包括家目录、PATH、环境变量等。默认不带参数时切换到 root,需 root 密码。
sudo 是“Superuser Do”,本质是权限委托:普通用户用自己的密码,临时获得指定用户(通常是 root)的权限去执行某条命令,不切换用户会话,也不改变当前环境。
- su -l 或 su - 切换为完整登录 shell(加载目标用户环境)
- su(无参数)只切换 UID/GID,保留原工作目录和部分环境变量
- sudo command 执行单条特权命令,结束后立即退回普通权限
- sudo -i 模拟登录 root shell(等效于 su -),但用的是当前用户密码
密码验证机制不同
su 要求你提供目标用户的密码——比如 su root 就必须知道 root 的密码;而 sudo 要求你输入自己的密码,系统通过 /etc/sudoers 配置确认你是否有权执行该操作。
这意味着:
- 管理员无需向运维人员共享 root 密码
- 离职员工账号禁用后,其 sudo 权限自动失效
- 密码策略可独立控制:普通用户改密不影响提权能力
权限控制粒度差异大
su 一旦成功,就获得目标用户的全部权限,无法限制能做什么、不能做什么;sudo 则支持精细授权:
- 可限定只允许某用户运行特定命令(如仅 /usr/bin/systemctl restart nginx)
- 可指定以哪个用户身份执行(如 sudo -u www-data php artisan migrate)
- 可设置免密执行(NOPASSWD)、超时时间、日志记录级别等
- 所有 sudo 操作默认写入 /var/log/auth.log,含命令、用户、时间、终端信息
实际使用建议
日常维护优先用 sudo,尤其在多管理员环境中:
- 更新系统:sudo apt update && sudo apt upgrade
- 编辑系统文件:sudo nano /etc/hosts(避免直接 su - 后误操作)
- 需要长时间 root 会话时,用 sudo -i(比 su - 更安全可审计)
- 绝对避免 sudo su 或 sudo su -,这是冗余且易混淆的写法;直接用 sudo -i 即可
- 新用户加入 sudo 组即可获得基本权限:usermod -aG sudo username










