Linux【5】-用户管理2-切换用户su

su 是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为 root 用户、从 root 用户切换为普通用户以及普通用户之间的切换。

普通用户之间切换以及普通用户切换至 root 用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换;从 root 用户切换至其他用户,无需知晓对方密码,直接可切换成功。

  • 系统平日操作使用普通用户是一个好习惯,在有需要时, 才切换为 root 进行操作,以避免一时头脑糊涂或者手指抽筋,做出键入“ rm - rf /” 命令等不可挽救的事情来;
  • 用较低权限执行系统服务能够保证系统安全,有的时候,我们必须要 以某些系统账号运行程序。 举例来说, Linux 主机上面的 WWW 服 务器 Apache,我们可以额外建立一个名为 apache 的用户来启动 Apache 守护进程,如此一来,如果这个程序被黑,至少整个系统不 至于都被黑了。

一、命令说明

su 命令的基本格式如下:

[root@localhost ~]# su [选项] 用户名

选项:

-:当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),使用 - 选项可省略用户名,默认会切换为 root 用户。
-l:同 - 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。--login加了这个参数之后,就似乎是重新登陆为该使用者一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。假如没有指定USER,缺省情况是root。
-p:表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。
-m:和 -p 一样;--preserve-environment:执行su时不改变环境变数。
-c 命令:仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。
-f , --fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。
-c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
USER:欲变更的使用者账号,ARG传入新的Shell参数。

【例 1】

[lamp@localhost ~]$ su -root
密码: <-- 输入 root 用户的密码
#"-"代表连带环境变量一起切换,不能省略

【例 2】

[lamp@localhost ~]$ whoami
lamp
#当前我是lamp

[lamp@localhost ~]$ su - -c "useradd user1" root
密码:
#不切换成root,但是执行useradd命令添加user1用户
[lamp@localhost ~]$ whoami
lamp
#我还是lamp
[lamp@localhost ~]$ grep "user1' /etc/passwd
userl:x:502:504::/home/user1:/bin/bash
#user用户已经添加了

除了像例 2 这样,执行一条命令后用户身份会随即自动切换回来,其他切换用户的方式不会自动切换,只能使用 exit 命令进行手动切换,例如:

[lamp@localhost ~]$ whoami
lamp
#当前我是lamp
[lamp@localhost ~]$ su - lamp1
Password:   <--输入lamp1用户的密码
#切换至 lamp1 用户的工作环境
[lamp@localhost ~]$ whoami
lamp1
#什么也不做,立即退出切换环境
[lamp1@localhost ~]$ exit
logout
[lamp@localhost ~]$ whoami
lamp

二、讨论

2.1 su 和 su - 的区别

注意,使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。

举个例子,普通用户 lamp 通过 su 命令切换成 root 用户,但没有使用 - 选项,这样情况下,虽然看似是 root 用户,但系统中的 $PATH 环境变量依然是 lamp 的(而不是 root 的),因此当前工作环境中,并不包含 /sbin、/usr/sbin等超级用户命令的保存路径,这就导致很多管理员命令根本无法使用。不仅如此,当 root 用户接受邮件时,会发现收到的是 lamp 用户的邮件,因为环境变量 $MAIL 也没有切换。 初学者可以这样理解它们之间的区别,即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误(例如无法使用 service 命令)。

通过下面这个例子,可直观的看到 su 和 su - 的区别:

[lamp@localhost ~]$ whoami
lamp
#查询用户身份,我是lamp
[lamp@localhost ~]$ su root
密码:
<-输入root密码
#切换到root,但是没有切换环境变量。注意:普通用户切换到root需要密码

[root@localhost ~]# env | grep lamp
#查看环境变量,提取包含lamp的行
USER=lamp
#用户名还是lamp,而不是root
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lamp/bin
#命令査找的路径不包含超级用户路径
MAIL=/var/spool/mail/lamp
PWD=/home/lamp
LOGNAME=lamp
#邮箱、主目录、目前用户名还是lamp

可以看到,在不使用 su - 的情况下,虽然用户身份成功切换,但环境变量依旧用的是原用户的,切换并不完整。

用echo $PATH命令看一下su和su -以后的环境变量有何不同。

  • su 后面不加用户是默认切到 root
  • su username是不改变当前变量
  • su - username是改变为切换到用户的变量

也就是说su只能获得root的执行权限,不能获得环境变量; 而su -是切换到root并获得root的环境变量及执行权限

以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。

2.2 安全性

  • su 的确方便,只要把 root 的密码交给任何一个普通用户,他都能切 换到 root 来完成所有的系统管理工作;但通过 su 也带来了不安全因 素;例如系统有 10 个用户,而且都参与管理。如果这 10 个用户都 涉及到 root 权限的运用,作为系统管理员如果想让其它用户通过 su 来切换到 root,必须把 root 权限密码都告诉这 10 个用户。这在一定 程度上就对系统的安全造成了威胁。“没有不安全的系统,只有不安 全的人”,我们绝对不可能保证这 10 个用户都能按正常操作规程来管 理系统,其中任何一人对系统操作的重大失误,都可能导致不可挽回 的后果;
  • 所以 su 在多人参与的系统管理中,并不是最好的选择,su 只适用于 一两个人参与管理的系统。在其他情况下,一般会选择使用 sudo(请 参考“sudo 和/etc/sudoers 目录”);
  • root 密码应该掌握在少数人手中,这绝对是 Linux 系统管理员的真理!

三、报错

[root@c01 ~]# su -l pp Last login: Fri Apr 13 10:19:04 CST 2018 on pts/12 su: failed to execute /bin/bash: Resource temporarily unavailable

vim /etc/security/limits.d/20-nproc.conf

*          soft    nproc     4096
root       soft    nproc     unlimited

将 4096 改成 65535

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn