SU(1)

名称
su - 更改用户 ID 或成为超级用户

大纲

su [选项] [用户名]

描述

su 用于让用户在登录期间变成另外一个用户。后边不带 username 使用时，su 默认会变成超级用户。可选的选项 -，可以用于提供一个类似于用户直接登录的环境，用户可能期望是这样的。

附加参数可以在用户名之后提供，这时，将会把他们提供给用户的登录 shell。特别地，参数 -c 将会使下一个参数被多数命令解释器视为命令。这个命令会被 /etc/passwd 中为目标用户指定的 shell 执行。

您可以使用 -- 参数将 su 选项和提供给 shell 的参数分隔开来。

如果合适，将提示用户输入一个密码。输入无效的密码会产生一个错误消息。所有的尝试，无论成功还是失败，都会被记录，以检测对系统的滥用。

当前环境会传递给新 shell。对于普通用户，$PATH 的值重置为 /bin:/usr/bin，而对于超级用户则是 /sbin:/bin:/usr/sbin:/usr/bin。这会随 /etc/login.defs 中的 ENV_PATH 和 ENV_SUPATH 值改变。

在登录 shell 中以第一个字符是“*”标注的是子系统登录。给定的主目录将被用于用户实际登录的新文件系统的根。

选项

su 命令可以接受的选项有：

-c, --command COMMAND
    通过使用其 -c 选项，指定一个由 shell 运行的命令。

    The executed command will have no controlling terminal. This option cannot be used to execute interactive programs which need a controlling TTY.

-, -l, --login
    提供一个类似于用户直接登录的环境，用户可能会希望这样。

    When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.

-s, --shell SHELL
    将使用的 shell。

    使用的 shell 在如下中选择(高优先级在前)：.PP
        通过 --shell 指定的 shell。

        如果使用了 --preserve-environment，shell 将由 $SHELL 环境变量指定。

        在 /etc/passwd 的相应项中为目标用户指定的 shell。

        如果无法通过以上办法找到一个 shell，则使用 /bin/sh。

    如果目标用户的 shell 是有限制的(即，/etc/passwd 中用户项中的 shell 字段没有在 /etc/shells 中列出)，那么 --shell 选项或 $SHELL 环境变量不会带入账户，除非 su 是被 root 调用的。

-m, -p, --preserve-environment
    保留当前环境，除非：.PP $PATH
        根据 /etc/login.defs 中的 ENV_PATH or ENV_SUPATH 选项重设 (请往下看)

    $IFS
        如果已经设置了，重设 “<space><tab><newline>”。

    如果用户的 shell 受限，此选项无效 (除非是 root 调用的 su)。

    注意，环境的默认行为如下：.PP
        The $HOME, $SHELL, $USER, $LOGNAME, $PATH, 和 $IFS 这些环境变量会被重置。

        如果没有使用 --login，复制环境，上述几个变量除外。

        如果使用了 --login，如果设置了 $TERM, $COLORTERM, $DISPLAY 和 $XAUTHORITY，这些环境变量也会被重置。

        如果使用了 --login，环境变量 $TZ, $HZ, and $MAIL 也会根据 /etc/login.defs 中的选项 ENV_TZ, ENV_HZ, MAIL_DIR 和 MAIL_FILE 重置 (请看下边)。

        如果使用了 --login，其它环境变量可能会根据 ENVIRON_FILE 文件来设置(请看下边)。

CAVEATS

此版本的 su 有很多编译选项，在某些机器上，可能只使用了其中的一部分。

配置文件

在 /etc/login.defs 中有如下配置变量，可以用来更改此工具的行为：

CONSOLE (string)
    如果定义了，或者是包含设备名(没行一个)的文件的完整路径名，或者是“:”分隔的设备名列表。将只会在这写设备上允许 root 登录。

    如果没有定义，可以在任何设备上使用 root。

    指定的设备时不带 /dev/ 前缀。

CONSOLE_GROUPS (string)
    在控制台登录时，添加到用户附加组集中的组列表(就如 CONSOLE 所确定的)。默认是无。 使用时需要注意：这可能使用户获取这些组的永久权限，甚至登录到的不是此控制台时。

