sudo是权限委托,用自身密码执行单条命令并保留当前环境;su是身份切换,需目标用户密码,不带参数仅改UID/GID,su-才加载目标完整环境,且sudo具备细粒度授权与完整审计日志。

sudo 和 su 都能提权执行操作,但它们切换的“权限环境”完全不同——不是能不能执行命令的问题,而是以谁的身份、在什么环境下、用哪套配置去执行。
sudo:借钥匙,不换办公室
sudo 的本质是“以目标用户身份运行单条命令”,但保留当前用户的环境变量、工作目录和 shell 配置。它不需要目标用户密码,只需当前用户自己的密码。
- 执行
sudo apt update,实际是以 root 权限运行,但 PATH、HOME、当前路径仍是你的,.bashrc 也不会加载 root 的 - 创建的文件属主默认是 root(因为进程是 root 启动的),但文件路径、环境依赖仍按你当前环境解析
- 适合快速执行一条命令,比如改配置、重启服务、装软件,不希望污染当前会话
su:进门换人,但没开灯
不带参数的 su username 只切换用户 ID,不重载环境。它继承当前用户的 $PATH、$HOME、当前目录等,只是 UID/GID 变了。
- 例如
su test后,pwd还是你原来的目录,echo $HOME显示的仍是你的家目录 - 容易出错:某些命令依赖 PATH 或配置文件(如 ~/.bashrc),而这些并未加载目标用户的版本
- 普通用户切他人需对方密码;root 切任何人无需密码(系统默认允许)
su -:完整登录,进别人办公室
su -(或 su -l)模拟一次全新登录,加载目标用户的 shell 初始化文件(~/.bash_profile、~/.bashrc 等),切换到其家目录,重置所有关键环境变量。
-
su -默认切 root,su - alice则完全进入 alice 的登录环境 - 执行
whoami和pwd都反映目标用户身份和路径,set | grep HOME显示的是目标用户的家目录 - 适合需要长期操作、依赖用户专属工具链或配置的场景,比如调试某个用户的 cron 或 systemd user service
安全与审计的关键差异
sudo 默认记录每一次执行(含命令、时间、调用者),日志存于 /var/log/auth.log 或 journald;su 本身不记日志,需额外配置 PAM 才能审计。
- sudo 支持细粒度授权:可在 /etc/sudoers 中限定某用户只能运行
/usr/bin/systemctl restart nginx,不能删文件 - su 是“全有或全无”——拿到目标用户密码,就等于获得该账户全部权限,包括其 SSH 密钥、GPG 密钥、数据库凭证等
- 生产环境推荐优先用 sudo,尤其对非 root 用户;su - 适合运维人员本地维护,且需明确知晓环境变更影响


















