在Linux系统管理中,将普通用户转换为具有超级用户权限的身份是常见操作。实现这一目的的核心命令是su和sudo,二者机制不同,适用场景也有明显区别。系统通常通过限制root直接登录来增强安全性,因此普通用户往往需要借助这些命令完成特权任务。

su命令:直接切换用户身份
su是switch user的缩写,最基本用法是执行su后输入root密码,从而将当前shell环境切换为root用户。若写成su -,则会加载root的登录环境配置文件,包括HOME、PATH等变量,更接近真正以root登录。该命令不依赖额外授权文件,只验证目标用户的凭证。
使用su的缺点在于,任何知道root密码的人都能获得完整控制权,不利于多人协作和审计。在默认禁止root远程登录的发行版中,管理员仍需先以普通用户登录再su,但这并不能解决密码共享问题。下面的示例展示了普通用户使用su切换为root并执行命令的过程:
# 当前为普通用户 alice whoami # 输出 alice # 切换为 root,需要输入 root 密码 su - whoami # 输出 root # 执行特权操作 apt update
sudo命令:授权执行单条命令
sudo允许被授权的普通用户以其他用户(默认root)身份运行指定命令,且一般只需输入自己的密码。它依赖/etc/sudoers文件或/etc/sudoers.d/目录下的配置来决定谁可以执行什么。这种设计实现了最小权限原则,并自动记录操作日志,便于追溯。
配置sudo时,推荐使用visudo命令编辑,它能防止语法错误导致权限系统损坏。例如授予用户alice全部管理权限,可在sudoers中加入 alice ALL=(ALL:ALL) ALL。若仅允许重启服务,可写为 alice ALL=(root) /bin/systemctl restart nginx。以下代码演示了sudo的典型用法:
# 以普通用户执行需要特权的命令 sudo apt update # 查看当前用户可用的 sudo 权限 sudo -l # 以 root 身份打开交互 shell(需配置允许) sudo -i
su与sudo的安全差异
su要求分发root密码,一旦泄露影响全局;sudo按用户授权,可精细控制命令范围并留有日志。现代Linux发行版如Ubuntu默认清空root密码,强制使用sudo,降低密码暴露风险。对于服务器多人维护,sudo明显优于su。
但也需注意,若用户被赋予ALL权限且无需密码(NOPASSWD),则和root差异不大。因此运维规范应限定命令集,并定期审计/var/log/auth.log中的sudo记录。
将普通用户转为超级用户的实际操作建议
如果任务是临时获得root环境,用su -最直接;若只是跑一条管理命令,优先sudo。新装系统若未启用root密码,可先用sudo passwd root设置,但不推荐长期共享。更安全的做法是把用户加入sudo组:
# 将 alice 加入 sudo 组(Debian/Ubuntu) usermod -aG sudo alice # 验证组内成员 groups alice
此后alice就能用自己密码通过sudo转换权限,无需知道root密码。这种普通用户到超级用户的转换方式兼顾便利与安全,也是当前社区主流实践。
常见误区与避坑
有人误以为sudo永远安全,便随意添加NOPASSWD规则,结果脚本被篡改后提权。还有人用su在图形界面下启动程序,导致配置文件属主变为root,普通用户后续无法修改。正确做法是用sudo -u保留必要权限边界,或用systemd用户实例隔离。
另外,在容器环境里,许多镜像默认以root运行,此时sudo反而不存在。理解宿主机的转换命令和容器内身份的区别,才能准确定位权限问题。