当以普通用户身份登录 Linux 且任务需要 root 权限或其他账户时,您有两个实用的选择:使用 su 切换到该用户,或通过 sudo 以提权方式运行单个命令。su 实用程序(substitute 或 switch user 的缩写)是两者中较旧的一个,也是许多系统管理员在需要另一个用户的完整 shell 时仍会使用的工具。
在当前登录会话中使用 su 切换到管理账户是最简单的方法。当 root 用户不允许通过 SSH 登录或使用图形界面显示管理器登录时,它特别方便。如果您只想以提权方式运行单个命令,请参见 sudo 命令指南。
本指南解释了如何使用 su 命令以及它与 sudo 的比较。
语法
su 命令的一般语法如下:
su [OPTIONS] [USER [ARGUMENT...]]在不带任何选项的情况下调用时,su 的默认行为是以 root 身份运行交互式 shell:
su系统将提示您输入 root 密码,如果认证成功,运行命令的用户将临时变为 root。
与要求您输入自己密码的 sudo 不同,su 需要您切换到目标用户的密码。
要确认用户已更改,请使用 whoami 命令:
whoami输出
root要切换到另一个用户账户,请将用户名作为参数传递给 su。例如,要切换到用户 tyrion,您会输入:
su tyrion要以另一个用户的身份启动登录 shell:
su - tyrion登录 Shell 与非登录 Shell
当您不带 - 选项运行 su 时,SHELL 和 HOME 环境变量会从目标用户的 /etc/passwd 条目中设置,但当前目录和环境的其他部分不会更改。这意味着 PATH 变量仍然包含原始用户的目录。
调用 su 时最常用的选项是 - (-l, --login)。这会启动一个登录 shell,其环境与真实登录相同,包括将当前目录更改为目标用户的家目录:
su -在大多数情况下,您希望使用 su - 而不是纯 su 以获得干净的环境。
选项
su 命令接受以下选项:
运行特定 Shell
要运行 passwd 文件中定义的 shell 以外的 shell,请使用 -s, --shell 选项。例如,切换到 root 并运行 zsh shell:
su -s /usr/bin/zsh如果目标用户的账户具有受限 shell(即未列在 /etc/shells 中的 shell),则除非您以 root 身份调用 su,否则 su 会忽略 -s 选项和 SHELL 变量。
保留环境
要保留调用用户的整个环境 (HOME, SHELL, USER 和 LOGNAME),请使用 -p, --preserve-environment 选项:
su -p当使用 - 选项时,-p 会被忽略。
运行单个命令
要在不启动交互式 shell 的情况下以目标用户身份运行命令,请使用 -c, --command 选项。例如,以 root 身份调用 ps 命令:
su -c 'ps aux'要以特定用户身份运行命令:
su -c 'whoami' tyrion如果命令字符串包含空格或特殊字符,则应将其括引号。
使用 sudo su 成为 root
在某些 Linux 发行版(如 Ubuntu)中,出于安全原因默认禁用 root 用户账户。这意味着 root 没有设置密码,无论您在提示符中输入什么,纯 su 都会失败。
解决方法是在 su 命令前添加 sudo 并输入当前登录用户的密码:
sudo su -如果用户被授予 sudo 访问权限,su 将以 root 身份调用。由于此时进程已经以 root 身份运行,因此 su 不会要求自己的密码。运行 sudo su - 然后输入您的用户密码与运行 su - 然后输入 root 密码具有相同的效果。
去掉 - 会给您一个 root shell,但会留在当前工作目录:
sudo su您也可以以这种方式切换到普通账户,这在您不知道该用户密码时很有用:
sudo su - tyrionsudo 命令可以独立打开 root shell,而无需涉及 su。-i 选项使用 root 用户的环境运行交互式登录 shell:
sudo -i-s 选项启动 root shell,但不运行登录 shell:
sudo -s所有四个命令都会让您处于 root 提示符下,但它们在 shell 选择、启动文件和工作目录方面有所不同:
| Command | Shell | Reads root's login files | Working directory |
|---|---|---|---|
sudo su | Root's configured shell, non-login | No | Unchanged |
sudo -s | Calling user's shell, non-login | No | Unchanged |
sudo su - | Root's configured shell, login | Yes | Root's home, usually /root |
sudo -i | Root's configured shell, login | Yes | Root's home, usually /root |
sudo -s 命令使用 SHELL 变量或调用用户的配置 shell,而其他形式则使用 root 的配置 shell。登录形式读取 root 的登录文件并移动到 root 的家目录,通常是 /root。
当您需要 root 登录 shell 时,请首选 sudo -i,因为它直接调用 root 的登录 shell,而不是将 su 作为第二个程序启动。对于常规管理工作,请在单个命令前添加 sudo,以便 sudo 策略和命令日志记录适用于每次调用。
sudo vs su
sudo 和 su 之间的关键区别:
- Password:
su需要目标用户的密码。sudo需要您自己的密码。 - Access control:
sudo允许对用户可以运行的命令进行细粒度控制(配置在/etc/sudoers中)。su给予目标用户账户的完全访问权限。 - Auditing:
sudo记录通过sudo调用的命令。su仅记录用户切换了账户,而在新 shell 中运行的命令不会由su单独记录。 - Root password:
sudo消除了需要在多个管理员之间共享 root 密码的需要。
故障排除
su: Authentication failure
您输入了目标用户的错误密码,或者目标账户没有设置密码。在 Ubuntu 和其他默认锁定 root 账户的发行版中,纯 su 总是会失败,因为不存在 root 密码。请使用 sudo su - 或 sudo -i,或者如果您确实需要直接 su 访问权限,请使用 sudo passwd root 设置 root 密码。
运行 su 后 root 命令出现 command not found
纯 su 通常保留您现有的 PATH,尽管 /etc/login.defs 中的 ALWAYS_SET_PATH 或 PAM 配置可以更改此行为。如果您的普通用户的 PATH 不包含 /sbin 或 /usr/sbin,则即使您是 root,useradd、fdisk 和 shutdown 等命令也可能因 command not found 而失败。请使用 su - 获取 root 的完整 PATH,或通过其完整路径调用命令,例如 /usr/sbin/useradd。
su: User <name> does not exist or the user entry does not contain all the required fields
您要切换到的用户账户不在 /etc/passwd 中。请仔细检查拼写,并使用 id <name> 或 getent passwd <name> 确认账户是否存在。
su -c 运行了错误的命令或意外地拆分了参数
命令字符串在 su 看到它之前已经被您当前的 shell 解析。将整个命令用单引号包裹,例如 su -c 'systemctl restart nginx',以便目标用户的 shell 将其作为单个参数接收。
无法退出返回到原始用户exit 命令(或按 Ctrl+D)会离开当前的 shell。如果 su 被嵌套了多次,您可能需要在回到原始会话之前运行多次 exit。
快速参考
对于可打印的快速参考,请参阅 su 速查表。
| 任务 | 命令 |
|---|---|
| 切换到 root | su |
| 切换到 root(登录 shell) | su - |
| 切换到另一个用户 | su username |
| 以 root 身份运行命令 | su -c 'command' |
| 使用特定的 shell | su -s /bin/zsh |
| 保留环境 | su -p |
| 通过 sudo 切换到 root | sudo su - |
| 通过 sudo 切换到另一个用户 | sudo su - username |
| Sudo 登录 shell | sudo -i |
常见问题解答
su 和 su - 有什么区别?su 切换到目标用户但保留大部分当前环境,包括 PATH 和工作目录。 su - 启动完整的登录 shell,具有目标用户的完整环境。
su 和 sudo 有什么区别?su 将整个会话切换到另一个用户,并要求该用户的密码。 sudo 使用您自己的密码以 elevated privileges(提升权限)运行单个命令(或打开 shell)。
为什么即使我是 root,su 也会要求输入密码?
如果您已经是 root,su 不会要求输入密码。如果它仍然提示,您很可能处于一个嵌套的 shell 中,看起来像 root shell,例如在之前的 sudo -i 留下了不寻常的提示符之后。运行 whoami 以确认您实际上是谁,然后再进行进一步故障排除。
如何退出 su 会话?
输入 exit 或按 Ctrl+D 离开当前 shell 并返回到之前的用户。如果您连续运行了多次 su,请重复此步骤直到回到您的原始会话。
如何限制哪些用户可以使用的 su?
通过 PAM 配置 su 限制,通常在 /etc/pam.d/su 中。要仅允许特定组的成员使用,请使用 pam_wheel.so 并指定明确的组,例如 auth required pam_wheel.so group=wheel。在启用该规则之前,请确认该组存在且至少有一位管理员属于该组,因为不正确的 PAM 配置可能会阻止 su 访问。发行版的默认设置不同,因此请查看本地 PAM 文件中的注释,而不是取消注释通用行。
sudo su 和 su - 有什么区别?
两者都为您提供 root shell。sudo su 使用您自己的密码进行身份验证,并将您留在当前目录的非登录 shell 中,而 su - 需要 root 密码并在 root 的主目录(通常是 /root)启动干净的登录 shell。在 root 账户被锁定的系统上(例如 Ubuntu),只有 sudo 形式有效。
运行不同用户命令的 su 选项的长版本是什么?
它是 --command,即 -c 的长形式。例如,su --command 'whoami' tyrion 作为 tyrion 运行单个命令,而不是打开交互式 shell。