Linux笔记 Day11---(Linux用户和用户组概述及相关命令)

用户和用户组管理,顾名思义就是添加用户和用户组、更改密码和设定权限等操作。可能有很多人觉得用户管理没有意义,因为我们在使用个人计算机的时候,不管执行什么操作,都以管理员账户登录,而从来没有添加和使用过其他普通用户。这样做对个人计算机来讲问题不大,但在服务器上是行不通的。

想象一下,一个管理团队,共同维护一组服务器,难道每个人都能够被赋予管理员权限?显然是不行的,因为不是所有的数据都可以对每位管理员公开,而且如果在运维团队中有某位管理员对 Linux 不熟悉,那么赋予他管理员权限的后果可能是灾难性的。

因此,越是对安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。

一、概述

Linux是一个可以实现多用户登陆的操作系统,允许多个用户同时登陆到系统上使用资源,系统根据账户来区分每个用户的文件、进程、任务,给每个用户提供特定的工作环境。换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。

例如,某台 Linux 服务器上有 4 个用户,分别是 root、www、ftp 和 mysql,在同一时间内,root 用户可能在查看系统日志、管理维护系统;www 用户可能在修改自己的网页程序;ftp 用户可能在上传软件到服务器;mysql 用户可能在执行自己的 SQL 查询,每个用户互不干扰,有条不紊地进行着自己的工作。与此同时,每个用户之间不能越权访问,比如 www 用户不能执行 mysql 用户的 SQL 查询操作,ftp 用户也不能修改 www 用户的网页程序。

不同用户具有不问的权限,毎个用户在权限允许的范围内完成不同的任务,Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制

因此,如果要使用 Linux 系统的资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统(账户和用户是一个概念)。通过建立不同属性的用户,一方面可以合理地利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。

每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录。

用户组是具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有 10 个用户的话,就需要授权 10 次,那如果有 100、1000 甚至更多的用户呢?

扫描二维码关注公众号,回复: 11874299 查看本文章

显然,这种方法不太合理。最好的方式是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。

用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,很多程序上简化了对用户的管理工作

Linux用户和组的关系

用户和用户组的对应关系有以下 4 种:

  • 一对一:一个用户可以存在一个组中,是组中的唯一成员;
  • 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
  • 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
  • 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。
    在这里插入图片描述
    登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd 文件中

用户名并无实际作用,仅是为了方便用户的记忆

Linux 系统中,每个用户的 ID 分为 2 种,分别是用户 ID(User ID,简称 UID)和组 ID(Group ID,简称 GID),这与文件有拥有者和拥有群组两种属性相对应

每个文件都有自己的拥有者 ID 和群组 ID,当显示文件属性时,系统会根据 /etc/passwd 和 /etc/group 文件中的内容,分别找到 UID 和 GID 对应的用户名和群组名,然后显示出来

在 /etc/passwd 文件中,利用 UID 可以找到对应的用户名;在 /etc/group 文件中,利用 GID 可以找到对应的群组名

二、Linux /etc/passwd

Linux 系统中的 /etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作

查看这个文件的内容:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
……省略部分输出内容……
dxk:x:1000:1000::/home/dxk:/bin/bash
Bob:x:1002:1002::/home/Bob:/bin/bash

这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题

可以看到,/etc/passwd 文件中的内容非常规律,每行记录对应一个用户。每行用户信息都以 “:” 作为分隔符,划分为 7 个字段,每个字段所表示的含义如下:

用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell

打开此文件的正确方式:

[root@admin ~]# vipw

用户名
用户名,就是一串代表用户身份的字符串。

通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号( : ),因为冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头

用户名仅是为了方便用户记忆,Linux 系统是通过 UID 来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系

密码
“x” 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中,并且此文件只有 root 用户可以浏览和操作,最大限度地保证了密码的安全

注意:虽然 “x” 并不表示真正的密码,但也不能删除,如果删除了 “x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在服务器终端无密码登录,远程链接是不可以的)

UID

UID,也就是用户 ID。每个用户都有唯一的一个 UID,Linux 系统通过 UID 来识别不同的用户
UID 就是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份(这里说明的是CentOS7):

UID范围 用户身份
0 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,只需把其他用户的 UID 修改为 0 就可以把普通用户升级成管理员
1~999 系统用户(伪用户),此范围的 UID 保留给系统使用
1000~60000 普通用户

GID
全称“Group ID”,简称“组ID”,表示用户基本组的组 ID 号
分类:

  • 组类别1:
GID范围(CentOS7) 用户组
0 管理员组
1-999 系统用户组
1000-60000 登录用户组
  • 组类别2:

    基本组:指用户登陆时就拥有这个用户组的相关权限。每个用户的基本组只能有一个,通常就是将和此用户的用户名相同的组名作为该用户的基本组。比如说,手工添加用户user01,在建立用户user01的同时,就会建立 user01 组作为user01 用户的基本组。

    附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个基本组,除基本组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。

比如:刚创建的user01 用户除属于基本组user01外,又把它加入test01组,那么user01用户同时属于 user01 组和test01组,其中 user01 是基本组,test01 是附加组。

当然,基本组和附加组的身份是可以修改的,但是一般在工作中不修改初始组,只修改附加组。

