su
su (substitute user,切换用户) 核心工具 用于切换到其他系统用户的身份,默认是 root 用户。
有关配置 su 行为的方法,请参阅 PAM。
安装
su 是 util-linux 软件包的一部分。
用法
要切换到其他用户的登录状态,请将您想切换到的用户名传递给 su,例如:
$ su username
默认情况下,当您以普通用户身份运行时,系统会提示您输入您想切换到的用户的密码。当以 root 用户身份运行 su 时,则不需要密码。
如果未传递用户名,su 将默认切换到 root 用户,此时系统会提示您输入 root 用户的密码。
更多信息,请参阅 su(1)。
技巧与提示
登录 shell
su 的默认行为是保留在当前目录,并保持原用户的环境变量(而不是切换到新用户的环境变量)。
请注意以下重要的对比考虑因素:
- 有时,系统管理员使用普通用户的 shell 账户而非自己的账户会更有利。特别是,有时解决用户问题的最有效方法是登录到该用户的账户以重现或调试问题。
- 然而,在许多情况下,root 用户以普通用户的 shell 账户及其环境变量运行,而不是使用自己的账户,这是不可取的,甚至可能是危险的。如果在不经意间使用了普通用户的 shell 账户,root 可能会安装一个程序或对系统进行其他更改,而这些更改如果是在 root 账户下进行,结果将不同。例如,可能会安装一个程序,该程序会赋予普通用户意外损坏系统或未经授权访问某些数据的能力。
因此,建议管理员以及任何其他被授权使用 su 的用户(建议最好只有很少甚至没有)养成总是使用 -l/--login 选项运行 su 命令的习惯。它有两个效果:
- 通过“登录”到新用户,将当前目录切换到新用户的家目录(例如,对于 root 用户,切换到
/root)。 - 将环境变量更改为新用户的环境变量,根据其首选 shell 设置。例如,对于 bash shell,这包括
~/.bashrc以及可能其他的点文件。也就是说,当前目录和环境将更改为如果新用户实际登录了一个新会话(而不是仅仅接管了一个现有会话)时应该期望的样子。
因此,管理员通常应如下使用 su:
$ su -l
通过添加用户名 root 来产生相同的结果:
$ su -l root
同样,对任何其他用户也可以这样做(例如,对于一个名为 archie 的用户):
# su -l archie
要登录一个无需密码的用户,请先登录 root,然后从 root shell 登录到该无需密码的用户账户:
$ su -l # runuser -l archie
- 您有时会遇到使用
su -来获取登录 shell 的情况,而不是su -l/su --login。这种简写方式不被推荐,因为-选项可能遇到解析限制,请参阅 su(1) § DESCRIPTION。 - 您可能希望为
~/.bashrc添加一个别名来实现这一点:alias su="su -l"
su 与 wheel 用户组
BSD su 默认只允许 wheel 用户组的成员切换到 root 身份。这不是 GNU su 的默认行为,但可以通过 PAM 来模拟此行为。取消注释 /etc/pam.d/su 和 /etc/pam.d/su-l 中的相应行。
auth required pam_wheel.so use_uid
禁止登录用户
如果其他用户不允许登录(即他们的 Shell 被设置为 /bin/false 或 /usr/bin/nologin),您将无法仅仅通过使用 su user -c command 来以该用户身份运行命令。
您可以通过指定要使用的 shell 来解决此问题:
# su -s /usr/bin/bash nologin_user