[root@CncLucZK ~]# su [选项] 用户名
# #代表root用户
$代表普通用户
[root@CncLucZK ~]# su - zk #"-"代表连带环境变量一起切换,不能省略
Last login: Fri Oct 14 23:08:16 CST 2022 on pts/1
[zk@CncLucZK ~]$ su -
Password: #输入 root 用户的密码
Last login: Sat Oct 15 09:33:21 CST 2022 from 116.115.8.116 on pts/0
Last failed login: Sat Oct 15 09:36:06 CST 2022 on pts/0
There was 1 failed login attempt since the last successful login.
[root@CncLucZK ~]#
[zk@CncLucZK ~]$ whoami
zk
[zk@CncLucZK ~]$ su --c 'useradd u-dev2' root
Password:
[zk@CncLucZK ~]$ whoami
zk
[zk@CncLucZK ~]$ su -c 'passwd -S u-dev2' root
Password:
u-dev2 LK 2022-10-15 0 99999 7 -1 (Password locked.)
[zk@CncLucZK ~]$ grep 'u-dev2' /etc/passwd
u-dev2:x:1004:1004::/home/u-dev2:/bin/bash
[zk@CncLucZK ~]$ whoami
zk
[zk@CncLucZK ~]$ su - u-dev1
Password:
Last login: Fri Oct 14 22:25:55 CST 2022 on pts/1
Last failed login: Sat Oct 15 10:39:14 CST 2022 on pts/0
There were 3 failed login attempts since the last successful login.
[u-dev1@CncLucZK ~]$ whoami
u-dev1
[u-dev1@CncLucZK ~]$ exit
logout
[zk@CncLucZK ~]$ whoami
zk
su 和 su - 的区别:注意,使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行(无法使用 service 命令等)。如:普通用户 zk通过 su 命令切换成 root 用户,但没有使用 - 选项,这样情况下,虽然看似是 root 用户,但系统中的 $PATH 环境变量依然是 zk的(而不是 root 的),因此当前工作环境中,并不包含 /sbin、/usr/sbin等超级用户命令的保存路径,这就导致很多管理员命令根本无法使用。不仅如此,当 root 用户接受邮件时,会发现收到的是 zk用户的邮件,因为环境变量 $MAIL 也没有切换。
通过下面这个例子,可直观的看到 su 和 su - 的区别:可以看到,在不使用 su - 的情况下,虽然用户身份成功切换,但环境变量依旧用的是原用户的,切换并不完整。
[zk@CncLucZK ~]$ whoami #查询用户身份,我是zk
zk
[zk@CncLucZK ~]$ su root #输入root密码
Password: #切换到root,但是没有切换环境变量。注意:普通用户切换到root需要密码
[root@CncLucZK zk]# whoami
root
[root@CncLucZK zk]# echo $MAIL
/var/spool/mail/zk
[root@CncLucZK zk]# env |grep zk #查看环境变量,提取包含zk的行
#用户名还是zk,而不是root
USER=zk
PWD=/home/zk
#命令査找的路径不包含超级用户路径
MAIL=/var/spool/mail/zk
LOGNAME=zk
PATH=/home/zk/.local/bin:/home/zk/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
#邮箱、主目录、目前用户名还是lamp
[root@CncLucZK ~]# who am i
root pts/0 2022-10-15 09:33 (116.115.8.116)
[root@CncLucZK ~]# whoami
root
#在此基础上,使用 su 命令切换到 zk 用户下,再执行一遍上面的命令:
[zk@CncLucZK ~]$ who am i
root pts/0 2022-10-15 09:33 (116.115.8.116)
[zk@CncLucZK ~]$ whoami
zk
执行 whoami 命令,等同于执行 id -un 命令;执行 who am i 命令,等同于执行 who -m 命令。
[zk@CncLucZK ~]$ id -un zk [zk@CncLucZK ~]$ who -m root pts/0 2022-10-15 09:33 (116.115.8.116)
- 1
- 2
- 3
- 4
使用 su 或者 sudo 命令切换用户身份,whoami会通过,但who am i无法通过。要解释这背后的运行机制,需要搞清楚什么是实际用户(UID)和有效用户(EUID,即 Effective UID)。
实际用户,指的是登陆 Linux 系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的;而有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su 或者 sudo 命令进行任意切换的。
一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,它们会出现差异。需要注意的是,实际用户和有效用户出现差异,切换用户并不是唯一的触发机制,至于其他的触发条件,后续章节会做详细介绍。
那么,whoami 和 who am i通常应用在哪些场景中呢?通常,对那些经常需要切换用户的系统管理员来说,经常需要明确当前使用的是什么身份;另外,对于某些 shell 脚本,或者需要特别的用户才能执行,这时就需要利用 whoami 命令来搞清楚执行它的用户是谁;甚至还有一些 shell 脚本,一定要某个特别用户才能执行,即便使用 su 或者 sudo 命令切换到此身份都不行,此时就需要利用 who am i 来确认。
/etc/passwd
密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下:[root@CncLucZK test]# cat user.txt
user01:x:1010:1010:user dec1:/home/user01:/bin/bash
user02:x:1003:1011:user dec2:/home/user02:/bin/bash
[root@CncLucZK test]# newusers < user.txt
vipw
或 vi /etc/passwd
检查 /etc/passwd
文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建。[root@CncLucZK test]# newusers < user.txt
[root@CncLucZK test]# grep user /etc/passwd /etc/shadow
...
/etc/passwd:user01:x:1010:1010:user dec1:/home/user01:/bin/bash
/etc/passwd:user02:x:1003:1011:user dec2:/home/user02:/bin/bash
/etc/shadow:user01:$6$4nRCI2BqG8/$MUVJvj4AUHvCigCJa209ALwmtlqqb7x89/akPLQV4C5tvtxQSSyGF.N74HQimPyAezJl9riS.Q/0vHCJ1u1Nm1:19281:0:99999:7:::
/etc/shadow:user02:$6$Lw1xW/zJ..P/i$S075Qq.758w3Q9XdPM0cVWVI.QDKehsOHnb5EbVhl4LrDTKa/RLFx2GHhhQ2HCDIghuNJJbpSEx8vINhXvnnw.:19281:0:99999:7:::
[root@CncLucZK test]# pwunconv
[root@CncLucZK test]# grep user /etc/passwd /etc/shadow
/etc/passwd:user01:$6$4nRCI2BqG8/$MUVJvj4AUHvCigCJa209ALwmtlqqb7x89/akPLQV4C5tvtxQSSyGF.N74HQimPyAezJl9riS.Q/0vHCJ1u1Nm1:1010:1010:user dec1:/home/user01:/bin/bash
/etc/passwd:user02:$6$Lw1xW/zJ..P/i$S075Qq.758w3Q9XdPM0cVWVI.QDKehsOHnb5EbVhl4LrDTKa/RLFx2GHhhQ2HCDIghuNJJbpSEx8vINhXvnnw.:1003:1011:user dec2:/home/user02:/bin/bash
grep: /etc/shadow: No such file or directory
用户名:密码
实例文件 passwd.txt
内容如下:
user01:123456
user02:123456
chpasswd
会将经过 /usr/bin/passwd
命令编码过的密码写入 /etc/passwd
的密码栏。确定密码经编码写入/etc/passwd的密码栏后。[root@CncLucZK test]# vi passwd.txt
[root@CncLucZK test]# chpasswd < passwd.txt
[root@CncLucZK test]# grep user /etc/passwd /etc/shadow
/etc/passwd:user01:$6$eFL/r/bByqMA$U1RmOwaGvKnR6eYc3LrWLij2r6xoSvVMZQq/COOgMKDkkkas8JdjOHZzmxPq07vqk/s2lkYYwyZbLyjWGrBv21:1010:1010:user dec1:/home/user01:/bin/bash
/etc/passwd:user02:$6$YftLR/Ot$INIIidOOOC3DPElJIbWaof5ZJKs39H885PuSdjqroIINca9olA6s4AJ/vCKagwWwsw.04bTOwYJzTU1qMEep6.:1003:1011:user dec2:/home/user02:/bin/bash
#密码和初始密码不一样了,说明passwd.txt中的密码已经被转码到/etc/passwd文件中
[root@CncLucZK test]# pwconv
[root@CncLucZK test]# grep user /etc/passwd /etc/shadow
/etc/passwd:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
/etc/passwd:zk:x:1002:1002:commons user:/home/zk:/bin/bash
/etc/passwd:u-dev1:x:1003:1003:devloper user:/home/u-dev1:/bin/bash
/etc/passwd:user01:x:1010:1010:user dec1:/home/user01:/bin/bash
/etc/passwd:user02:x:1003:1011:user dec2:/home/user02:/bin/bash
/etc/shadow:user01:$6$eFL/r/bByqMA$U1RmOwaGvKnR6eYc3LrWLij2r6xoSvVMZQq/COOgMKDkkkas8JdjOHZzmxPq07vqk/s2lkYYwyZbLyjWGrBv21:19281:0:99999:7:::
/etc/shadow:user02:$6$YftLR/Ot$INIIidOOOC3DPElJIbWaof5ZJKs39H885PuSdjqroIINca9olA6s4AJ/vCKagwWwsw.04bTOwYJzTU1qMEep6.:19281:0:99999:7:::
[root@CncLucZK home]# su - user01
[user01@CncLucZK ~]$ su - user02
Password:
Last login: Sun Oct 16 15:10:50 CST 2022 on pts/0
#user01和user02可以正常切换
[user02@CncLucZK ~]$ pwd
/home/user02
#可以正常执行/bin/bash命令
参考文献:
Linux su命令:用户间切换(包含su和su -的区别)
Linux 用户和用户组管理