Linux 系统基础 — 用户和组(吐血总结,超详细,看这一篇就够了!dog)

Linux 用户和组

  • Linux中用户和组的相关文件
    • /etc/passwd
    • /etc/shadow
    • /etc/group
    • Linux用户
    • Linux中的组
    • 用户操作
      • useradd的更多使用方式
      • passwd 命令使用方式
      • userdel 删除用户的用法
      • usermod 修改用户
    • 关于 useradd 命令后台执行情况
    • Linux的文件保护

Linux中用户和组的相关文件

最重要的两个文件内容

  1. /etc/passwd : 这是 Linux 中储存用户信息的一个文件,每一行对应一个用户的账号记录;
  2. /etc/shadow : 这是 Linux 中用来储存用户名和密码的一个文件,文件一行内容对应一个用户名和一个密码;
  3. /etc/group : 这是 Linux 中用来储存用户和组关系的一个文件。
    我们来一个一个对它们的内容进行解析

/etc/passwd

我们首先查看 /etc/passwd 的文件内容:

cat /etc/passwd

Linux 系统基础 — 用户和组(吐血总结,超详细,看这一篇就够了!dog)_第1张图片
唔 文件内容太长了,我们单独挑出一行内容来对其核心部分进行解释

root:x:0:0:root:/root:/bin/bash
# 选中文件内容的第一行,root用户的相关信息
# 以冒号为分隔符,将它分为 7 个部分
root	x	0	0	root	/root	/bin/bash
1		2	3	4	5		6		7
字段 含义
1 用户名
2 密码
3 用户账号的UID
4 所属主要组的GID
5 用户描述信息
6 家目录
7 登陆 shell 信息

这里对密码段的内容进行解释,现在 Linux 的密码不再存放在 passwd 文件里了,现在的密码已经放到 /etc/shadow 文件中了,只是用 x 充当一个占位符。

/etc/shadow

cat /etc/shadow

(这里不再过多展示图片了,直接截取第一行 root 用户的相关信息进行展示)

root:$6$jclnGz.Ft4JORmf5$s9CmchcHqxDhVQPx7UGxq2icymWkO.Y8Kpxd5MXj330.JAAWKvg82YS074spsqWWU5EGjLQ08e.kgcGqJ6rcP1::0:99999:7:::
 - 还是按照惯例将冒号作为分割符
root:	1
$6$jclnGz.Ft4JORmf5$s9CmchcHqxDhVQPx7UGxq2icymWkO.Y8Kpxd5MXj330.JAAWKvg82YS074spsqWWU5EGjLQ08e.kgcGqJ6rcP1: 2	
:		3	
0: 		4
99999:	5
7:		6
::		7

字段 含义
1 用户名
2 加密的密码字串信息
3 上次修改密码的时间
4 密码最短有效天数,默认为0
5 密码最长有效天数,默认为99999
6 提前多少天警告用户口令将要过期,默认为7
7 在密码过期多少天后就禁用该用户

这里也简单提一下第二个密码字段:如果是 */!! 的话就代表没有设置密码不能登陆。

练习题:统计哪些没有设置密码的用户,输出用户名和数量
awk可以解决,如果不会可以了解一下
cat /etc/shadow |awk -F: 'BEGIN{i=0} $2 ~ /!!|*/ {i++;print $1"没有设置密码"}END{print "一共有"i"个用户没有设置密码"}'

/etc/group

cat /etc/group

 - 选取root的group信息
root:x:0: ==> 组名:密码占位符:gid:

Linux用户

Linux中的用户是什么样的呢?
两个比较简单的命令: 1 - useradd 可以新建用户;2 - id 可以查看用户的id号:

useradd ameame

id ameame

我们可以看一下运行得到的结果:
在这里插入图片描述

useradd ameame
id ameame
uid=1005(ameame) gid=1005(ameame)=1005(ameame)

这里我们看到 id 命令输出的结果有 3 个: uid、gid、组:

名称 作用
uid user id 相当于 Linux 中用户的身份证号
gid group id ,group 是 Linux 中的组,相当于组的身份证号
一个账户可以属于多个组,组里面存放用户存在的组名集合

Linux 中的用户分为:

  1. 超级用户 - root uid 为 0;
  2. 程序用户 - uid 为 1 - 999 ( 准确点应该是 201 -999 ) ;
  3. 普通用户 - uid 大于等于 1000,默认从1000开始,60000截止,但是这里的截至并不是 uid 大于 60000 就会出错,而是程序默认创建最大到 60000,可以通过 useradd -u 指定用户 uid 。

