su是Linux系统里最经典的用户切换命令,名字来源于英文switch user的缩写。在Ubuntu中使用它时,很多人第一步就卡住了:明明装系统时设置过密码,为什么输入su后提示Authentication failure?这其实不是命令用错了,而是Ubuntu出于安全考虑默认锁定了root账户。本文将从su的基本用法讲起,逐步展开Ubuntu下的特殊处理方式以及常见问题的排查思路。

su命令的基本用法与参数说明
su命令的标准格式是su [选项] [用户名]。如果只输入su不跟用户名,系统默认你要切换到root账户,此时会提示输入目标用户的密码。切换成功后,命令提示符会从$变成#,这是root身份最直观的标志。
这里有一个非常关键但容易被忽略的细节:su和su -的行为并不相同。直接执行su只是切换了用户身份,但保留了原用户的大部分环境变量,比如当前工作目录、PATH设置等。而执行su -(等价于su -l,即login模式)会模拟一次完整的登录过程,重新加载目标用户的profile文件,把工作目录切换到目标用户的home目录,环境变量也会全部按目标用户初始化。
# 只切换身份,保留当前环境 su # 完整登录方式切换,加载root的环境配置 su - # 切换到指定用户,需要输入该用户的密码 su - username # 切换后验证当前身份 whoami echo $HOME
实际使用中推荐始终带上-参数。举个典型的坑:有些用户用su切换到root后执行某些管理命令,提示command not found,原因就是root的PATH没有加载,/sbin和/usr/sbin目录不在搜索路径里,改用su -就能解决。
Ubuntu下su认证失败的解决方法
前面提到,Ubuntu安装过程中只让你创建了普通用户,root账户没有设置密码,处于锁定状态。在锁定状态下,无论输入什么密码都无法通过su的认证,这是PAM模块的正常行为而不是密码错误。
解决办法很简单,用普通用户的sudo权限给root设置一个密码:
# 先用sudo执行passwd命令给root设置密码 sudo passwd root # 按提示两次输入新密码,看到提示更新成功即可 # 之后就可以正常使用su切换到root su -
设置完成后,su切换root就和传统Linux发行版的体验一致了。如果出于安全考虑不想长期开放root登录,可以用sudo passwd -l root重新锁定root账户,锁定后su又会回到认证失败的状态。
另外还有一种临时切换的方式值得了解:执行sudo su -可以直接从普通用户跳到root环境,整个过程只需要输入自己的密码,不需要root密码。这在root未设置密码的场景下特别实用,本质上是借用了sudo的授权机制。
su与sudo的区别及选择建议
既然有sudo,为什么还要用su?两者的核心差异在于认证对象和权限模型。su需要输入目标用户的密码,切换后获得目标用户的完整身份,直到执行exit退出;sudo需要输入当前用户自己的密码,授权范围由/etc/sudoers文件控制,通常是单条命令的临时提权,执行完毕自动回到普通权限。
从审计角度看,sudo的设计更安全。每个sudo操作都会记录是谁在什么时间执行了什么命令,而su切换到root之后,系统层面很难区分具体是哪个物理用户在操作。多人共管的服务器上,这一点尤其重要。
| 对比项 | su | sudo |
|---|---|---|
| 需要的密码 | 目标用户密码 | 当前用户自己的密码 |
| 权限持续时间 | 切换后持续到exit | 单条命令级别,可缓存一段时间 |
| 权限控制粒度 | 全有或全无 | 可在sudoers中细化到具体命令 |
| 操作日志 | 不易区分实际操作者 | 详细记录用户与命令 |
实践建议是:日常临时操作优先用sudo,比如安装软件、修改系统配置;只有在需要进行一整套连续管理操作、频繁提权嫌麻烦时,再考虑sudo su -进入完整的root环境,用完及时退出。
切换失败常见问题排查
除了root密码锁定问题,su还可能出现其他报错。比较常见的有提示user does not exist,这多半是用户名拼写错误,可以先用cat /etc/passwd确认系统中实际存在的用户名。注意/etc/passwd里的第一个字段才是登录名。
如果提示This account is currently not available,说明目标账户的shell被设置为/sbin/nologin或/usr/sbin/nologin,这类账户通常是系统服务账户,禁止交互登录。可以查看grep username /etc/passwd最后一列确认。确实需要用它登录的话,可以修改shell,但一般不建议改动服务账户。
# 查看用户的shell设置 grep testuser /etc/passwd # 将shell改为bash(需要root权限) sudo usermod -s /bin/bash testuser
还有一种情况是提示pam_authenticate: Authentication failure,输入密码确认没错却反复失败。此时可以检查/etc/pam.d/su配置文件,有些发行版默认启用了pam_wheel模块,要求执行su的用户必须属于wheel组才能切换到root。Ubuntu默认没有这个限制,但如果系统被加固过,可以用usermod -aG wheel 用户名把自己加入wheel组后再试。
掌握su命令的关键在于理解它只是身份切换的入口,真正的行为取决于环境加载方式和账户状态。把su -、sudo passwd root、sudo su -这几个高频用法记熟,再结合sudo的授权模型灵活选择,Ubuntu下的用户切换基本就不会再遇到障碍了。
Ubuntu su切换用户su命令sudo命令修改时间:2026-09-04 21:44:35