在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组

  • 组类别3

    私有组:组名同用户名,且只包含一个用户。

    公共组:组内包含了多个用户。

描述性信息
这个字段并没有什么重要的用途,只是用来解释这个用户的意义而已

主目录
也就是用户登录后有操作权限的访问目录,通常称为用户的主目录。

例如,root 超级管理员账户的主目录为 /root,普通用户的主目录为 /home/username,即在 /home/ 目录下建立和用户名相同的目录作为主目录,如 user01 用户的主目录就是 /home/user01/ 目录

默认的Shell

Shell 就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁。

我们知道,用户登陆 Linux 系统后,通过使用 Linux 命令完成操作任务,但系统只认识类似 0101 的机器语言,这里就需要使用命令解释器。也就是说,Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。

通常情况下,Linux 系统默认使用的命令解释器是 bash(/bin/bash),当然还有其他命令解释器,例如 sh、csh 等

[root@admin ~]# cat /etc/shells     #查看自己主机当中当前有哪些种类的Shell
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash     
[root@admin ~]# echo $SHELL     #查看Linux系统当前正在使用的Shell 类型
/bin/bash

在 /etc/passwd 文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果这里使用的是 bash 命令解释器,就代表这个用户拥有权限范围内的所有权限

例如:添加的user01用户,它使用的是 bash 命令解释器,那么这个用户就可以使用普通用户的所有权限

[root@admin ~]# vipw
user01:x:1007:1007::/home/user01:/bin/bash

如果把 user01 用户的 Shell 命令解释器修改为 /sbin/nologin,那么,这个用户就不能登录了

user01:x:1007:1007::/home/user01:/sbin/nologin

因为 /sbin/nologin 就是禁止登录的 Shell。

三、Linux /etc/shadow

/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”

前面介绍了 /etc/passwd 文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了此文件中。

/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。

查看该文件:

root:$6$fgZhUhgS$GyLP1RsgL/cIH.Zx.U52bMJjga2yk90tBFNV9Up3ZNy59o.59r3GG7HmVwPk3AEBh7dOUZYPo8zJXuT.WKhVA/:18456:0:10000:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
……省略部分输出内容……
user01:!!:18469:0:99999:7:::

同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

打开此文件的正确方式:

[root@admin ~]# vipw -s

这9个字段:

第一列:用户名

用户名,就是一串代表用户身份的字符串

第二列:加密后的密码

这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。

注意:这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效

所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录。

第三列:最后一次修改时间

此字段表示最后一次修改密码的时间,可是,为什么 root 用户显示的是 18455 呢?

这是因为,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间。这里显示 18455 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 18455 天修改的 root 用户密码

可以使用如下命令进行换算:

#只能精确到天
[root@admin ~]# date -d "19700101 +18455 day" "+%Y年%m月%d日"
2020年07月12日

第四列:修改密码的最小时间间隔

最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码

第五列:密码有效期

经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期

第六列:密码需要变更前的警告天数

与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。

该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。

第七列:密码过期后的宽限天数

也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。

比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。

第八列:账号失效时间

同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用

第九列:预留
这个字段目前没有使用,为新功能所预留

对于普通账户的密码遗失,可以通过 root 账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码

根据以上各字段的含义,root用户可以根据需要对相应用户的密码信息进行修改,以达到限制或约束的目的。一种方式是直接修改该文件相应用户的字段值,另一种方式是root用户使用passwd命令进行修改

四、Linux /etc/group

/ect/group 文件是用户组配置文件,即用户组的所有信息都存放在此文件中

此文件是记录组 ID(GID)和组名相对应的文件。etc/passwd 文件中每行用户信息的第四个字段记录的是用户的基本组 ID,那么,此 GID 的组名到底是什么呢?就要从 /etc/group 文件中查找

root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
……省略部分输出内容……
test01:x:1004:
slocate:x:21:
eddy:x:1005:
user01:x:1007:

此文件中每一行各代表一个用户组。上面创建的 user01 用户,系统默认生成一个 user01 用户组,在此可以看到,此用户组的 GID 为 1007,目前它作为 user01 用户的基本组

各用户组中,还是以 “:” 作为字段之间的分隔符,分为 4 个字段,每个字段对应的含义为:

组名:密码:GID:该用户组中的用户列表

组名
就是是用户组的名称,由字母或数字构成。同 /etc/passwd 中的用户名一样,组名也不能重复。

组密码
和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。

用户组设置密码是用来做什么的?用户组密码主要是用来指定组管理员,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。

组ID (GID)
就是群组的 ID 号,Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。
这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。

组中的用户
此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的基本组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。

比如:user01 组的组信息为 user01:x:1007: 可以看到,第四个字段没有写入 user01 用户,因为 user01 组是 user01 用户的基本组。如果要查询这些用户的基本组,则需要先到 /etc/passwd 文件中查看 GID(第四个字段),然后到 /etc/group 文件中根据基本组GID找到对应的组名。

每个用户都可以加入多个附加组,但是只能属于一个初始组。所以如果需要把用户加入其他组,则需要以附加组的形式添加。例如,我们想让 user01 用户也加入 root 这个群组,那么只需要在第一行的最后一个字段加入 user01,即 root:x:0:user01 就可以了。

一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组.

打开此文件的正确方式:

[root@admin ~]# vigr

