草庐IT

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

褚师子书 2023-10-06 原文

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. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  5. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  6. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  7. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  10. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

随机推荐