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-用户组信息相关命令

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

  1. Linux学习整理-用户与组相关的命令-who,whoami,w,id,logname

    1. id 打印当前的用户和组的 print real and effective user and group IDs(打印真实有效的用户和组的ID) [root@centos cmdtest]# ...

  2. Linux学习笔记6——文本处理相关命令

    查看文本:cat,tac,more,less,head,tail 文本处理:cut,sort,uniq,wc,tr database:数据库 关系型数据库: 表:二维表 文本文件: Tom:23:ma ...

  3. linux学习之用户的切换

    普通用户: 输入su 用户名,点击Enter Root用户: 输入su root,点击Enter 输入登录密码,点击Enter 转载于:https://www.cnblogs.com/huangwei ...

  4. linux用户及用户组相关命令

    用户及用户组相关命令: 1. 新建一个用户,修改密码 useradd 用户名 [root@node ~]# useradd ffcc [root@node ~]# cat /etc/passwd   ...

  5. Linux学习笔记(二)|常用命令

    Linux学习笔记(二)常用命令 1.文件处理命令 1.1命令格式与目录处理 -ls 功能描述:显示目录文件 原意:list 所在路径:/bin/ls 语法: ls-a 显示所有文件,包括隐藏文件 l ...

  6. Linux之获取管理员权限的相关命令

    Linux之获取管理员权限的相关命令 1. sudo命令的使用 命令 说明 sudo -s 切换到root用户,获取管理员权限 sudo 某个命令的执行需要获取管理员权限可以在执行命令前面加上sudo ...

  7. linux 的基本命令格式,Linux学习之路(一)命令基本格式

    据统计Linxu里面能够识别的命令超过3000个,而我们常用的Linux基本命令在60个左右.常用命令是我们必须掌握的命令,需要我们多练习才能记住,最起码要敲3遍以上. 简单的把常用命令分为以下几大类 ...

  8. linux防火墙开放所有端口命令,linux centos7 防火墙及端口开放相关命令

    一.防火墙相关命令 1.查看防火墙状态 : systemctl status firewalld.service 注:active是绿的running表示防火墙开启 2.关闭防火墙 :systemct ...

  9. linux服务器开放指定端口号相关命令

    linux服务器开放指定端口号相关命令 1.查看已开放的端口 firewall-cmd --list-ports 2.放行指定端口 firewall-cmd --zone=public --add-p ...

最新文章

  1. Elasticsearch-04 ES中的术语和基本用法
  2. 数据库连接池技术--BoneCP
  3. Java初学者需掌握的4大核心基础知识
  4. 索引 - 数据结构 - B+TREE
  5. mysql数据库迁移到另一台电脑上
  6. 山东省计算机考试无法报名,山东省2017年9月全国计算机等级考试报名事项公告...
  7. css如何让图片不平铺,css怎么设置图片不平铺
  8. 【模拟信号】基于matlab调相信号产生+解调【含Matlab源码 987期】
  9. cydia加载未能连接服务器请求超时,win7专业版中cydia无法加载请求超时解决方案...
  10. 08python 主函数调用子函数
  11. QT重写QLabel画框并透明化背景
  12. python中for循环的用法a+aa+aaa-Python练习题 013:求解a+aa+aaa……
  13. p2p-如何拯救k8s镜像分发的阿喀琉斯之踵
  14. 【Mac实用技巧】Mac如何修复YouTube视频黑屏现象?
  15. 记一次学习爬取豆瓣数据于Excel表的爬虫
  16. 计算机u盘读不出来,详细教你解决电脑读不出u盘
  17. 【读书笔记】《码农翻身》——一本差点被书名耽误的好书
  18. 利用空闲服务器搭建frps服务端-实现穿透代理
  19. Google登录授权详细过程
  20. 怎么检查计算机硬盘有没有供电,怎么检测电脑硬盘有没有损坏

热门文章

  1. 项目管理-功能数据流程图
  2. 动态箭头gif图标_ScreenToGif:电脑屏幕录制生成gif格式图片软件
  3. redis数据丢失及解决
  4. webpack 处理es6转es5需要使用babel-loader
  5. #71 go-ini 配置库评析 by 无闻(unknwon)【 Go 夜读 】
  6. Thinkphp+layui数据表格实现表格分页
  7. 为什么需要串级PID控制(结合智能小车,四轴飞行器来解释)
  8. Java8集合过滤操作
  9. Java IO篇:什么是零拷贝?
  10. C++程序设计课程设计