Linux中的组

Linux 中组分为:

  1. 主要组/基本组
  2. 次要组/附属组

一个组会有一个组对应的 gid ,一个用户都有一个主要组,但是可以有多个附属组,所以 id username 得到的 gid 是用户主要组的 gid ,得到的组是用户所在是所有组名及其 gid 组成的一个集合。

用户操作

useradd的更多使用方式

命令选项 作用
-e 指定账号的失效时间
-u 指定 UID
-s 指定 shell 地址
-g 指定主要组名
-G 指定用户的次要组名
-c 指定用户描述信息
-d 指定用户家目录
-M 不为该用户创建家目录
-r 新建系统用户,不会新建家目录,就是程序用户

我们直接使用看看效果

useradd -u 318038 -s /bin/bash -c psglgd=maybe psglgd_maybe
cat /etc/passwd | grep maybe
 - 得到结果
psglgd_maybe:x:318038:1006:psglgd=maybe:/home/psglgd_maybe:/bin/bash

我们可以看到我们新建的用户 psglgd_maybe 的 uid 是我们设定的318038,shell 地址为 /bin/bash,描述信息为psglgd=maybe。其他的方法也可以采用类似的方法进行定义,这时我们来研究一下 -g-G
-g : 指的是给用户设置主要组
-G :指的是给用户设置次要组

 - 首先新建组
groupadd dota2 -g 1314
# 新建组 - dota2 ,并设置 gid 为1214
useradd -g dota2 Ameame
cat /etc/passwd | grep Ameame
# Ameame:x:1006:1314::/home/Ameame:/bin/bash
id Ameame
# uid=1006(Ameame) gid=1314(dota2) 组=1314(dota2)
 - 我们可以看到结果:
 - 新建的用户 Ameame 的主要组 id 为 1314 -- dota2 这个组
groupadd LGD -g 5000
# 新建组 - LGD ,并设置 gid 为5000 (w)
useradd -g dota2 -G LGD ameame
cat /etc/passwd | grep ameame
# ameame:x:1007:1314::/home/ameame:/bin/bash
id ame
# uid=1007(ameame) gid=1314(dota2) 组=1314(dota2),5000(LGD)
 - 我们可以看到结果
 - 新建的用户 ameame 的主要组 id 为1314 -- dota2 这个组
 - 所存在组的集合为:1314 ,5000 两个组,是 dota2 和 LGD 两个组的集合
 - dota2 是用户存在的主要组 LGD 是次要组

passwd 命令使用方式

passwd 是 Linux 中帮用户设置密码的命令,新建了用户之后可以使用passwd 命令对用户进行密码设置,密码设置完成后该用户就是可以远程登陆的用户了。

补充提问:什么用户是可登陆的用户?
1 - 用户是否设置密码,设置了密码是登陆的条件;
2 - shell是否为正常的 shell,异常shell是不能登陆的。


什么是正常的 shell?
/bin/bash 和 /bin/sh 是正常的shell;
/sbin/nologin 是异常 shell,nologin 是不能登陆的。

格式: passwd [选项] 用户名

选项 作用
-d 清空用户的密码
-l 锁定用户密码
-u 解锁用户密码
-S 查看用户账号的状态

首先我们来看看 passwd 是如何来设置密码的:

passwd ameame
 - 显示输出:
更改用户 ameame 的密码 。
新的 密码:

这里有一个很有意思的现象:当我们输入回文密码的时候(12321 这种就被称为回文明密码),它会有一个报错

更改用户 ameame 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:

这边将用户 ameame 的密码设置成 123456,就可以用这个新创建的账号密码从远程登陆我们的 Linux 系统了!

现在我们先看一下 ameame 这个账号 设置密码后 shadow 文件格式,然后分别使用 passwd -l 和 -u 对比一下区别:

cat /etc/shadow | gerp ameame
ameame:$6$n2530n56Adz4QJhc$G2std.13kPpT3IoeIYg4.OGgv32JQ75rmW2R23B.O/4yLx1hNnu/J1LxuF.kMH7ZmgOXu3yLx6aQKaLs5UPCS/:18741:0:99999:7:::
passwd -l ameame
锁定用户 ameame 的密码 。
passwd: 操作成功
cat /etc/shadow | gerp ameame
ameame:!!$6$n2530n56Adz4QJhc$G2std.13kPpT3IoeIYg4.OGgv32JQ75rmW2R23B.O/4yLx1hNnu/J1LxuF.kMH7ZmgOXu3yLx6aQKaLs5UPCS/:18741:0:99999:7:::
 1. 这里我们看到,密码前面被设置了!!
 2. !! 的密码就是无效密码