五、Linux /etc/gshadow

/etc/passwd 文件存储用户基本信息,同时考虑到账户的安全性,将用户的密码信息存放到文件 /etc/shadow 中

而且 /etc/gshadow 文件也是如此,组用户信息存储在 /etc/group 文件中,而将组用户的密码信息存储在 /etc/gshadow 文件中。
查看该文件内容:

[root@admin ~]# vigr -s
root:::
bin:::
daemon:::
sys:::
……省略部分输出内容……
test01:!::
slocate:!::
eddy:!::
user01:!::

文件中,每行代表一个组用户的密码信息,各行信息用 “:” 作为分隔符分为 4 个字段,每个字段的含义如下:

组名:加密密码:组管理员:组附加用户列表

组名
同 /etc/group 文件中的组名相对应。

组管理员

考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 用户不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,免去麻烦 root 。(类似DMA之于CPU)

组中的附加用户
该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。

说明:
在 root 管理员使用 useradd 命令创建新用户时,若未明确指定该命令所属的初始组,useradd 命令会默认创建一个同用户名相同的群组,作为该用户的初始组。

比如user01用户一登陆就会自动获取相应权限,因此不需要在 /etc/group 的第 4 个字段额外标注,但是,附加组就不一样了,将 user01 用户加入 test01 群组中,由于 test01 这个群组并不是 user01 的初始组,因此必须要在 /etc/group 这个文件中找到 test01 那一行,将 user01 这个用户加入第 4 字段中(群组包含的所有用户),这样 user01 用户才算是真正加入到 test01 这个群组中。

此时,因为 user01 用户同时属于 user01 和 test01 两个群组,所在,在读取\写入\运行文件时,只要是 user01 和 test01 群组拥有的功能,user01 用户都将拥有。

一个用户可以所属多个附加组,但只能有一个初始组。那么,如何知道某用户所属哪些群组呢?使用 groups 命令即可。

[user01@admin ~]$ groups
user01 test01

通过以上输出信息可以得知,user01 用户同时属于 user01 群组和 test01 群组,而且,第一个出现的为用户的基本组,后面的都是附加组,所以 user01 用户的基本组为 user01 群组,附加组为 test01 群组

打开此文件的正确方式:

[root@admin ~]# vigr -s

六、Linux /etc/login.defs

创建用户的默认设置文件

/etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。

该文件的用户默认配置对 root 用户无效。并且,当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。

下面对文件中的各个选项进行解释(CentOS7):

设置项 含义
MAIL_DIR /var/spool/mail 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 user01 用户的邮箱是 /var/spool/mail/user01
PASS_MAX_DAYS 99999 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效
PASS_MIN_DAYS 0 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0
PASS_MIN_LEN 5 指定密码的最小长度,默认不小于 5 位,但是现在这个选项并不生效
PASS_WARN_AGE 7 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天
UID_MIN 1000 指定最小 UID 为 1000
SYS_GID_MIN 201 指定最小系统 GID 为 201
SYS_GID_MAX 999 指定最大系统 GID 为 999
CREATE_HOME yes 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes
UMASK 077 用户主目录的权限默认设置为 077
USERGROUPS_ENAB yes 指定删除用户的时候是否同时删除用户的基本组,此项的默认值为 yes。
ENCRYPT_METHOD SHA512 指定用户密码采用的加密规则,默认采用 SHA512

七、用户与用户组相关命令

(一)useradd命令

功能:新建用户

选项:

  • -u UID :手工指定用户的 UID,注意 UID 的范围
  • -d 主目录 :手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限;
  • -c 用户说明 :手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置;
  • -g 组名 :手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。
  • -G 组名 :指定用户的附加组。我们把用户加入其他组,一般都使用附加组;
  • -s shell :手工指定用户的登录 Shell,默认是 /bin/bash;
  • -e 曰期 :指定用户的失效曰期,格式为 “YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段;
  • -o :通常和-u选项同时使用,允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0;
  • -m :建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;
  • -r :创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。
  • -M:不创建用户的主目录

其实,系统已经帮我们规定了非常多的默认值,在没有特殊要求下,无需使用任何选项即可成功创建用户

#创建普通用户jack
[root@admin ~]# useradd jack

这条简单的命令执行,它会完成以下几项操作:
①在 /etc/passwd 文件中创建一行与 jack 用户相关的数据:

[root@admin ~]# grep "jack" /etc/passwd
jack:x:1008:1008::/home/jack:/bin/bash

可以得出这样的信息:用户的 UID 为1008;基本组GID也为1008;同时默认指定了用户的家目录为 /home/jack/;用户的登录 Shell 为 /bin/bash

②在 /etc/shadow 文件中新增了一行与 jack 用户密码相关的数据:

[root@admin ~]# grep "jack" /etc/shadow
jack:!!:18469:0:99999:7:::

这个用户还没有设置密码,所以密码字段是 “!!”,代表这个用户没有合理密码,不能正常登录。同时会按照默认值设定密码相关的时间字段。密码有效期有 99999 天,距离密码过期 7 天系统会提示用户“密码即将过期”等

③在 /etc/group 文件中创建一行与用户名一模一样的群组

[root@admin ~]# grep "jack" /etc/group
jack:x:1008:

该组就是新建用户jack的基本组

④在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息:

