第 26 课 - su 用户切换
学习目标
通过本课的学习,你将能够:
- 理解
su命令的核心用途与工作原理。 - 掌握使用
su切换到其他用户(特别是 root)身份的正确方法。 - 区分“登录式Shell”和“非登录式Shell”对环境变量的影响,并能正确使用相关选项。
- 了解
su与sudo的适用场景和区别。 - 掌握使用
su以其他用户身份执行单条命令。
核心概念
su 是 Switch User 的缩写,意为“切换用户”。它是一个基础且至关重要的系统管理命令,允许一个用户在不注销当前会话的情况下,临时切换为系统中的另一个用户身份。
通俗理解:想象你正在自己的电脑上操作,但你需要使用管理员(root)权限来安装软件。你可以直接使用 su 命令“变成”root用户,进行操作完成后再“变回”自己的身份。这比注销再重新用root登录要方便得多。
su 与 sudo 的主要区别
这是初学者最容易混淆的地方:
su:直接切换到另一个用户的身份,目标用户的密码是验证凭证。切换后,你就在那个用户的环境里了。sudo:以超级用户或其他用户的权限来执行一条特定的命令,当前用户的密码是验证凭证,且该用户需要在/etc/sudoers文件中被授权。
简单来说:su 是“变成”别人,sudo 是“借”别人的权限用一下。
登录式 Shell vs. 非登录式 Shell
这是理解 su 行为的关键。
- 登录式Shell:当你首次登录系统(例如通过SSH或物理终端)时,系统会启动一个登录Shell。它会依次加载
/etc/profile、~/.bash_profile、~/.bash_login和~/.profile等文件来设置完整的用户环境。 - 非登录式Shell:当你在一个已经登录的会话中打开一个新的终端窗口,或者运行
bash命令时,启动的是非登录Shell。它只加载~/.bashrc文件。
su 与 Shell 类型的关系:
su - 用户名或su -l 用户名:会为目标用户启动一个登录式Shell。这意味着目标用户的环境变量(如PATH,HOME)会被完全加载,工作目录也会切换到目标用户的家目录。su 用户名:会启动一个非登录式Shell。它只切换用户身份,但保留调用者的大部分环境变量(如PATH)和工作目录。
建议:通常,当你需要全面切换到另一个用户进行管理操作时,使用 su -,以确保环境变量正确。
代码示例
1. 基本用法:切换到 root 用户
# 切换到 root 用户(需要输入 root 的密码)
su -
# 提示符变为 [root@localhost ~]#,表示已切换成功
# 完成操作后,返回原来的用户
exit
2. 切换到指定用户
# 假设系统中有一个用户叫 `dev1`
# 切换到 dev1(需要输入 dev1 的密码)
su - dev1
# 此时,你的家目录是 /home/dev1,环境是 dev1 的
# 返回
exit
3. 使用非登录式 Shell 切换(保留原环境)
# 当前用户为 alice,家目录为 /home/alice
su bob
# 注意:提示符可能变了,但工作目录还是 /home/alice,环境变量可能也还是 alice 的
echo $HOME
# 输出可能还是 /home/alice
4. 以其他用户身份执行单条命令
# 不想完全切换,只想以 bob 身份执行 `whoami` 命令
su -c "whoami" bob
# 系统会要求输入 bob 的密码,然后输出 `bob`
# 以 root 身份查看只有 root 能读的 /etc/shadow 文件内容
su -c "cat /etc/shadow" root
5. 保留当前环境变量切换用户(使用 -p 或 --preserve-environment)
# 切换到 root,但保留当前用户的环境变量(特别是 PATH)
su -p root
# 或者
su --preserve-environment root
# 此时,root 可能会因为环境变量中缺少 /sbin 等路径而无法执行一些系统管理命令
实践练习
练习 1:基础切换与返回
- 使用
su -切换到 root 用户。 - 在 root 环境下,运行
pwd命令,观察并记录输出的目录路径。 - 运行
whoami,确认当前用户是root。 - 使用
exit返回到你原来的用户。 预期输出/行为:
pwd应输出/root。whoami应输出root。- 执行
exit后,你的提示符会变回普通用户。
练习 2:探索环境变量差异
- 先以普通用户身份,运行
echo $PATH,记录输出。 - 使用
su root(不加-) 切换到 root。 - 在 root 环境下,再次运行
echo $PATH,对比两次输出。 - 退出后,再使用
su - root切换到 root。 - 运行
echo $PATH,与第一次普通用户和第二次su root时的输出分别对比。 预期输出/行为:
su root后的PATH应与你普通用户的非常相似。su - root后的PATH应包含/sbin,/usr/sbin等 root 特有的路径,且通常更完整。
练习 3:组合 sudo 与 su
假设你的普通用户 myuser 已经被配置了 sudo 权限,但你不知道 root 密码。
- 如何不依赖 root 密码,以 root 身份执行
cat /etc/shadow命令? 提示:思考sudo和su -c的组合。 参考答案:
sudo su -c "cat /etc/shadow"
这条命令的解释:sudo 临时提升 myuser 的权限,su -c "..." root 则是以 root 身份执行后面引号内的命令。
常见错误
-
忘记
-导致命令找不到:- 错误现象:
su root后,执行ifconfig或service等命令,系统提示“command not found”。 - 原因:使用了非登录式Shell,保留了原用户的
PATH环境变量,而这些系统管理命令通常位于/sbin或/usr/sbin目录下,原用户的PATH可能不包含这些路径。 - 解决:使用
su - root进行完整的登录式切换。
- 错误现象:
-
混淆 su 和 sudo 的密码要求:
- 错误操作:普通用户输入
su root后,输入自己的密码。 - 结果:认证失败。
- 正确理解:
su切换到谁,就需要输入谁的密码。sudo执行命令,输入的是执行sudo的用户自己的密码。
- 错误操作:普通用户输入
-
权限不足时的错误信息:
- 当普通用户尝试
su到一个权限更高的用户(如 root)但输入密码错误时,会得到明确的错误信息:su: Authentication failure。请确保你输入的是目标用户的正确密码。
- 当普通用户尝试
-
忽略安全隐患:
- 长时间以 root 身份操作是危险的。完成任务后,务必及时
exit回到普通用户,遵循“最小权限原则”。
- 长时间以 root 身份操作是危险的。完成任务后,务必及时
小结
su的核心作用:在会话中临时切换用户身份。- 关键选项:
su - 用户名进行登录式切换(推荐用于完整管理任务),su 用户名进行非登录式切换(保留原环境)。 - 单命令执行:
su -c "命令" 用户名可以不进入目标用户的Shell而直接执行命令。 - 与
sudo的区别:su切换身份需要目标用户密码,sudo提升权限执行命令需要当前用户密码和授权。 - 环境变量至关重要:不带
-的su切换可能导致环境变量(特别是PATH)不正确,从而引发“命令找不到”的问题。 - 安全第一:仅在需要时提升权限,并及时降回普通权限。
熟练掌握 su,将为你进行用户管理和系统维护打下坚实的基础。下一课,我们将学习如何通过 umask 来控制新建文件和目录的默认权限。