「su(1)」-

  LINUX MANUAL PAGES

修改UID或者成为超级用户

命令语法格式

su [options] [username]

命令描述

在会话登录期间,可以使用su命令成为另一个用户。在没有指定username的情况下,默认的username为root,即成为超级用户。

在username之后可以提供附加参数,在这种情况下,这些参数会被提供给用户的登录Shell。特别是,选项-c的参数将使其参数被视为命令来执行。该命令将由/etc/passwd中为username指定的Shell来执行。

您可以使用“–”参数将su选项与提供给Shell的参数分开。

如果命令行参数正确,将提示输入username的密码。密码无效将产生错误消息。所有的操作都会记录到日志中,用于检测系统的滥用。

当前环境变量将传递给新Shell。对于普通用户,$PATH的值重置为/bin:/usr/bin;超级用户则重置为/sbin:/bin:/usr/sbin:/usr/bin。这可以通过更改/etc/login.defs中ENV_PATH和ENV_SUPATH来重新定义。

通过存在“*”作为登录shell的第一个字符来指示是子系统登录。给定的主目录将用作用户实际登录的新文件系统的根目录。

命令支持的选项及含义

命令su支持如下选项:

-c, –command COMMAND
指定Shell将使用其-c选项执行的命令。

被执行的命令没有控制终端。此选项不能用于执行需要控制终端的交互式程序,比如passwd等。

-, -l, –login
提供类似于用户直接登录时所期望的环境变量,即登录Shell。

使用“-”时,“-”必须在任何用户名之前指定。出于可移植性考虑,建议将其用作所有选项的最后一个,并在用户名之前。使用其他两个选项(-l和–login)时,则没有此限制。

-s, –shell SHELL
将被调用的Shell。命令su将以如下顺序确定要使用的Shell,以下优先级有高到低:

  • 首先,使用由–shell选项指定的Shell;
  • 如果使用了–preserve-environment选项,则使用由$SHELL环境变量指定Shell;
  • 在/etc/passwd中查找为目标用户username设置的Shell;
  • 如果上述任何方法都无法找到Shell,则使用/bin/sh;

如果目标用户具有受限制Shell(即在/etc/passwd中此,此用户的Shell字段是未列在/etc/shells中),则不会采用–shell选项或$SHELL环境变量,除非su是被root执行的。

-m, -p, –preserve-environment
保存当前的环境变量,将这些环境变量传递到新用户的环境中。但是不包含下面的环境变量:

$PATH
会根据/etc/login.defs中选项ENV_PATH或ENV_SUPATH的设置进行重置。参考下面的「配置文件」部分。

$IFS
如果设置了该变量,则重置为“<space><tab><newline>”。

如果目标用户具有限制Shell,则该选项无效果(除非是以root调用该命令)。

注意,对环境变量的默认行为如下:

  • 环境变量$HOME, $SHELL, $USER, $LOGNAME, $PATH, $IFS会被重置。
  • 如果没有使用了–login选项,会复制当前环境中的环境变量到username的环境中,但是除了上面列出的环境变量。
  • 如果使用了–login选项,如果当前环境中设置了$TERM, $COLORTERM, $DISPLAY, $XAUTHORITY这几个环境变量,则会被复制到username的环境中。
  • 最后,PAM模块可能会设置一些环境变量。

上面是对环境变量的处理方式。

注意事项

此版本的su有许多编译选项,其中有一些可能在任何特定点中使用。

配置文件

在/etc/login.defs中的以下配置变量会改变useradd命令的行为:

CONSOLE_GROUPS (string)
登录控制台时,添加到用户补充组的组列表(由CONSOLE设置确定)。 默认为none。

谨慎使用,用户可以永久访问这些组,即使不是登录控制台。

DEFAULT_HOME (boolean)
如果我们无法cd到主目录,请指明是否允许登录。默认为no。

如果设置为yes,在无法cd到家目录时,则进入根目录(/)。

ENV_PATH (string)
如果设置,在普通用户登录时,它值将用于定义PATH环境变量。 参数值是以冒号分隔的路径列表(例如/bin:/usr/bin),前面可以加上PATH=。

默认值:PATH=/bin:/usr/bin

ENV_SUPATH (string)
如果设置,在超级用户登录时,它值将用于定义PATH环境变量。 参数值是以冒号分隔的路径列表(例如/sbin:/bin:/usr/sbin:/usr/bin),前面可以加上PATH=。

默认值:PATH=/sbin:/bin:/usr/sbin:/usr/bin

SULOG_FILE (string)
如果定义了该值,所有的su活动都将写入该文件。

SU_NAME (string)
如果定义了该值,在运行“su -”时,则会显示的命令名称。

例如,如果将其值定义为“su”,则执行“ps”命令时将显示命令为“-su”。 如果没有定义,那么“ps”将显示实际运行的Shell的名称,例如 类似“-sh”的东西。

SYSLOG_SU_ENAB (boolean)
启用“syslog”日志记录su活动,此外还会sulog文件(由SULOG_FILE指定)记录日志。

相关文件

/etc/passwd
用户账户信息。

/etc/shadow
安全的用户帐号信息。

/etc/login.defs
软件包Shadow中各个工具的配置文件,用于改变这些工具的行为。

退出状态

当成功时,命令su返回它所执行的命令的退出值。

如果执行的命令被信号终止,则命令su返回的返回值 = 信号值 + 128。

如果su必须终止命令(因为它被要求终止,并且命令没有及时终止),则su返回255。

以下的某些退状态值与执行的命令无关:

0 成功(仅限–help选项)

1 系统或身份验证失败

126 找不到要执行的命令

127 无法执行指定的命令

相关手册

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

参考文献

  • man 1 su, Version shadow-utils 4.4

更新日志

  • 07/21/2018 创建文章