DEFAULT_HOME (boolean)
    如果不能 cd 到主目录时，说明是否允许登录。默认是否。

    如果设置为 yes，如果不能 cd 到主目录时，用户将会登录到根目录(/)。

ENV_HZ (string)
    如果设置了，将会用于在用户登录时定义 HZ 环境变量。值必须以 HZ= 开头。Linux 上的常用值是 HZ=100。

ENVIRON_FILE (string)
    如果此文件存在，并且可读，将会从中读取登录环境。所有行都必须是 name=value 的格式。

    以 # 开头的行将视为注释，并被忽略。

ENV_PATH (string)
    If set, it will be used to define the PATH environment variable when a regular user login. The value is a colon separated list of paths (for example /bin:/usr/bin) and can be preceded by PATH=. The default value is PATH=/bin:/usr/bin.

ENV_SUPATH (string)
    If set, it will be used to define the PATH environment variable when the superuser login. The value is a colon separated list of paths (for example /sbin:/bin:/usr/sbin:/usr/bin) and can be preceded by PATH=. The default value is PATH=/sbin:/bin:/usr/sbin:/usr/bin.

ENV_TZ (string)
    如果设置了，它将用于在用户登录时定义 TZ 环境变量。此值可以是以 TZ= 开头的时区名(例如 TZ=CST6CDT)，或者是包含时区规则的文件完整路径(例如 /etc/tzname)。

    如果将完整路径指定为了一个不存在或不可读的文件，则默认使用 TZ=CST6CDT。

LOGIN_STRING (string)
    此字符串用于提示输入密码。默认是 "Password: "，或者翻译了的结果(汉语中翻译为了“密码：”)。如果设置了此变量，提示不会被翻译。

    如果字符串包含 %s，将会被用户名替换。

MAIL_CHECK_ENAB (boolean)
    启用登录时检查和现实邮箱状态。

    如果 shell 的启动文件已经检查了邮件("mailx -e" 或者其它同功能的工具)，您应该禁用它。

MAIL_DIR (string)
    邮箱目录。修改或删除用户账户时需要处理邮箱，如果没有指定，将使用编译时指定的默认值。

MAIL_FILE (string)
    定义用户邮箱文件的位置(相对于主目录)。

MAIL_DIR and MAIL_FILE 变量由 useradd，usermod 和 userdel 用于创建、移动或删除用户邮箱。

如果 MAIL_CHECK_ENAB 设置为 yes，它们也被用于定义 MAIL 环境变量。

QUOTAS_ENAB (boolean)
    Enable setting of resource limits from /etc/limits and ulimit, umask, and niceness from the user's passwd gecos field.

SULOG_FILE (string)
    如果定义了，所有的 su 活动都会记录到此文件。

SU_NAME (string)
    如果定义了，就是运行“su -”时显示的命令名称。例如，如果定义为“su”，那么“ps”会显示此命令为“-su”。如果没有定义，“ps”将会显示实际执行的 shell，例如类似于“-sh”。

SU_WHEEL_ONLY (boolean)
    如果为 yes，用户必须在 /etc/group 中别设定为 GID 为 0 的组(在大部分 Linux 上叫 root)的成员。

SYSLOG_SU_ENAB (boolean)
    除了 sulog 文件日志，也为 su 活动启用“syslog”日志。

USERGROUPS_ENAB (boolean)
    如果 uid 和 gid 相同，用户名和主用户名也相同，使非 root 组的组掩码位和属主位相同 (如：022 -> 002, 077 -> 007)。

    如果设置为 yes，如果组中没有成员了，userdel 将移除此用户组，useradd 创建用户时，也会创建一个同名的默认组。

文件

/etc/passwd
    用户账户信息。

/etc/shadow
    安全用户账户信息。

/etc/login.defs
    Shadow 密码套件配置。

退出值

成功时，su 返回执行的命令的退出值。

如果命令被信号结束，su 返回此信号的编号加 128。

如果 su 必须要杀死此命令(因为已经要求它结束，可是却没有及时结束)，su 返回 255。

su 中的某些退出值与执行的命令无关：

0
    成功 (只有 --help)

1
    系统或者认证失败

126
    要求的命令不存在

127
    请求的命令不能执行

参见

login(1), login.defs(5), sg(1), sh(1).