Linux学习-28-用户间切换相关命令
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
- 然后可以执行命令
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:::
- 执行命令/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-用户间切换相关命令相关推荐
- Linux学习整理-用户与组相关的命令-who,whoami,w,id,logname
1. id 打印当前的用户和组的 print real and effective user and group IDs(打印真实有效的用户和组的ID) [root@centos cmdtest]# ...
- Linux学习笔记6——文本处理相关命令
查看文本:cat,tac,more,less,head,tail 文本处理:cut,sort,uniq,wc,tr database:数据库 关系型数据库: 表:二维表 文本文件: Tom:23:ma ...
- linux学习之用户的切换
普通用户: 输入su 用户名,点击Enter Root用户: 输入su root,点击Enter 输入登录密码,点击Enter 转载于:https://www.cnblogs.com/huangwei ...
- linux用户及用户组相关命令
用户及用户组相关命令: 1. 新建一个用户,修改密码 useradd 用户名 [root@node ~]# useradd ffcc [root@node ~]# cat /etc/passwd ...
- Linux学习笔记(二)|常用命令
Linux学习笔记(二)常用命令 1.文件处理命令 1.1命令格式与目录处理 -ls 功能描述:显示目录文件 原意:list 所在路径:/bin/ls 语法: ls-a 显示所有文件,包括隐藏文件 l ...
- Linux之获取管理员权限的相关命令
Linux之获取管理员权限的相关命令 1. sudo命令的使用 命令 说明 sudo -s 切换到root用户,获取管理员权限 sudo 某个命令的执行需要获取管理员权限可以在执行命令前面加上sudo ...
- linux 的基本命令格式,Linux学习之路(一)命令基本格式
据统计Linxu里面能够识别的命令超过3000个,而我们常用的Linux基本命令在60个左右.常用命令是我们必须掌握的命令,需要我们多练习才能记住,最起码要敲3遍以上. 简单的把常用命令分为以下几大类 ...
- linux防火墙开放所有端口命令,linux centos7 防火墙及端口开放相关命令
一.防火墙相关命令 1.查看防火墙状态 : systemctl status firewalld.service 注:active是绿的running表示防火墙开启 2.关闭防火墙 :systemct ...
- linux服务器开放指定端口号相关命令
linux服务器开放指定端口号相关命令 1.查看已开放的端口 firewall-cmd --list-ports 2.放行指定端口 firewall-cmd --zone=public --add-p ...
最新文章
- Elasticsearch-04 ES中的术语和基本用法
- 数据库连接池技术--BoneCP
- Java初学者需掌握的4大核心基础知识
- 索引 - 数据结构 - B+TREE
- mysql数据库迁移到另一台电脑上
- 山东省计算机考试无法报名,山东省2017年9月全国计算机等级考试报名事项公告...
- css如何让图片不平铺,css怎么设置图片不平铺
- 【模拟信号】基于matlab调相信号产生+解调【含Matlab源码 987期】
- cydia加载未能连接服务器请求超时,win7专业版中cydia无法加载请求超时解决方案...
- 08python 主函数调用子函数
- QT重写QLabel画框并透明化背景
- python中for循环的用法a+aa+aaa-Python练习题 013:求解a+aa+aaa……
- p2p-如何拯救k8s镜像分发的阿喀琉斯之踵
- 【Mac实用技巧】Mac如何修复YouTube视频黑屏现象?
- 记一次学习爬取豆瓣数据于Excel表的爬虫
- 计算机u盘读不出来,详细教你解决电脑读不出u盘
- 【读书笔记】《码农翻身》——一本差点被书名耽误的好书
- 利用空闲服务器搭建frps服务端-实现穿透代理
- Google登录授权详细过程
- 怎么检查计算机硬盘有没有供电,怎么检测电脑硬盘有没有损坏