[root@admin ~]# grep "jack" /etc/gshadow
jack:!::

没有对该组设定组密码和组管理员,所以这里没有密码,也没有组管理员

⑤默认创建用户的主目录和邮箱:

[root@admin ~]# ll -d /home/jack
drwx------. 2 jack jack 62 7月  26 11:15 /home/jack
[root@admin ~]# ll /var/spool/mail/jack
-rw-rw----. 1 jack mail 0 7月  26 11:15 /var/spool/mail/jack

⑥ 将/etc/skel 目录中的配置文件复制到新用户的主目录中

[root@admin ~]# ls -a /etc/skel/
.  ..  .bash_logout  .bash_profile  .bashrc
[root@admin ~]# ls -a /home/jack/
.  ..  .bash_logout  .bash_profile  .bashrc

其实,useradd 命令创建用户的过程,其实就是修改或添加了与用户相关的几个文件或目录,所以我们也可以根据以上六步模仿系统的步骤不用useradd命令添加用户。

如果默认创建用户不能满足自己的要求,而且模仿系统自己创建又太麻烦。那么我们还可以利用 useradd 命令的各种选项亲自定制要创建的用户

【例 1】添加用户名为client,UID为1111,主目录为/tmp/client,描述性信息为“client 01”,指定基本组为test01,附加组为“dxk”,指定登陆的shell为/bin/bash,指定该账号的 失效时间为2020年12月12日

[root@admin mail]# useradd -u 1111 -d /usr/client -c "client01" -g test01 -G dxk -s /bin/bash -e 2020-12-12 client
[root@admin mail]# grep "client" /etc/passwd
client:x:1111:1004:client01:/usr/client:/bin/bash
#可以看到基本组test01的GID为1004
[root@admin mail]# grep "1004" /etc/group    
test01:x:1004:user01
#家目录以及相关文件 也没有问题
[root@admin mail]# ll -d /usr/client
drwx------. 2 client test01 62 7月  26 11:55 /usr/client
[root@admin mail]# ls -a /usr/client
.  ..  .bash_logout  .bash_profile  .bashrc
#client用户在影子文件中的详细信息
[root@admin mail]# grep "client" /etc/shadow
client:!!:18469:0:99999:7::18608:  #未设置密码所以为两个感叹号
#过期时间也没问题
[root@admin mail]# date -d "1970-01-01 18608 days"
2020年 12月 12日 星期六 00:00:00 CST
#dxk组为client用户的附加组所以出现在dxk组的第4字段
[root@admin mail]# grep "client" /etc/group
dxk:x:1000:client
#同样gshadow文件每个用户组该行的第4字段和group的第4字段是一样的
[root@admin mail]# grep "client" /etc/gshadow
dxk:!::client

【例 2】
创建用户名为manger且UID同ftp的系统用户

[root@admin mail]# useradd  -r -u 14 -o manger 
[root@admin mail]# grep "ftp" /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@admin mail]# grep "manger" /etc/passwd
manger:x:14:14::/home/manger:/bin/bash

通常情况下,根本不需要手工指定任何内容,因为使用默认值就可以满足我们的要求。
useradd 命令在添加用户时参考的默认值文件主要有两个,分别是 /etc/default/useradd 和 /etc/login.defs。

(二)/etc/default/useradd 文件

查看 /etc/default/useradd 文件中包含哪些内容:

[root@admin ~]# vim /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

另外,也可以直接通过命令进行查看,结果是一样的:

[root@admin ~]# useradd -D

-D 选项指的就是查看新建用户的默认值

下面解释各项的含义:

参数 含义
GROUP=100 这个选项用于建立用户的默认组,也就是说,在添加每个用户时,用户的基本组就是 GID 为 100 的这个用户组。但 CentOS 并不是这样的,而是在添加用户时会自动建立和用户名相同的组作为此用户的基本组。也就是说这个选项并不会生效。 Linux 中默认用户组有两种机制:一种是私有用户组机制,系统会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是100的用户组作为所有新建用户的基本组。目前采用的是私有用户组机制
HOME=/home 指的是用户主目录的默认位置,所有新建用户的主目录默认都在 /home/下
INACTIVE=-1 指的是密码过期后的宽限天数,也就是 /etc/shadow 文件的第七个字段。这里默认值是 -1,代表所有新建立的用户密码永远不会失效
EXPIRE= 表示密码失效时间,也就是 /etc/shadow 文件的第八个字段。默认值是空,代表所有新建用户没有失效时间,永久有效。
SHELL=/bin/bash 表示所有新建立的用户默认 Shell 都是 /bin/bash
SKEL=/etc/skel 在创建一个新用户后,可以看到该用户主目录并不是空目录,而是有 .bash_profile、.bashrc 等文件,这些文件都是从 /etc/skel 目录中自动复制过来的。因此,更改 /etc/skel 目录下的内容就可以改变新建用户默认主目录中的配置文件信息。
CREATE_MAIL_SPOOL=yes 指的是给新建用户建立邮箱,默认是创建。也就是说,对于所有的新建用户,系统都会新建一个邮箱,放在 /var/spool/mail/ 目录下,和用户名相同。

此文件中各选项值的修改方式有 2 种,一种是通过 Vim 文本编辑器手动修改,另一种就是使用 useradd 命令进行修改,不过所用的命令格式发生了改变:

