1.用户标识符
当我们登入Linux系统时,会要求我们输入用户名称和密码


实际上,Linux主机并不认识我们的账号名称,他是通过我们的ID(唯一标识符),和我们的学号是一个道理,学校可能存在同名的学生,但是每个学生的学号(ID)是唯一的,我们通过学号可以准确的找到某个学生。因此,账号是我们用户可以直观看到的,而对主机,他看到的是ID,那Linux主机是如何对应咱们的账号和ID的呢?
实际上,主机会在系统的配置文件中查找来确认,主要是passwd和shadow这两个文件(用户相关),还有group和gshadow这两个文件(群组相关)

当我们输入正确的密码之后,咱们就可以进入shell环境,也就是看到命令行了
这个过程主要发生了这些事情:
- 主机会进入**/etc/passwd里面查找是否有该账号,如果有就会从该配置文件读出该账号的UID和GID**(在**/etc/group**),同时并读出家目录和shell设定,可以发现我们每次登录后的当前路径都默认为工作目录下
- 进入**/etc/shadow**,根据UID核对密码
- 上面两步都成功,则进入shell环境,否则会显示拒绝登录,拒绝密码之类的话语

每一个文件都有拥有者和所属群组两个属性,因此,每个登录的用户也对应要取得两个ID,一个用户ID(user ID,UID),一个群组ID(group ID,GID)。

1.1UID
我们可以看一下用户的UID(在/etc/passwd中)

我们重点看圈出来的两行,一个是root用户,另一个是我用root给自己创建的另一个普通用户
不难发现,passwd文件中一行代表一个用户账号,且每行的字符串中间每栏用':'分割
下图是每栏所代表的含义

Linux中对UID的限制如下:
|-------------|------------------------------------------------------------------|
| UID范围 | 用户 |
| 0 | 系统管理员(root) |
| 201~999 | 保留给系统使用的ID 系统中的一些服务希望使用较小的权限去运作,所以需要提供一些用户账号去运行这些程序,这些账号通常是不可登入的 |
| 1000~60000 | 普通用户 |
在/etc/login.defs中,也可以查看UID及GID的范围

1.2GID
虽然在/etc/passwd中可以查看GID,但是关于GID更详细的信息存放在/etc/group中
group文件中一行代表一个群组
四栏分别代表以下含义:
- 群组名称
- 群组密码
- GID
- 此群组内的用户账号(可以有多个,用','分割)

在/etc/passwd和/etc/group中,主机可以查到用户账号和UID以及群组名称和GID的对应关系,并且很显然,两个文件中每行的第二栏都是密码字段,但是都显示x,早期Unix系统中,密码是显示在这一栏中的,观察这个配置文件的权限:rw-r--r--,即所有人都可以读取,所以后来就把密码放到**/etc/shadow中了,群组的密码对应放到了/etc/gshadow**中

查看下/etc/shadow文件的内容

同样,每行是一个用户账号
一行总共9栏,含义如下:
- 账号名称
- 密码:看起来是一堆奇怪字符,这是加密过后的密码
- 最近改动密码的日期:以1970年1月1日为起点的天数显示
- 密码锁定的天数(相对于第三栏):修改密码后的若干天不允许再修改
- 密码需要重新变更的天数(相对于第三栏):有的系统会强制要求用户定期变更密码以保证安全,更改密码后的若干天内需要变更,否则密码过期
- 强制变更期限前的警告倒计时(相对于第五栏)
- 密码过期后的宽限日期(相对于第五栏):密码过期后仍然可以登录系统,因为该密码仍有效
- 失效日期:过了该日期密码就会失效,此时就不能使用密码登录系统了
- 保留供以后使用
2.新增和删除用户
2.1useradd与passwd
在Linux系统中增加新用户
指令:useradd -选项 用户名称
不使用选项,直接创建一个新用户
在配置文件中使用账号名称筛选,可以发现配置文件已经有LiMing的相关信息了

