在 Linux 系统中,日常操作应当以普通用户身份进行,只有在必要时才获取超级用户(root)权限。su 和 sudo 是最常用的两种权限提升工具,它们的目标相似,但工作机制和安全理念完全不同。理解两者的区别,能帮你更安全、高效地管理系统。
1. su:切换用户身份su(switch user)命令用于从当前登录会话切换到另一个用户。如果不指定用户名,默认切换到 root 用户。
su - # 切换到 root,并加载 root 的环境变量(等同于以 root 身份全新登录)
su - username # 切换到指定用户,并加载其环境
su # 切换到 root,但保留当前用户的环境变量(可能导致 PATH 等混乱,不推荐)
执行 su 时,系统会要求你输入目标用户的密码。要切到 root,就必须知道 root 的密码。这意味着所有需要 root 权限的人必须共享同一个 root 密码,这在多人协作或安全审计时非常麻烦——无法追踪谁在什么时候执行了哪条命令,更无法精细控制每个用户能做哪些事。一旦 root 密码泄露,整个系统就彻底暴露。
典型使用场景:
- 在单机或只有一个人的开发环境中,临时需要长时间以 root 身份操作(如系统安装、内核编译),使用
su -比较方便。 - 从普通用户切换到某个特定服务账户(如
postgres、www-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,这已是多数发行版和运维规范认可的安全实践。