用法: useradd -D [选项] 参数

用此命令修改 /etc/default/useradd 文件,可使用的选项:

  • -b HOME: 设置所创建的主目录所在的默认目录,只需用目录名替换 HOME 即可,例如 useradd -D -b /dictory
  • -e EXPIRE :设置密码失效时间,EXPIRE 参数应使用 YYYY-MM-DD 格式,例如 useradd -D -e 2019-10-1
  • -f INACTIVE :设置密码过期的宽限天数,例如 useradd -D -f 7
  • -g GROUP :设置新用户所在的基本组,例如 useradd -D -g group1
  • -s SHELL :设置新用户的默认 shell,SHELL 必须是完整路径,例如 useradd -D -s /usr/bin/csh。

例如,要修改新用户的默认 Shell 为 /bin/csh,可以使用如下方式:

[root@admin ~]# useradd -D -s /bin/csh
[root@admin ~]# useradd -D 
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

通过 /etc/default/useradd 文件,大家仅能修改有关新用户的部分默认值,有一些内容并没有在这个文件中,例如修改用户默认的 UID、GID,以及对用户密码的默认设置,对这些默认值的修改就需要在 /etc/login.defs 文件中进行

useradd 命令创建用户的过程:系统首先读取 /etc/login.defs 和 /etc/default/useradd,根据这两个配置文件中定义的规则添加用户,也就是向 /etc/passwd、/etc/group、/etc/shadow、/etc/gshadow 文件中添加用户数据,接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录,最后复制 /etc/skel 目录中的所有文件到此主目录中,由此,一个新的用户就创建完成了

(三)usermod命令

如果在用 useradd 命令添加用户时,不小心添错用户信息,如何进行修改?

办法有两个,一个是使用 Vim 文本编辑器手动修改涉及用户信息的相关文件(/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow),当然这要求自身对文件的的字段值和规则非常熟悉。另一个方法就是使用 usermod 命令,该命令专门用于修改用户信息。

说明:useradd 命令用于添加用户,在添加用户时可以对用户信息进行定制;usermod 命令针对已存在的用户,使用该命令可以修改它们的信息

用法:usermod [选项] 用户名

选项:

  • -c 用户说明:修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段;
  • -d 主目录:修改用户的主目录,只修改 /etc/passwd和/etc/shadow 文件中的记录信息,但是不会主移动目录;若是要修改记录信息的同时还要移动目录,需要使用 -md 选项。需要注意的是,主目录必须写绝对路径;
  • -e 日期:修改用户的失效曰期,格式为 “YYYY-MM-DD”,即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段;
  • -g 组名:修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段(GID);
  • -u UID:修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID);
  • -G 组名:修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件;要注意的是该用户将会不在原来的附加组中,即旧的附加组中不存在该用户,该用户只会在新的附加组下
  • -a 与-G一同使用:用于为用户追加新的附加组;与单独使用-G的区别是,添加新的附加组后,该用户既属于这个新的附加组还属于旧的附加组
  • -l 用户名:修改用户名称;
  • -L:临时锁定用户(Lock);
  • -U:解锁用户(Unlock),和 -L 对应;
  • -s shell:修改用户的登录 Shell,默认是 /bin/bash。

其实 usermod 命令提供的选项和 useradd 命令的选项相似,因为 usermod 命令就是用来调整使用 useradd 命令添加的用户信息的,所以大多选项用法同useradd类似,不予赘述。

【例 1】

锁定用户

[root@admin ~]# grep "jack" /etc/shadow
jack:$6$P7sTURU0$TkGxNe3PYP6KAWkyePrYKlo.Ogq9bCmJWRbNXQzHQ2LcWYTpGm.M2L30fMgWAeASAktP9BtCAXYOqGU53kh2y0:18469:0:99999:7:::
[root@admin ~]# usermod -L jack
[root@admin ~]# grep "jack" /etc/shadow
jack:!$6$P7sTURU0$TkGxNe3PYP6KAWkyePrYKlo.Ogq9bCmJWRbNXQzHQ2LcWYTpGm.M2L30fMgWAeASAktP9BtCAXYOqGU53kh2y0:18469:0:99999:7:::
##其实锁定就是在密码字段前加入"!",这时jack用户就暂时不能登录了

usermod选项 -L 和 -U,作用分别与 passwd 命令的 -l 和-u 相同。usrmod -L 此命令对用户的临时锁定,同 passwd 命令一样,都是在 /etc/passwd 文件目标用户的加密密码字段前添加 “!”,使密码失效;反之,解锁用户就是将添加的 “!” 去掉

解锁用户:

[root@admin ~]# grep "jack" /etc/shadow
jack:$6$P7sTURU0$TkGxNe3PYP6KAWkyePrYKlo.Ogq9bCmJWRbNXQzHQ2LcWYTpGm.M2L30fMgWAeASAktP9BtCAXYOqGU53kh2y0:18469:0:99999:7:::
#取消了密码字段前的 "!"

【例 2】

这两个选项千万要弄清楚,不能混淆:
-G 组名:修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件;要注意的是该用户将会不在原来的附加组中,即旧的附加组中不存在该用户,该用户只会在新的附加组下
-a 与-G一同使用,用于为用户追加新的附加组;与单独使用-G的区别是,添加新的附加组后,该用户既属于这个新的附加组还属于旧的附加组