使用指令useradd -D可以查看useradd指令的参考文件
事实上,我们不使用选项创建新用户,系统会帮助我们设定一些默认值,比如预设账号的初始群组(GROUP),家目录(HOME),密码过期后是否失效(INACTIVE),失效日期(EXPIRE),shell程序文件名(SHELL)等

当然,如果想要自己指定预设值,我们可以通过选项指定参数,常用选项如下
|--------|------------------------------------|
| option | 功能 |
| -u | 后面接UID,给新用户指定UID |
| -g | 后接想要预设的群组名称 |
| -G | 后接该用户还可以加入的群组 |
| -M | 不建立用户家目录(系统账号) |
| -m | 建立用户家目录(普通账号) |
| -c | /etc/passwd文件中第五栏的用户说明 |
| -d | 指定某个目录为家目录(绝对路径) |
| -r | 建立系统账号 |
| -s | 预设shell程序文件名 |
| -e | 后接日期(YYYY-MM-DD),账号失效日期 |
| -f | /etc/shadow第七个字段,密码是否会失效(0会-1永久有效) |
新增一个用户之后,该账号暂时被封锁,无法登入,在/etc/shadow的第二个字段(密码)可以发现 !! ,意思就是该账号没有设置密码

设置密码指令:passwd -选项 用户名称
不使用选项,直接给LiMing设置密码

实际上,和我们平时设置微信,QQ等账户的密码一样,系统会对我们的密码格式有一点要求,比如长度最少为12位,至少包含数字,英文字符,特殊字符中的几类等,但是我以root用户的身份设置时,虽然第一遍输入的密码被认定是一个坏密码,但是我第二次输入同样的密码后,系统也会接收改密码。
📖Note:
- root用户下的操作要慎重
- root用户为普通用户设置密码,passwd + 账号,千万不要忘记加账号,直接输入passwd就是更改当前用户的密码,即root用户更改root的密码
当然,普通用户也是可以更改自己的密码的

普通用户登录成功之后,直接输入passwd更改自己的密码。
与root更改不同,普通用户设定的密码有严格要求:
- 普通用户必须先输入原密码(current)
- 输入新密码,且新密码必须严格遵守格式,所有的bad password都不会通过验证
- 新密码不能与原密码有太高相似度
- 重试了最大次数(3)后仍然失败,三次密码验证都没通过,重新下达passwd指令就行,直到出现successfully提示,则密码设置成功
passwd指令选项
|--------|--------------------------------------|
| option | 功能 |
| -l | Lock,在/etc/shadow的第二栏(密码)前加上! ,使密码失效 |
| -u | Unlock |
| -S | 列出密码相关参数 |
| -n | 多久不可修改密码天数。shadow第四栏 |
| -x | 多久必须更改密码。shadow第五栏 |
| -w | 密码过期前的警告天数。shadow第六栏 |
| -i | 密码过期后到失效的宽限日期。shadow第七栏 |
我们举个例子,设置账号LiMing的密码在过期后10天就失效,/etc/shadow第七栏会变成10
当然,这里我们并没有设置多久更改密码的限制,因此这个参数此时是无效的,因为这个失效宽限日期是相对于过期的账号来说的

