su 的功能是使用替代用户和组ID运行命令。
用法
su [options] [-] [user [argument...]]
在未指定用户的情况下调用时,su 默认以 root 身份运行交互式 shell。当用户被指定时,可以提供额外的参数,在这种情况下它们被传递给 shell。为了向后兼容,su 默认不改变当前目录,只设置环境变量 HOME 和 SHELL(如果目标用户不是 root,则加上 USER 和 LOGNAME)。建议始终使用 --login 选项(而不是其快捷方式 -)以避免混合环境引起的副作用。
选项
-c,--command=command
将 command 传给shell。
-f,--fast
仅在 csh 和 tcsh 生效,shell 不读取启动文件。
-g,--group=group
指定主要的组,此选项仅对 root 用户可用。
-G,--supp-group=group
指定一个补充组。此选项仅对 root 用户可用。如果选项 --group 未指定,则第一 个指定的补充组也用作主要组。
-,-l,--login
将 shell 作为登录 shell 启动,其环境类似于真实登录:
① 清除除 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 -username -c application &")。 如果启用了伪终端,那么 su 命令将作为会话之间的代理(复制 stdin 和 stdout)。此功能主要用于交互式会话。如果标准输入不是终端,而是例如管道 (echo "date" | su --pty),那么伪终端的 ECHO 标志将被禁用以避免混乱 的输出。
-s,--shell=shell
运行指定的 shell 而不是默认的。根据以下规则依次选择要运行的 shell:
① 使用 --shell 指定的 shell
② 使用环境变量 SHELL 指定的 shell,如果使用了 --preserve-environment 选项
③ 目标用户的 passwd 信息中的 shell
④ /bin/sh
如果目标用户有一个受限的 shell(即没有在 /etc/shells 中列出),除非调用用户 是 root,否则 --shell 选项和 SHELL 环境变量将被忽略。
--session-command=command
类似 -c 但是不创建新的会话(不建议使用)。
-w,--whitelist-environment=list
清除 --login 的环境时,不要重置逗号分隔列表中指定的环境变量。环境变量 HOME、SHELL、USER、LOGNAME 和 PATH 的白名单将被忽略。
-V,--version
展示版本信息后退出。
-h,--help
展示帮助信息后退出。
信号
在接收到 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)的影响。
退出状态
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 配置文件