①-G 将用户唯一的添加到某一个用户组中

#把jack用户加入eddy用户组
[root@admin ~]# usermod -G eddy jack
[root@admin ~]# grep jack /etc/group
eddy:x:1005:jack
jack:x:1006:
#再将jack用户添加到test01用户组中
[root@admin ~]# usermod -G test01 jack
[root@admin ~]# grep jack /etc/group
test01:x:1004:jack        #可以看到的是jack用户只属于test01用户组而不属于原来的eddy用户组
jack:x:1006:

②-aG 将用户重复添加到其他用户组中

#可以看到此时jack用户只属于test01用户组
[root@admin ~]# grep jack /etc/group
test01:x:1004:jack
jack:x:1006:
#如果在这个基础上还想让jack用户属于eddy用户组
[root@admin ~]# usermod -aG eddy jack
[root@admin ~]# grep jack /etc/group
test01:x:1004:jack
eddy:x:1005:jack
jack:x:1006:

(四)userdel 命令

删除用户的相关数据。此命令只有 root 用户才能使用

用户的相关数据包含如下几项:

  • 用户基本信息:存储在 /etc/passwd 文件中;
  • 用户密码信息:存储在 /etc/shadow 文件中;
  • 用户群组基本信息:存储在 /etc/group 文件中;
  • 用户群组信息信息:存储在 /etc/gshadow 文件中;
  • 用户个人文件:主目录默认位于 /home/用户名,邮箱位于 /var/spool/mail/用户名。

其实,userdel 命令的作用就是从以上文件中,删除与指定用户有关的数据信息。

用法: userdel -r 用户名 删除用户时一并删除其家目录;

[root@admin ~]# userdel -r jack

除了使用 userdel 命令删除用户,还可以手动方式删除,步骤:

①在/etc/passwd文件中删除对应用户所在行
②在/etc/shadow文件中删除对应用户所在行
③在/etc/group文件中删除对应用户基本组所在行
④在/etc/gshadow文件中删除对应用户基本组所在行
⑤删除用户邮箱 rm -rf /var/spod/mail/用户名
⑥删除用户的家目录 rm -rf/home/用户名/
至此,用户彻底被删除,手动删除用户,比较麻烦,实际使用中,使用 userdel 删除用户更方便

userdel -r 删除用户时,会将删除与指定用户有关的数据信息,如果该用户的基本组是其他用户的附加组,或者说该用户基本组包括其他用户,那么将无法删除该用户的基本组

[root@admin ~]# grep user01 /etc/passwd /etc/group
/etc/passwd:user01:x:1009:1009::/home/user01:/bin/bash
/etc/group:user01:x:1009:manger
[root@admin ~]# userdel -r user01
userdel:组“user01”没有移除,因为它包含其它成员。
#但是其他信息已经删除了
[root@admin ~]# grep user01 /etc/passwd      
[root@admin ~]# ll -d /home/user01
ls: 无法访问/home/user01: 没有那个文件或目录

需要注意的是:如果要删除的用户已经使用过系统一段时间,那么此用户可能在系统中留有其他文件,因此,如果想要从系统中彻底的删除某个用户,最好在使用 userdel 命令之前,先通过 find -user 用户名 命令查出系统中属于该用户的文件,然后在加以删除

(五)groupadd命令

功能:添加用户组

用法:groupadd [选项] 组名

选项:

  • -g GID:指定组 ID
  • -r:创建系统群组

【例 】

创建名为“Server”且GID为1212的用户组

[root@admin ~]# groupadd -g 1212 Server(普通用户组范围为1000-60000)
[root@admin ~]# grep "Server" /etc/group
Server:x:1212:
[root@admin ~]# grep "Server" /etc/gshadow
Server:!::
#也可以不指定GID系统根据规则默认给出
[root@admin ~]# grep "Server1" /etc/group
Server1:x:1213:
[root@admin ~]# grep "Server1" /etc/gshadow
Server1:!::
#创建系统组(范围为1-999)
[root@admin ~]# grep "Server2" /etc/group
Server2:x:996:
[root@admin ~]# grep "Server2" /etc/gshadow
Server2:!::

(六)groupmod命令

功能:用于修改用户组的相关信息

用法:groupmod [选现] 组名

选项

  • -g GID:修改组 ID;
  • -n 新组名:修改组名;

【例 】

[root@admin ~]# grep "Server2" /etc/group
Server2:x:996:
[root@admin ~]# groupmod -g 55 Server2
[root@admin ~]# grep "Server2" /etc/group
Server2:x:55:
[root@admin ~]# groupmod -n fuwuqi Server2
[root@admin ~]# grep "fuwuqi" /etc/group
fuwuqi:x:55:

建议:用户名不要随意修改,组名和 GID 也不要随意修改,因为非常容易导致混乱。如果非要修改用户名或组名,则先删除旧的,再建立新的

(七)groupdel 命令

功能:用于删除用户组

用法:groupdel 组名

使用 groupdel 命令删除群组,其实就是删除 /etc/gourp 文件和 /etc/gshadow 文件中有关目标群组的数据信息。