2.2usermod
usermod用于新增账号成功后,修改某个参数
指令:usermod -选项 用户名称
|--------|---------------------------------------|
| option | 功能 |
| -c | 账号说明信息,/etc/passwd第五栏 |
| -d | 家目录,/etc/passwd第六栏 |
| -e | 后接日期,格式YYYY-MM-D,/etc/shadow第八栏(失效日期) |
| -f | 后接天数,/etc/shadow第七栏(失效宽限时间) |
| -g | 后接初始群组,/etc/passwd第四栏(GID) |
| -G | 后接次要群组,修改/etc/group |
| -a | 与-G合用,增加次要群组 |
| -l | 修改账号名称,/etc/passwd第一栏 |
| -s | 修改shell的预设文件 |
| -u | 修改UID,/etc/passwd第三栏 |
| -L | 冻结用户密码 |
| -U | 解冻用户密码 |
其实usermod和useradd的选项非常类似,usermod是对useradd增加的用户信息进行微调的
📖📖Note:
所有指令参数都不需要强制记忆,如果用到了某条指令,他的选项是可以查阅文档的哦,使用我们之前讲解过的强大的man指令即可!参考https://blog.csdn.net/m0_64538862/article/details/157847066?spm=1001.2014.3001.5501
2.3userdel
删除用户:userdel -选项 账号名称
常用选项:-r 连同用户的家目录一起删除
📖📖Note:
- 作为root用户,下达该指令要慎重。userdel会删除用户的所有数据
- 一般移除一个账号,我们手动更改配置文件(/etc/passwd和/etc/shadow)即可
- 若某个账号暂时不启用,将/etc/shadow的第八个字段(失效日期)设为0,则该账号无法使用但是账号相关的所有数据会保存下来
3.新增和移除群组
3.1有效群组和初始群组
上面我们多次提到了初始群组的概念,接下来我们详细讲解

在我们上边useradd的实例中,可以发现,新增一个用户账号时,他的GID(/etc/passwd第四栏,/etc/group第三栏)并不为空,且GID=UID,这是基于Linux distributions所采用的群组机制的,我们这里使用的centos采用私有群组机制,当创建一个新用户时,系统会建立一个与账号同名的群组作为初始群组,这样每一个新用户都拥有自己的群组,具有很好的保密性
采用私有群组机制:Fedora,centos....
采用公共群组机制:把GROUP=100这个设定值作为新用户的初始群组,即每个新用户都属于users这个群组,大家可以共享家目录内的数据,代表性的如SuSE

对于初始群组(一个),我们一登入系统,就获得这个群组的相关权限
一个用户可以加入多个群组,在usermod中,-G选项可以为用户添加群组

可以发现,已经把LiMing这个账号加入到lxj这群组中了。但是/etc/passwd第四栏,/etc/group第三栏中的GID仍然为1002(LiMing),这就是LiMing的初始群组;而lxj对LiMing来说是非初始群组,lxj是我们手动为LiMing添加的一个群组,LiMing也可以拥有lxj这个群组的相关权限,所以此时LiMing就拥有两个群组的相关权限了。
那么LiMing建立一个新的文件,这个文件输入那个群组呢,所以我们引入有效群组

上图中,切换到用户LiMing,使用groups指令查看LiMing的所属群组,没错儿,是两个,并且规定第一个是当前用户的有效群组,即LiMing,他创建的新文件是属于群组LiMing的
那LiMing想在lxj群组中创建文件该怎么办,那肯定就是把有效群组变成lxj了
指令:newgrp 有效群组

📖Note:
- newgrp指令变更目前用户的有效群组,并且创建一个新的shell环境,所以如果想要返回到原本的环境中,使用exit退出哦!

3.2群组管理员与gpasswd
一个群组中可能会有若干的群组成员,我们可以使用root管理这些成员,但是root作为整个系统的管理员,他的任务太繁忙了,所以对于群组,我们可以设置一个群组管理员,给他权限去管理,使用gpasswd指令就可以实现
指令:gpasswd -选项 群组名

上图中,gpasswd不带任何选项,功能是为群组设置密码

上图中,gpasswd带-A(Adiminister)选项,功能是为群组设置管理员
同时我们在/etc/gshadow配置文件中可以发现设置成功
在/etc/gshadow中,四栏的含义分别如下:
- 群组名
- 密码,开头问!表示无合法密码,所以无群组管理员
- 群组管理员账号
- 群组内成员
3.3groupadd与groupdel
新增群组:groupadd -选项 群组名
选项:
- -g:指定GID
- -r:建立系统群组

删除群组:groupdel -选项 群组名

📖Note:
- 初始化群组不可以被删除哦

参考:参考:《鸟哥的Linux私房菜》第十四章