26·用户与权限入门

su 用户切换

suswitch-user

第 26 课 - su 用户切换

学习目标

通过本课的学习,你将能够:

  1. 理解 su 命令的核心用途与工作原理。
  2. 掌握使用 su 切换到其他用户(特别是 root)身份的正确方法。
  3. 区分“登录式Shell”和“非登录式Shell”对环境变量的影响,并能正确使用相关选项。
  4. 了解 susudo 的适用场景和区别。
  5. 掌握使用 su 以其他用户身份执行单条命令。

核心概念

suSwitch User 的缩写,意为“切换用户”。它是一个基础且至关重要的系统管理命令,允许一个用户在不注销当前会话的情况下,临时切换为系统中的另一个用户身份。

通俗理解:想象你正在自己的电脑上操作,但你需要使用管理员(root)权限来安装软件。你可以直接使用 su 命令“变成”root用户,进行操作完成后再“变回”自己的身份。这比注销再重新用root登录要方便得多。

susudo 的主要区别

这是初学者最容易混淆的地方:

  • 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:基础切换与返回

  1. 使用 su - 切换到 root 用户。
  2. 在 root 环境下,运行 pwd 命令,观察并记录输出的目录路径。
  3. 运行 whoami,确认当前用户是 root
  4. 使用 exit 返回到你原来的用户。 预期输出/行为
  • pwd 应输出 /root
  • whoami 应输出 root
  • 执行 exit 后,你的提示符会变回普通用户。

练习 2:探索环境变量差异

  1. 先以普通用户身份,运行 echo $PATH,记录输出。
  2. 使用 su root (不加 -) 切换到 root。
  3. 在 root 环境下,再次运行 echo $PATH,对比两次输出。
  4. 退出后,再使用 su - root 切换到 root。
  5. 运行 echo $PATH,与第一次普通用户和第二次 su root 时的输出分别对比。 预期输出/行为
  • su root 后的 PATH 应与你普通用户的非常相似。
  • su - root 后的 PATH 应包含 /sbin, /usr/sbin 等 root 特有的路径,且通常更完整。

练习 3:组合 sudo 与 su 假设你的普通用户 myuser 已经被配置了 sudo 权限,但你不知道 root 密码。

  1. 如何不依赖 root 密码,以 root 身份执行 cat /etc/shadow 命令? 提示:思考 sudosu -c 的组合。 参考答案
sudo su -c "cat /etc/shadow"

这条命令的解释:sudo 临时提升 myuser 的权限,su -c "..." root 则是以 root 身份执行后面引号内的命令。

常见错误

  1. 忘记 - 导致命令找不到

    • 错误现象su root 后,执行 ifconfigservice 等命令,系统提示“command not found”。
    • 原因:使用了非登录式Shell,保留了原用户的 PATH 环境变量,而这些系统管理命令通常位于 /sbin/usr/sbin 目录下,原用户的 PATH 可能不包含这些路径。
    • 解决:使用 su - root 进行完整的登录式切换。
  2. 混淆 su 和 sudo 的密码要求

    • 错误操作:普通用户输入 su root 后,输入自己的密码。
    • 结果:认证失败。
    • 正确理解su 切换到谁,就需要输入谁的密码sudo 执行命令,输入的是执行 sudo 的用户自己的密码
  3. 权限不足时的错误信息

    • 当普通用户尝试 su 到一个权限更高的用户(如 root)但输入密码错误时,会得到明确的错误信息:su: Authentication failure。请确保你输入的是目标用户的正确密码。
  4. 忽略安全隐患

    • 长时间以 root 身份操作是危险的。完成任务后,务必及时 exit 回到普通用户,遵循“最小权限原则”。

小结

  • su 的核心作用:在会话中临时切换用户身份。
  • 关键选项su - 用户名 进行登录式切换(推荐用于完整管理任务),su 用户名 进行非登录式切换(保留原环境)。
  • 单命令执行su -c "命令" 用户名 可以不进入目标用户的Shell而直接执行命令。
  • sudo 的区别su 切换身份需要目标用户密码,sudo 提升权限执行命令需要当前用户密码和授权。
  • 环境变量至关重要:不带 -su 切换可能导致环境变量(特别是 PATH)不正确,从而引发“命令找不到”的问题。
  • 安全第一:仅在需要时提升权限,并及时降回普通权限。

熟练掌握 su,将为你进行用户管理和系统维护打下坚实的基础。下一课,我们将学习如何通过 umask 来控制新建文件和目录的默认权限。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「umask 默认权限控制」 以巩固所学知识。