[root@admin ~]# groupdel fuwuqi
[root@admin ~]# grep "fuwuqi" /etc/group
[root@admin ~]# grep "fuwuqi" /etc/gshadow

注意,不能使用 groupdel 命令随意删除群组。此命令仅适用于删除那些 “不是任何用户初始组” 的群组,换句话说,如果有群组还是某用户的初始群组,则无法使用 groupdel 命令成功删除

例如:

[root@admin ~]# grep "dxk" /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dxk:x:1000:1000::/home/dxk:/bin/bash   
/etc/group:dxk:x:1000:    #可以看到dxk用户的基本组是dxk用户组 
/etc/gshadow:dxk:!::
[root@admin ~]# groupdel dxk
groupdel:不能移除用户“dxk”的主组

可以看到,groupdel 命令删除 dxk 群组失败,且提示“不能删除 dxk 用户的主组(基本组)”。如果一定要删除 dxk 群组,要么修改 dxk 用户的 GID,也就是将其主组(基本组)改为其他群组,要么先删除 dxk 用户。

切记,虽然我们知道了如何手动删除群组数据,但胡乱地删除群组可能会给其他用户造成不小的麻烦,因此更改文件数据要格外慎重

(八)gpasswd命令

为了避免系统管理员(root)太忙碌,无法及时管理群组,我们可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。

用法: gpasswd 选项 组名

选项:

  • -a:–add USER 向组 GROUP 中添加用户 USER;等同于usermod -aG GROUP
  • -d,:–delete USER 从组 GROUP 中删除用户USER
  • -h:–help 显示此帮助信息并推出
  • -r:–delete-password 删除组密码
  • -R:–restrict 向其成员限制访问组 GROUP
  • -M: --members USER,… 设置组 GROUP 的成员列表
  • -A: --administrators ADMIN,… 设置组的管理员列表

【例 1】
添加或修改、清除组密码


[root@admin ~]# cat /etc/gshadow | grep admin093
admin093:!::  		#可以看到该组未设置密码
[root@admin ~]# gpasswd admin093    #给改组添加密码(若该组无组密码则添加;若该组有组密码则修改)
正在修改 admin093 组的密码
新密码:
请重新输入新密码:
[root@admin ~]# cat /etc/gshadow | grep admin093
admin093:$6$3RpOhOjdPp/d$scPD.dOx/6myxQwck.RnZ0b7W1Z84ywtzhDfhPkmlDtNoN3qObuz5cWmXAXB5wGUa64eQ4jGszgP6f78jRPPQ.:: 
#清除该组密码
[root@admin ~]# gpasswd -r admin093
[root@admin ~]# cat /etc/gshadow | grep admin093
admin093:::  

【例 2】
添加组管理员

[root@admin ~]# gpasswd -A dxk1 admin093
[root@admin ~]# cat /etc/gshadow | grep admin093
admin093::dxk1:

【例 3】
从组中添加或删除用户

#将dxk1用户添加到root组中
[root@admin ~]# gpasswd -a dxk1 root    #其实就等同于 usermod -aG root dxk1
正在将用户“dxk1”加入到“root”组中
[root@admin ~]# cat /etc/group | grep root
root:x:0:dxk1
#将dxk1用户从root组中删除
[root@admin ~]# gpasswd -d dxk1 root
正在将用户“dxk1”从“root”组中删除
[root@admin ~]# cat /etc/group | grep root
root:x:0:

八、批量创建和删除用户

需求:创建100个用户

①如果使用useradd命令一个个创建将会太过麻烦,所以我们考虑使用shell脚本,用for循环实现:

[root@admin ~]# vim UserManage.sh
#!/bin/bash
#写如下内容:
for i in {
    
    001..100}
do
useradd user$i
done     #保存退出
[root@admin ~]# sh UserManage.sh    #执行
grep user /etc/passwd
user001:x:1007:1007::/home/user001:/bin/bash
user002:x:1008:1008::/home/user002:/bin/bash
user003:x:1009:1214::/home/user003:/bin/bash
user004:x:1010:1010::/home/user004:/bin/bash
user005:x:1011:1011::/home/user005:/bin/bash
……省略部分输出信息……
#创建成功

如果要全部删除的话只需将shell脚本中的 useradd user$i 修改为 userdel -r user$i 然后执行即可

但是我们发现,这样存在几个问题,一是没有提示信息,我们无法判断创建用户成功与否;功能太过单一,而且不灵活,如果不想要系统默认的创建方式,想对用户创建指定的家目录和描述信息……就无法实现;三是创建出来的用户名都没密码,那么还得手动设置,比较麻烦,否则没有密码无法登录

下面我们进行改进:

[root@admin ~]# vim UserManage.sh
#内容如下:
#!/bin/bash

USERNAME=admin
DISCRIPTION="Test $i"    
HOMEDIR="/home/"
SHELLTYPE="/bin/bash"  #以上类似于定义变量,如果有其他需求便于修改

for i in {
    
    001..100}
