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

Linux 用户和组

Linux中用户和组的相关文件/etc/passwd/etc/shadow/etc/groupLinux用户Linux中的组用户操作useradd的更多使用方式passwd 命令使用方式userdel 删除用户的用法usermod 修改用户

关于 useradd 命令后台执行情况Linux的文件保护

Linux中用户和组的相关文件

最重要的两个文件内容

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

/etc/passwd

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

cat /etc/passwd

唔 文件内容太长了,我们单独挑出一行内容来对其核心部分进行解释

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用户账号的UID4所属主要组的GID5用户描述信息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密码最短有效天数,默认为05密码最长有效天数,默认为999996提前多少天警告用户口令将要过期,默认为77在密码过期多少天后就禁用该用户

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

练习题:统计哪些没有设置密码的用户,输出用户名和数量 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、组:

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

Linux 中的用户分为:

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

Linux中的组

Linux 中组分为:

主要组/基本组次要组/附属组

一个组会有一个组对应的 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 命令后台执行情况

修改文件 - /etc/passwd;修改文件 - /etc/shadow;修改文件 - /etc/group;创建家目录 - /home/username;复制 /etc/skel/* 到新建用户的家目录下;在/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 的用户和组的内容结束了,这里面涉及了很多常用的文件命令以及方法,喜欢别忘了点个赞点个关注!

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

2025-07-02 07:01:13