科普:Linux su
切换用户后出现 $
提示符,如何排查和解决?
在 Linux 系统管理中,su
(Switch User)命令用于切换用户身份。正常情况下,从 root
切换到普通用户时,提示符会从 #
变成 $
,表示权限降低。但有时 su
切换后,虽然看到 $
,但用户环境异常(如无法执行某些命令、路径错误、无法加载配置等)。本文将介绍如何排查和解决这类问题。
1. 为什么 su
切换后会出现 $
?
$
是普通用户的默认提示符,而 #
是 root
的提示符。当 su
切换用户后,提示符变成 $
是正常的,但如果出现以下情况,说明环境可能有问题:
- 命令无法执行(如
ls
、vim
报command not found
) - 当前目录未切换到家目录(仍然在
/root
或/opt
等目录) - 环境变量异常(
echo $PATH
显示不完整) - Shell 功能受限(无命令补全、无历史记录)
2. 排查步骤
2.1 检查用户的默认 Shell
grep ^用户名 /etc/passwd
例如:
grep ^test /etc/passwd
输出示例:
test:x:1000:1000::/home/test:/bin/sh
/bin/sh
:可能是dash
(Debian/Ubuntu),功能受限,不加载.bashrc
。/bin/bash
:完整功能 Shell,推荐使用。/bin/false
或/sbin/nologin
:禁止登录,su
会直接退出。
问题:如果用户的 Shell 是 /bin/sh
或 /bin/false
,su
可能无法正常加载环境。
2.2 检查 su
的切换方式
命令 | 行为 | 可能的问题 |
---|---|---|
su 用户名 | 非登录 Shell,不加载用户配置 | 环境变量可能不完整 |
su - 用户名 | 登录 Shell,加载 .bashrc 和 .profile | 如果 Shell 错误,可能失败 |
su -s /bin/bash 用户名 | 强制使用 /bin/bash | 可绕过默认 Shell 限制 |
测试:
su test # 可能环境不完整
su - test # 应该加载完整环境(如果 Shell 正确)
su -s /bin/bash test # 强制使用 bash
2.3 检查用户的家目录和配置文件
ls -la /home/用户名/
检查是否存在:
.bashrc
(Shell 配置).profile
或.bash_profile
(登录配置)
如果缺失,可以从 /etc/skel/
复制默认配置:
cp /etc/skel/.bashrc /etc/skel/.profile /home/test/
chown test:test /home/test/.bashrc /home/test/.profile
2.4 检查环境变量
su - test
echo $PATH # 查看路径是否正常
env # 查看所有环境变量
如果 PATH
不完整,可能是 .bashrc
或 .profile
未正确加载。
2.5 检查 PAM/SELinux 限制
-
PAM 限制(
/etc/pam.d/su
):grep "deny" /etc/pam.d/su
如果有
deny
规则,可能导致su
失败。 -
SELinux/AppArmor:
sestatus # 查看 SELinux 状态 grep avc /var/log/audit/audit.log # 查看安全日志
3. 解决方案
3.1 修改用户的默认 Shell
usermod -s /bin/bash test
然后测试:
su - test
3.2 修复用户配置文件
如果 .bashrc
或 .profile
损坏:
cp /etc/skel/.bashrc /etc/skel/.profile /home/test/
chown test:test /home/test/.bashrc /home/test/.profile
3.3 使用 su -
代替 su
su - test # 加载完整环境
3.4 检查系统日志
tail -f /var/log/auth.log # Ubuntu/Debian
tail -f /var/log/secure # CentOS/RHEL
查看是否有 su
相关的错误。
4. 总结
问题现象 | 可能原因 | 解决方案 |
---|---|---|
su 后 $ 提示符但环境异常 | 默认 Shell 是 /bin/sh 或 /bin/false | usermod -s /bin/bash 用户名 |
su 后无法加载 .bashrc | 家目录配置文件缺失 | 从 /etc/skel/ 复制 .bashrc |
su 后 PATH 错误 | .profile 未加载 | 使用 su - 或修复 .profile |
su 直接退出 | PAM/SELinux 限制 | 检查 /etc/pam.d/su 和 SELinux 日志 |
推荐做法:
- 始终使用
su - 用户名
(加载完整环境)。 - 确保用户的 Shell 是
/bin/bash
。 - 检查家目录配置文件是否完整。
通过以上方法,可以解决 su
切换用户后环境异常的问题。