do
useradd -c "$DISCRIPTION" -d $HOMEDIR$USERNAME$i -s $SHELLTYPE $USERNAME$i  #创建用户的同时指定其描述信息、家目录、shell类型
if [ $? -eq 0 ]    #如果创建成功     $?的执行结果是返回上个命令执行后退出的状态,如果状态为0则表示,上一条命令执行成功
then    #if判断条件成立则做:
echo "123456"|passwd  --stdin $USERNAME$i >> /root/builduser.log   #设置每个用户的密码为123456,且将设置成功后的标准输出信息以追加的方式重定向到一个文件中(这里重定向的作用是:防止这些输出信息太多,干扰太大,存到文件中也方便查看哪个用户设置密码没有成功)
echo "User:$USERNAME$i Password:123456" >> /root/password.txt   #将每个用户的用户名和密码以追加的方式重定向到一个文件中去,便于查找
echo "$USERNAME$i built successfully!"  #程序能执行到这里说明以上的语句执行都没有问题,那么就给用户显示创建成功的信息
else #如果创建用户的语句执行失败,即退出状态不为0
echo "$USERNAME$i built unsuccessfully!!!" #那么就向用户显示创建失败的信息
fi
done

保存退出后,执行:

[root@admin ~]# sh UserManage.sh
……省略部分输出……
admin091 built successfully!
admin092 built successfully!
admin093 built successfully!
admin094 built successfully!
admin095 built successfully!
admin096 built successfully!
admin097 built successfully!
admin098 built successfully!
admin099 built successfully!
admin100 built successfully!
[root@admin ~]# cat builduser.log   #查看每个用户设置密码情况
……省略部分输出……
passwd:所有的身份验证令牌已经成功更新。
更改用户 admin098 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 admin099 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 admin100 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@admin ~]# cat password.txt    #查看保存用户名和密码的文件情况
……省略部分输出……
User:admin096 Password:123456
User:admin097 Password:123456
User:admin098 Password:123456
User:admin099 Password:123456
User:admin100 Password:123456

这里还有一个缺点就是,所有用户的密码都一样,仍需改进
解决方法:利用生成的全局唯一标识符uuid来解决

继续改进如下:

#!/bin/bash

USERNAME=admin
DISCRIPTION="Test $i"
HOMEDIR="/home/"
SHELLTYPE="/bin/bash"

for i in {
    
    001..100}
do
useradd -c "$DISCRIPTION" -d $HOMEDIR$USERNAME$i -s $SHELLTYPE $USERNAME$i
if [ $? -eq 0 ]
then
PASSWD=`cat /proc/sys/kernel/random/uuid | cut -b 1-6`  #这里利用uuid生成一个字符串,并截取1至6位作为密码并将它保存在PASSWD变量中
echo $PASSWD | passwd --stdin $USERNAME$i >> /root/pwdrecord.log   #利用每次生成的这个唯一的标识符前6位作为用户的密码,并将设置密码后的标准输出信息以追加的方式重定向到一个文件中,防止屏幕信息输出过多
echo "User:$USERNAME$i Password:$PASSWD" >> /root/userrecord.txt  #!!!这个是必须做的,因为利用生成的uuid,它是随机的。所以必须将这一百个用户的账号和密码对应的存入一个文件中,便于查找使用
echo "$USERNAME$i built successfully!"
else
echo "$USERNAME$i built unsuccessfully!!!"
fi
done

核心:

PASSWD=`cat /proc/sys/kernel/random/uuid | cut -b 1-6`  
echo $PASSWD | passwd --stdin $USERNAME$i >> /root/pwdrecord.log 
echo "User:$USERNAME$i Password:$PASSWD" >> /root/userrecord.txt

执行并查看结果:

[root@admin ~]# sh UserManage.sh 
……省略部分输出信息……
admin093 built successfully!
admin094 built successfully!
admin095 built successfully!
admin096 built successfully!
admin097 built successfully!
admin098 built successfully!
admin099 built successfully!
admin100 built successfully!

可以看到执行成功,再看看两个文件中的内容是否满足要求:

[root@admin ~]# ls
anaconda-ks.cfg  pwdrecord.log  UserManage.sh  userrecord.txt  u.sh
[root@admin ~]# cat pwdrecord.log 
……省略部分输出信息……
passwd:所有的身份验证令牌已经成功更新。
更改用户 admin098 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 admin099 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 admin100 的密码 。
passwd:所有的身份验证令牌已经成功更新。
#可以看到所有用户的密码均设置成功

下面我们看看记录用户名和密码的userrecord.txt文件是否符合要求:

[root@admin ~]# cat userrecord.txt 
……省略部分输出信息……
User:admin092 Password:70df39
User:admin093 Password:72811e
User:admin094 Password:ee3097
User:admin095 Password:3ba0ad
User:admin096 Password:6ef913
User:admin097 Password:5a9c90
User:admin098 Password:d061d7
User:admin099 Password:0be84a
User:admin100 Password:c71913

也没有问题,最后一步检验新创建的用户是否可以登录使用,这里在userrecord.txt文件中随机抽取两组进行检验:

#检验admin100用户
[c:\~]$ ssh [email protected]
[admin100@admin ~]$ 
#检验admin099用户
[c:\~]$ ssh [email protected]
[admin099@admin ~]$ 

可以看到都没有问题。

附:批量删除的shell脚本

[root@admin ~]# vim delete.sh
#内容如下:

#!/bin/bash
for i in {
    
    001..100}
do
userdel -r admin$i
done

猜你喜欢

转载自blog.csdn.net/weixin_45880055/article/details/107585044
今日推荐