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 的用户(建议此类用户极少,甚至没有)养成始终在运行 su 命令时使用 -l/--login 选项的习惯。该选项有两个效果:
- 通过以该用户身份“登录”,将当前目录切换到新用户的主目录(例如,对于 root 用户,切换到
/root)。 - 根据新用户 Shell 的运行时配置文件,将环境变量更改为新用户的变量。也就是说,当前目录和环境将被更改为新用户实际登录新会话时所期望的状态(而不仅仅是接管一个现有会话)。
因此,管理员通常应按如下方式使用 su:
$ su -l
添加用户名 root 也会产生相同的结果:
$ su -l root
同样,这也可以用于任何其他用户(例如,用户名为 archie 的用户):
# su -l archie
要登录一个没有密码的用户,请先以 root 身份登录,然后从 root shell 中登录到该无密码用户账户:
$ su -l # runuser -l archie
- 你有时会看到人们使用
su -而不是su -l/su --login来获取登录 Shell。不建议使用这种简写,因为-选项可能会遇到解析限制,请参阅 su(1) § DESCRIPTION。 - 你可能希望为此添加一个别名:
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