命令行手册

Man » su 手册在线 - su 手册页的详细在线文档

🌍
su - 使用替代用户和组 ID 运行命令

概要

su [选项] [-] [用户 [参数...]]

描述

su 允许使用替代用户和组 ID 运行命令。

如果不指定用户,则 su 默认运行一个交互式 shell,其身份为 root。 如果指定了用户,则可以提供其他参数,在这种情况下,这些参数将传递给 shell。

为了保持向后兼容性,su 默认情况下不会更改当前目录,并且仅设置环境变量 HOME 和 SHELL(如果目标用户不是 root,则还设置 USER 和 LOGNAME)。 建议始终使用 --login 选项(而不是其快捷方式 -)以避免因混合环境而引起的副作用。

此版本的 su 使用 PAM 进行身份验证、帐户和会话管理。其他 su 实现中找到的一些配置选项,例如对 wheel 组的支持,必须通过 PAM 进行配置。

su 主要设计用于非特权用户,建议特权用户(例如由 root 运行的脚本)使用非设置用户 ID 命令 runuser(1),该命令不需要身份验证并提供单独的 PAM 配置。如果完全不需要 PAM 会话,则建议使用命令 setpriv(1)。

请注意,su 在所有情况下都使用 PAM (pam_getenvlist(3)) 来进行最终的环境修改。 命令行选项(如 --login 和 --preserve-environment)在 PAM 修改环境之前会影响环境。

从版本 2.38 开始,su 会重置进程资源限制 RLIMIT_NICE、RLIMIT_RTPRIO、RLIMIT_FSIZE、 RLIMIT_AS 和 RLIMIT_NOFILE。

选项

-c, --command 命令

将命令作为带有 -c 选项的参数传递给 shell。

-f, --fast

将 -f 传递给 shell,这可能有用,也可能没用,具体取决于 shell。

-g, --group 组

指定主组。此选项仅适用于 root 用户。

-G, --supp-group 组

指定辅助组。此选项仅适用于 root 用户。如果未指定 --group 选项,则第一个指定的辅助组也将用作主组。

-, -l, --login

以类似于实际登录的环境启动 shell。

请注意,在基于 systemd 的系统上,新的会话可以定义为系统的真实入口点。但是,从这个角度来看,su 并不创建真实的会话(通过 PAM)。您需要使用诸如 systemd-run 或 machinectl 之类的工具来启动完整的真实会话。

su 执行以下操作:

清除所有环境变量,但 TERM 和由 --whitelist-environment 指定的变量除外
初始化环境变量 HOME、SHELL、USER、LOGNAME 和 PATH

更改目标用户的家目录

将 shell 的 argv[0] 设置为 '-',以使 shell 成为登录 shell

-m, -p, --preserve-environment
保留整个环境,即不设置 HOME、SHELL、USER 或 LOGNAME。如果指定了 --login 选项,则将忽略此选项。

-P, --pty
为会话创建一个伪终端。独立的终端提供更好的安全性,因为用户不会与原始会话共享终端。这可用于避免 TIOCSTI ioctl 终端注入和其他针对终端文件描述符的安全性攻击。整个会话也可以移动到后台(例如,su --pty - user -c application &)。如果启用了伪终端,则 su 将作为会话之间的代理(同步 stdin 和 stdout)。

此功能主要设计用于交互式会话。如果标准输入不是终端,而是例如管道(例如,echo "date" | su --pty),则将禁用伪终端的 ECHO 标志,以避免混乱的输出。

-s, --shell shell
运行指定的 shell,而不是默认的 shell。如果目标用户具有受限的 shell(即,未列在 /etc/shells 中),则除非调用用户是 root 用户,否则将忽略 --shell 选项和 SHELL 环境变量。

要运行的 shell 将根据以下规则选择,按顺序:

使用 --shell 指定的 shell

如果使用了 --preserve-environment 选项,则使用环境变量 SHELL 中指定的 shell

目标用户密码条目中列出的 shell

/bin/sh

--session-command=command
与 -c 相同,但不要创建新的会话。(不建议。)

-T, --no-pty
不创建伪终端,与 --pty 和 -P 相反。请注意,不使用伪终端会带来通过 TIOCSTI/TIOCLINUX ioctl 命令注入进行特权提升的安全性风险。

-w, --whitelist-environment list
在清除用于 --login 的环境时,不要重置逗号分隔列表中的环境变量。对于环境变量 HOME、SHELL、USER、LOGNAME 和 PATH,将忽略白名单。

-h, --help
显示帮助文本并退出。

-V, --version
显示版本并退出。

信号

收到 SIGINT、SIGQUIT 或 SIGTERM 中的任何一个信号时,su 会终止其子进程,然后使用收到的信号终止自身。子进程将通过 SIGTERM 终止,在未成功尝试且延迟 2 秒后,子进程将通过 SIGKILL 终止。

配置文件

su 读取 /etc/default/su 和 /etc/login.defs 配置文件。以下配置项与 su 相关:

FAIL_DELAY(数字)
发生身份验证失败时,延迟的秒数。该数字必须为非负整数。

ENV_PATH(字符串)
为普通用户定义 PATH 环境变量。默认值为 /usr/local/bin:/bin:/usr/bin。

ENV_ROOTPATH(字符串)、ENV_SUPATH(字符串)
为 root 用户定义 PATH 环境变量。ENV_SUPATH 优先。默认值为 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin。

ALWAYS_SET_PATH (布尔值)

如果设置为 yes,并且未指定 --login 和 --preserve-environment,则 su 会初始化 PATH。

在 /bin 和 /sbin 合并到 /usr 的系统上,环境变量 PATH 可能会有所不同;此变量还受 --login 命令行选项和 PAM 系统设置(例如 pam_env(8))的影响。

退出状态

su 通常返回其执行的命令的退出状态。如果命令被信号终止,则 su 返回信号编号加 128。

su 本身生成的退出状态:

1 执行请求的命令之前发生通用错误

126 无法执行请求的命令

127 找不到请求的命令

文件

/etc/pam.d/su
默认 PAM 配置文件

/etc/pam.d/su-l
如果指定 --login,则为 PAM 配置文件

/etc/default/su
特定于命令的 logindef 配置文件

/etc/login.defs
全局 logindef 配置文件

注意事项

出于安全原因,su 始终将失败的登录尝试记录到 btmp 文件中,但它完全不写入 lastlog 文件。可以使用 PAM 配置来控制 su 行为。如果希望使用 pam_lastlog(8) 模块打印关于失败登录尝试的警告消息,则必须配置 pam_lastlog(8) 以更新 lastlog 文件。例如,通过:

session required pam_lastlog.so nowtmp

历史

此 su 命令源自 coreutils 的 su,后者基于 David MacKenzie 的实现。util-linux 版本已由 Karel Zak 进行重构。

参见

setpriv(1), login.defs(5), shells(5), pam(8), runuser(1)

报告错误

要报告错误,请使用问题跟踪器 [https://github.com/util-linux/util-linux/issues]。

可用性

su 命令是 util-linux 包的一部分,可以从 Linux 内核存档 [https://www.kernel.org/pub/linux/utils/util-linux/] 下载。