passwd -u ameame
解锁用户 ameame 的密码。
passwd: 操作成功
cat /etc/shadow | gerp ameame
ameame:$6$n2530n56Adz4QJhc$G2std.13kPpT3IoeIYg4.OGgv32JQ75rmW2R23B.O/4yLx1hNnu/J1LxuF.kMH7ZmgOXu3yLx6aQKaLs5UPCS/:18741:0:99999:7:::
 3. 解锁后!!消失了 密码是可以使用的有效密码

另外,补充一个设置密码常用方式:

echo "123456" | passwd username --stdin
 - stdin的意思是标准化输入
 - 代表收录前面 echo 的值 123456 认为是从键盘输入的,然后进行密码的设置
 - 因为设置密码的时候默认收取的是键盘数据,因此使用该命令设置密码的时候需要加一条这个语句

userdel 删除用户的用法

使用: userdel [-r] username
-r --remove
意思是删除用户,并删除创建的家目录和用户邮箱,删除用户的时候使用 -r 方法能将用户的所有数据删除干净。

usermod 修改用户

全称: user modifies
使用方式: usermod [选项] username

命令选项 作用
-e 指定账号的失效时间
-u 指定 UID
-s 指定 shell 地址
-g 指定主要组名
-G 指定用户的次要组名
-c 指定用户描述信息
-u 解锁用户密码
-l 锁定用户密码
 - 这里只补充一点, usermod -l username 和 passwd -l username 的区别
 - 下面看例子
usermod -l ameame
cat /etc/shadow|grep ameame
ameame:!$6$n2530n56Adz4QJhc$G2std.13kPpT3IoeIYg4.OGgv32JQ75rmW2R23B.O/4yLx1hNnu/J1LxuF.kMH7ZmgOXu3yLx6aQKaLs5UPCS/:18741:0:99999:7:::

区别就是 usermod -l 锁定用户密码的时候,只会在加密密码前面加上一个 ! 让这个密码变成无效密码。

关于 useradd 命令后台执行情况

  1. 修改文件 - /etc/passwd;
  2. 修改文件 - /etc/shadow;
  3. 修改文件 - /etc/group;
  4. 创建家目录 - /home/username;
  5. 复制 /etc/skel/* 到新建用户的家目录下;
  6. 在/var/spool/mail 文件新建用户邮箱。

/etc/skel/* 文件夹下,复制的内容都有哪些?

  • .bash_profile : 用户每次登陆的时候就会执行的脚本文件;
  • .bash_logout :用户每次退出的时候就会执行的脚本文件;
  • .bashrc : 每次进入新的bash环境下执行的脚本文件,就是每次使用bash命令的时候就会加载这个配置文件;
  • .bashhistory : 记录了上次注销前使用的最多1000条命令。

Linux的文件保护

因为 passwd 、shadow 这些文件都十分重要,因此不要轻易的对这些文件进行操作,Linux 为了方便系统恢复,设置了备份文件:

ls /etc/passwd*
# 输出 /etc/passwd  /etc/passwd-
ls /etc/shadow*
# 输出 /etc/shadow  /etc/shadow-
ls /etc/group*
# 输出 /etc/group  /etc/group-

带 - 号的就是备份文件,我们来探究一下备份文件和原文件之间的差异:

diff /etc/passwd /etc/passwd-
# 判断两个文件是否有差异
 - 输出内容
29a30
> ameame:x:1007:1314::/home/ameame:/bin/bash
# 这似乎是我们新建的一个用户,我们再新建一个用户看看两个之间有什么变化
useradd chalify
diff /etc/passwd /etc/passwd-
 - 输出内容
30d29
< chalify:x:1007:1007::/home/chalify:/bin/bash
# 嗷? 没有了ameame 但是新建的用户 chalify 出现了

以此,得到结论:
在有对用户进行改动时,备份文件和原文件存在差异,备份文件每次都会比原文件少一次操作,会落后一步操作命令。

至此,关于 Linux 的用户和组的内容结束了,这里面涉及了很多常用的文件命令以及方法,喜欢别忘了点个赞点个关注!

如果想学更多,欢迎来访 三创 一起交流学习.

你可能感兴趣的:(Linux,系统基础,文本处理,linux,shell)