【Linux】用户管理

1.用户标识符

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

实际上,Linux主机并不认识我们的账号名称,他是通过我们的ID(唯一标识符),和我们的学号是一个道理,学校可能存在同名的学生,但是每个学生的学号(ID)是唯一的,我们通过学号可以准确的找到某个学生。因此,账号是我们用户可以直观看到的,而对主机,他看到的是ID,那Linux主机是如何对应咱们的账号和ID的呢?

实际上,主机会在系统的配置文件中查找来确认,主要是passwd和shadow这两个文件(用户相关),还有group和gshadow这两个文件(群组相关)

当我们输入正确的密码之后,咱们就可以进入shell环境,也就是看到命令行了

这个过程主要发生了这些事情:

  1. 主机会进入**/etc/passwd里面查找是否有该账号,如果有就会从该配置文件读出该账号的UIDGID**(在**/etc/group**),同时并读出家目录和shell设定,可以发现我们每次登录后的当前路径都默认为工作目录下
  2. 进入**/etc/shadow**,根据UID核对密码
  3. 上面两步都成功,则进入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文件中一行代表一个群组

四栏分别代表以下含义:

  1. 群组名称
  2. 群组密码
  3. GID
  4. 此群组内的用户账号(可以有多个,用','分割)

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

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

同样,每行是一个用户账号

一行总共9栏,含义如下:

  1. 账号名称
  2. 密码:看起来是一堆奇怪字符,这是加密过后的密码
  3. 最近改动密码的日期:以1970年1月1日为起点的天数显示
  4. 密码锁定的天数(相对于第三栏):修改密码后的若干天不允许再修改
  5. 密码需要重新变更的天数(相对于第三栏):有的系统会强制要求用户定期变更密码以保证安全,更改密码后的若干天内需要变更,否则密码过期
  6. 强制变更期限前的警告倒计时(相对于第五栏)
  7. 密码过期后的宽限日期(相对于第五栏):密码过期后仍然可以登录系统,因为该密码仍有效
  8. 失效日期:过了该日期密码就会失效,此时就不能使用密码登录系统了
  9. 保留供以后使用

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更改不同,普通用户设定的密码有严格要求:

  1. 普通用户必须先输入原密码(current)
  2. 输入新密码,且新密码必须严格遵守格式,所有的bad password都不会通过验证
  3. 新密码不能与原密码有太高相似度
  4. 重试了最大次数(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中,四栏的含义分别如下:

  1. 群组名
  2. 密码,开头问!表示无合法密码,所以无群组管理员
  3. 群组管理员账号
  4. 群组内成员

3.3groupadd与groupdel

新增群组:groupadd -选项 群组名

选项:

  1. -g:指定GID
  2. -r:建立系统群组

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

📖Note:

  • 初始化群组不可以被删除哦

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

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式