Linux学习-28-用户间切换相关命令

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

8.15 Linux su命令用户间切换包含su和su -的区别

  • su 是最简单的用户切换命令通过该命令可以实现任何身份的切换包括从普通用户切换为 root 用户、从 root 用户切换为普通用户以及普通用户之间的切换。普通用户之间切换以及普通用户切换至 root 用户都需要知晓对方的密码只有正确输入密码才能实现切换从 root 用户切换至其他用户无需知晓对方密码直接可切换成功。su 命令的基本格式如下
[root@CncLucZK ~]# su [选项] 用户名
#  #代表root用户
   $代表普通用户 
  • 选项
    • -当前用户不仅切换为指定用户的身份同时所用的工作环境也切换为此用户的环境包括 PATH 变量、MAIL 变量等使用 - 选项可省略用户名默认会切换为 root 用户。
    • -l同 - 的使用类似也就是在切换用户身份的同时完整切换工作环境但后面需要添加欲切换的使用者账号。
    • -p表示切换为指定用户的身份但不改变当前的工作环境不使用切换用户的配置文件。
    • -m和 -p 一样
    • -c 命令仅切换用户执行一次命令执行后自动切换回来该选项后通常会带有要执行的命令。
  • 切换用户后还想在退回到之前的用户在终端输入exit或logouti或使用快捷方式ctrl+d,可以退回到原来用户其实ctrl+d也是执行的exit命令
[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

8.16 Linux whoami和who am i命令用法和区别

  • whoami 命令和 who am i 命令是不同的 2 个命令前者用来打印当前执行操作的用户名后者则用来打印登陆当前 Linux 系统的用户名。如将shell切换到root用户环境
[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 和 who am i 命令的输出是一样的但使用 su 命令切换用户身份后使用 whoami 命令打印的是切换后的用户名而 who am i 命令打印的仍旧是登陆系统时所用的用户名。

执行 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)
  • 使用 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 来确认。

8.22 添加批量用户

  • 添加和删除用户对每位Linux系统管理员都是轻而易举的事比较棘手的是如果要添加几十个、上百个甚至上千个用户时我们不太可能还使用useradd一个一个地添加必然要找一种简便的创建大量用户的方法。Linux系统提供了创建大量用户的工具可以让您立即创建大量用户方法如下
  • 先编辑一个文本用户文件每一列按照/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身份执行命令 /usr/sbin/newusers从刚创建的用户文件user.txt中导入数据创建用户
[root@CncLucZK test]# newusers < user.txt
  • 然后可以执行命令 vipwvi /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:::

  • 执行命令/usr/sbin/pwunconv将 /etc/shadow 产生的 shadow 密码解码然后回写到 /etc/passwd 中并将/etc/shadow的shadow密码栏删掉。这是为了方便下一步的密码转换工作即先取消 shadow password 功能。
[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
  • 以 root 身份执行命令 /usr/sbin/chpasswd:创建用户密码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文件中
  • 确定密码经编码写入/etc/passwd的密码栏后执行命令 /usr/sbin/pwconv 将密码编码为 shadow password并将结果写入 /etc/shadow。
[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:::

  • 这样就完成了大量用户的创建了之后可以到/home下检查这些用户宿主目录的权限设置是否都正确并登录验证用户密码是否正确。
[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 用户和用户组管理

下一篇Linux学习-29-用户组信息相关命令

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux