人人都会AI编程

12.3 用户切换:su、sudo 区别与使用场景

更新时间:2026-07-12

在 Linux 系统中,日常操作应当以普通用户身份进行,只有在必要时才获取超级用户(root)权限。susudo 是最常用的两种权限提升工具,它们的目标相似,但工作机制和安全理念完全不同。理解两者的区别,能帮你更安全、高效地管理系统。

1. su:切换用户身份
su(switch user)命令用于从当前登录会话切换到另一个用户。如果不指定用户名,默认切换到 root 用户。

su -           # 切换到 root,并加载 root 的环境变量(等同于以 root 身份全新登录)
su - username  # 切换到指定用户,并加载其环境
su             # 切换到 root,但保留当前用户的环境变量(可能导致 PATH 等混乱,不推荐)

执行 su 时,系统会要求你输入目标用户的密码。要切到 root,就必须知道 root 的密码。这意味着所有需要 root 权限的人必须共享同一个 root 密码,这在多人协作或安全审计时非常麻烦——无法追踪谁在什么时候执行了哪条命令,更无法精细控制每个用户能做哪些事。一旦 root 密码泄露,整个系统就彻底暴露。

典型使用场景

  • 在单机或只有一个人的开发环境中,临时需要长时间以 root 身份操作(如系统安装、内核编译),使用 su - 比较方便。
  • 从普通用户切换到某个特定服务账户(如 postgreswww-data),进行数据库维护或应用调试。

2. sudo:以受控方式执行单条命令
sudo(superuser do)允许系统管理员预先配置哪些用户可以以哪些身份执行哪些命令。默认情况下,sudo 以 root 身份运行用户指定的命令。

sudo apt update               # 以 root 权限执行 apt update
sudo -u postgres psql         # 以 postgres 用户身份执行 psql
sudo -i                       # 获取一个交互式 root shell(类似 su -,但通过 sudo 认证)

执行 sudo 时,系统要求输入的是当前用户自己的密码,而不是 root 密码。用户不需要知道 root 密码,root 密码甚至可以长期锁定,从而大大降低安全风险。

为什么 sudo 更安全、更实用

  • 精准授权:通过 /etc/sudoers 文件(推荐使用 visudo 编辑),可以赋予用户非常细粒度的权限,比如只允许某个用户无密码重启某个服务。
  • 操作审计:每次 sudo 执行都会被记录到日志中(通常是 /var/log/auth.log 或 journald),包含执行者、时间和具体命令,事后可追溯。
  • 隔离 root 密码:root 账户可以没有密码或被锁定,攻击者即使获取了普通用户密码,也需要突破该用户权限才能提权,多了一道防线。
  • 有限时间窗口sudo 默认缓存认证结果(通常 5 分钟内再次执行无需输入密码),减少频繁输入的繁琐,同时限制了风险时间。

典型使用场景

  • 多用户服务器的标准做法:管理员为每个运维人员创建个人账户,赋予部分或全部 sudo 权限,禁止直接使用 root 登录。
  • 桌面或开发环境:Ubuntu 等发行版默认禁用 root 账户,安装时创建的用户自动获得完全的 sudo 权限,所有管理操作都通过 sudo 进行。
  • 自动化脚本:可以在 sudoers 中为特定用户配置允许无密码执行几条脚本,用于监控或定时任务。

3. 最佳实践

  • 多人管理服务器:始终使用 sudo,禁止直接 root 登录(SSH 配置 PermitRootLogin no),并为每个管理员分配个人账户。
  • 临时使用 root:需要连续执行多条特权命令时,可以使用 sudo -i 进入 root shell,完成工作后立即 exit 退出,避免长时间留在 root 状态。
  • 检查权限配置:定期用 sudo -l 查看当前用户被允许执行哪些命令,确保权限没有不必要的放宽。
  • 谨慎使用su:在现代 Linux 管理中,应尽量避免直接使用 su 获取 root 权限,优先使用 sudo 实现可审计的授权。

总的来说,su 是“彻底变身”的传统方式,依赖共享秘密(root 密码);sudo 是“临时借用”的现代方式,依赖预先定义的授权策略和个人认证。除非极特殊场景,否则都应优先使用 sudo,这已是多数发行版和运维规范认可的安全实践。