第3章用户和组管理






Linux操作系统是一种多用户、多任务的分时操作系统。本章将介绍Linux操作系统的用户和组管理命令。主要包括三方面的内容: Linux用户账户的添加、删除与修改,用户组账户的添加、删除与修改,用户和用户组密码的管理。



视频讲解



3.1用户和组管理概述
Linux系统对用户与组的账户登录通过ID(Identity)号实现,在登录系统时,输入的用户名与密码将会自动将用户名转换为ID号判断其是否存在,然后与存储的加密后的密码进行比对。
在Linux中,用户ID称为UID,组ID号称为GID。UID为0时表示超级用户,取值范围为1~999的UID,系统会预留给系统的虚拟用户。使用超级用户权限创建普通用户的UID从1000开始编号,取值大于或等于1000,例如,本书安装Ubuntu操作系统时创建的ubuntu用户的UID为1000。
Linux中的组分为基本组(私有组)和附加组(公共组)。一个用户同一时刻只能属于一个基本组,但可以同时加入多个附加组; 创建用户时,默认会自动创建同名的组。
3.1.1Linux用户角色划分
Linux系统是分角色管理用户的。角色的不同,用户权限和所完成的任务也不同。另外,需要注意的是,用户和组的角色是可以分别通过UID和GID识别的。
1. 超级用户
超级用户(super user),也称为根用户(root user),其UID值为0。超级用户是Linux系统中唯一拥有最高权限的用户,可以操作任何文件,执行任何命令。超级用户在安装操作系统时创建,默认情况下,超级用户只能在本地登录,而不能远程登录。在Ubuntu操作系统中,一般不使用超级用户直接登录系统。
2. 虚拟用户
虚拟用户也称为程序用户,其UID的取值范围是1~999。与真实用户区分开来,这类用户的最大特点是安装系统后默认就会存在,并且默认情况下是不能登录系统的。它们的存在是为了方便Linux系统管理,与系统进程密切相关,是系统正常运行必不可少的一部分。例如,系统默认创建的daemon、bin、sys、mail、ftp用户等都是虚拟用户,其中,daemon用户由系统的守护进程创建。
3. 普通用户
普通用户是在系统安装完成后由系统管理员创建的,其UID的取值范围是大于或等于1000。普通用户能够管理自身的文件并拥有超级用户赋予的权限,可以直接登录或者远程登录Linux系统。安装Ubuntu操作系统时,可以设置一个被称为Ubuntu系统管理员的普通用户,例如,本书中的ubuntu用户。Ubuntu系统管理员属于sudos,即超级用户组,可以临时使用超级用户权限。
3.1.2id命令查看用户账户ID
命令功能: 查看Linux系统各个用户的UID和GID。
命令语法: id[用户名]。
【例31】id命令查看用户账户ID。
输入以下命令: 



idroot

idubuntu

id

iddaemon

idbin

idsys

idmail

idftp



以上命令的执行效果如图31所示。从图31中可以发现,root用户的用户ID(UID)、组ID(GID)和组序号都为0。本书安装Ubuntu操作系统时创建的ubuntu的用户ID(UID)、组ID(GID)和组编号都为1000。直接输入无参数的id命令会显示当前登录用户,即ubuntu用户的ID信息。接着,使用id命令继续显示虚拟用户,包括daemon、bin、sys、mail、ftp用户的ID信息。可以发现,虚拟用户的UID的取值范围是1~999。


图31id命令查看用户账户ID信息


3.1.3用户和组配置文件
Linux系统的用户配置文件包括/etc/passwd文件和/etc/shadow文件,用户组配置文件包括/etc/group文件和/etc/gshadow文件。/etc/passwd文件存储的是用户账户信息,/etc/shadow文件存储的是用户密码设置信息,/etc/group文件存储的是的组账户信息,/etc/gshadow文件存储的是组密码设置信息。
1. /etc/passwd用户账户信息文件
/etc/passwd文件的每行保存一位用户账户的信息,包括七个字段,每个字段使用冒号“:”隔开,具体格式为: 用户账户名:密码域:UID:GID:注释信息:主目录:命令解释器。/etc/passwd文件各字段具体含义如表31所示。


表31/etc/passwd文件各字段含义



字 段 名含义

用户账户名用户登录系统时使用的用户名。用户名在系统中是唯一的

密码域用x表示,密码已经被映射到/etc/shadow影子文件中

UID用户ID,整数表示。每个用户ID在系统中是唯一的。超级用户的UID是0,虚拟用户的UID取值范围是1~999,普通用户的UID取值范围是大于或等于1000

GID组ID,整数表示。每个组ID在系统中是唯一的

备注用户账户的一些注释信息,如用户全名

主目录用户登录系统后的默认目录

命令解释器用户使用的Shell,默认为/bin/bash

2. /etc/shadow用户密码影子文件
/etc/shadow文件的每行保存一位用户账户的密码设置信息,包括九个字段,每个字段使用冒号“:”隔开,具体格式为:用户账户名:加密后的密码:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留字段。/etc/shadow文件各字段的具体含义如表32所示。

表32/etc/shadow文件各字段含义



字 段 名含义

用户账户名用户登录系统时使用的用户名,与/etc/passwd文件中的用户账户名字段含义一样
加密后的密码加密后的密码由三个部分组成,由$分隔,具体格式为: $加密算法序号$加盐值$加密后的密码。加密算法序号表示为: 0: DES对称加密算法,1: MD5哈希算法,2: Blowfish加密算法,5: SHA256哈希算法,6: SHA512哈希算法。如果密码是“!”,则表示还没有设置密码; 如果密码是“*”,则表示不会使用这个用户账户登录,通常是后台进程

最后一次修改时间上次修改密码的天数(从1970年1月1日开始计算,到修改密码时的天数)

最小时间间隔两次修改密码之间所需的最小天数,在这段时间内不允许修改密码,如果是0,表示可以随时修改密码

最大时间间隔密码保持有效的最大天数,超过这个天数后密码将失效,系统将强制用户修改密码; 如果是99999,表示密码不需要重新输入

续表



字 段 名含义


警告时间密码失效前的警告天数,即用户账户的密码失效前多少天警告用户需要修改密码。普通用户默认为7天

不活动时间密码过期的天数,用户账户的密码过期后多少天会被禁用

失效时间密码失效的天数,从1970年1月1日开始计算,超过这个天数,用户账户的密码将无法使用

保留字段保留、暂未使用

3./etc/group组账户信息文件
/etc/group文件的每行保存一个组的账户信息,包括四个字段,每个字段使用冒号“:”隔开,具体格式为:组名:组密码域:GID:组成员清单。/etc/group文件各字段的具体含义如表33所示。


表33/etc/group文件各字段含义



字 段 名含义

组名用户组登录系统时使用的用户组名,在系统中是唯一的

组密码域用x表示,组密码已经被映射到/etc/gshadow影子文件中

GID用户组ID

组成员清单以逗号分隔的组成员清单

4. /etc/gshadow组密码影子文件
/etc/gshadow文件的每行保存一个组的账户密码设置信息,包括四个字段,每个字段使用冒号“:”隔开,具体格式为:组名:组密码:GID:组成员清单。/etc/gshadow文件各字段的具体含义如表34所示。


表34/etc/gshadow文件各字段含义



字 段 名含义

组名用户组登录系统时使用的用户组名,在系统中是唯一的

组密码加密后的组密码,如果密码是“!”,则表示还没有设置密码,通常不需要设置组密码; 如果密码是“*”,则表示不会使用这个用户账户登录

GID用户组ID

组成员清单以逗号分隔的组成员清单

3.1.4sudo命令
命令功能: 使用超级用户权限。
命令语法: sudo命令名。
【例32】sudo命令查看用户账户和密码信息。
本例将查看Linux系统的用户账户信息文件/etc/passwd和密码影子文件/etc/shadow中root用户和ubuntu用户的信息。查看用户账户信息文件不需要超级用户权限,而查看密码影子文件则需要,因此,需要使用sudo命令,即使用超级用户权限。输入以下命令: 



head-n1/etc/passwd

cat/etc/passwd| grep ubuntu

sudohead-n1/etc/shadow

sudocat/etc/shadow| grep ubuntu



以上命令的执行效果如图32所示。因为etc/passwd和/etc/shadow文件的内容较多,如果只是想查看某个用户的信息,如root用户,可以使用head命令显示第一行的内容,如果想查看其他用户,如ubuntu,那么,需要结合管道和grep命令进行过滤。查看/etc/shadow文件时,需要使用sudo命令


图32sudo命令查看用户账户和密码信息


【例33】sudo命令查看组账户和密码信息。
与查看用户账户信息和影子文件一样,查看/etc/group组账户信息文件不需要超级用户权限,而查看/etc/gshadow组密码影子文件则需要。输入以下命令: 



head-n4/etc/group

sudocat/etc/gshadow | grep root

sudocat/etc/gshadow | grep sudo



以上命令的执行效果如图33所示。从图33中可以看出,使用head命令显示/etc/group文件前4行的内容,即显示了root组、daemon组、bin组和sys组的账户信息,并使用sudo命令查看了/etc/shadow文件,结合管道和grep命令过滤出root组和sudo组密码设置信息。可以发现,这两个组的密码都显示为*,表示没有设置密码。图33最后一行显示查看sudo组的密码设置信息,可以发现,目前sudo组的组成员只有ubuntu用户。


图33sudo命令查看组账户和密码信息


需要注意的是,sudo组是一个比较特殊的组,它是一个超级用户组,如果要临时使用超级用户权限,即使用sudo命令,需要将该用户加入sudo组。本书在后续的实例中将会运用这个知识点

3.2用户管理命令
3.2.1su切换用户和exit回退命令

su命令功能: 切换用户。
su命令语法: su用户名。
exit命令功能: 回退原用户。
exit命令语法: exit。
【例34】su命令切换用户和exit命令回退原用户。
输入以下命令: 



suroot

exit



以上命令的执行效果如图34所示。从图34中可以看出,使用su命令切换到root用户,输入密码,提示符从$变成了#,用户名也变成了root。当输入exit命令后,回到原来的用户ubuntu,提示符恢复$。


图34su命令切换用户和exit命令回退原用户


3.2.2useradd添加用户命令
命令功能: useradd命令可以添加一个新用户,或者添加一个新用户并更新其配置信息。
命令语法: useradd[选项]用户名。
常用参数: useradd命令的常用参数及其含义如表35所示。


表35useradd命令参数含义



参数含义

m如果用户主目录不存在,则创建该主目录

s指定用户登录的Shell环境,默认是/bin/sh

d指定用户登录的主目录

u指定用户账户的UID,但必须唯一

r创建一个系统账户

p指定用户密码,不推荐使用该参数,因为使用该参数对其他用户可见

c指定备注信息,将保存在/etc/passwd文件的备注栏上

e指定失效时间,默认永久有效

续表



参数含义


f指定不活动时间,即密码过期后,账户被彻底禁用之前的天数。0表示立即禁用,-1表示禁用这个功能

G指定用户所属的基本组或者GID,但该组必须存在

g指定用户所属的附属组

【例35】添加“你的姓名1”普通用户,并创建默认主目录。
本例使用“你的姓名1”作为用户名,使用超级用户权限和useradd-m命令创建该普通用户,并创建默认主目录,以及查看用户账户信息文件和用户密码影子文件。输入以下命令: 



sudouseradd-m你的姓名1

id你的姓名1

cat/etc/passwd | grep你的姓名1

sudocat/etc/shadow | grep你的姓名1

ls/home



以上命令的执行效果如图35所示。从图35中可以看出,使用超级用户权限和useradd m命令添加一个yujian1的用户账户,并创建默认主目录。通过id命令查看到该用户的UID、GID和组编号均为1001,组名为yujian1(与用户名同名); 其在/etc/passwd文件中的信息显示该用户的默认主目录为/home/yujian1,使用ls/home命令验证了这一点; 默认Shell环境为/bin/sh; 其在/etc/shadow影子文件中的加密密码是“!”,说明该用户还没有设置密码; 另外,显示最后一次修改时间为19 004天,最小时间间隔为0天,最大时间间隔为99 999天,警告时间为7天。


图35添加“你的姓名1”普通用户,并创建默认主目录


【例36】添加“你的姓名2”普通用户,并将其加入超级用户组。
本例使用“你的姓名2”作为用户名,使用超级用户权限和useradd g命令创建该普通用户,并加入sudo超级用户组,最后查看用户账户信息文件和用户密码影子文件。输入以下命令: 



sudouseradd-gsudo你的姓名2

id你的姓名2

cat/etc/passwd|grep你的姓名2

sudocat/etc/shadow|grep你的姓名2



以上命令的执行效果如图36所示。从图36中可以看出,使用超级用户权限和useradd g命令添加一个yujian2的用户账户,并将该用户加入超级用户组,通过id命令查看到该用户的UID为1002、GID和组编号均为27,组名为sudo; 其在/etc/passwd文件中的信息显示该用户的默认主目录为/home/yujian2,但由于没有使用m参数,因此实际上并没有创建该默认目录,使用ls/home命令验证了这一点; 查看该用户在/etc/shadow文件的信息除用户账户名外,其他内容与例35相同,因此此处不再赘述。


图36添加“你的姓名2”普通用户,并加入超级用户组


【例37】添加“你的姓名3”普通用户,并指定登录主目录。
假设系统管理员打算添加一位远程登录的普通用户,并限制他只能登录到某个指定的主目录。为解决这一问题,本例使用“你的姓名3”作为用户名,使用超级用户权限和useradd d命令创建该普通用户,并指定登录主目录为已经创建好的目录/ftp,最后查看用户账户信息文件和用户密码影子文件。输入以下命令: 



sudomkdir-p/ftp

sudouseradd-d/ftp你的姓名3

id你的姓名3

cat/etc/passwd | grep你的姓名3

sudocat/etc/shadow | grep你的姓名3



以上命令的执行效果如图37所示。从图37中可以看出,首先创建目录/ftp,使用超级用户权限和useradd d命令添加一个yujian3的用户账户,并指定登录主目录为/ftp,通过id命令查看到该用户的UID、GID和组编号均为1003,组名为yujian3(与用户名同名); 其在/etc/passwd文件中的信息显示该用户的默认主目录为/ftp,这与默认创建的在/home下的主目录不同; 查看该用户在/etc/shadow文件的信息除用户账户名外,其他内容与例35相同,因此此处不再赘述。


图37添加“你的姓名3”普通用户,并指定登录主目录


【例38】添加“你的姓名4”普通用户并创建默认主目录,指定备注和失效时间。
本例使用“你的姓名4”作为用户名,使用超级用户权限和useradd m命令创建该普通用户,并使用c和e参数分别指定备注信息和失效时间,最后查看用户账户信息文件和用户密码影子文件。输入以下命令: 



sudouseradd-m-c"expired in 30 days" -e 30 你的姓名4

id你的姓名4

cat/etc/passwd| grep你的姓名4

sudocat/etc/shadow| grep你的姓名4

ls/home



以上命令的执行效果如图38所示。从图38中可以看出,使用超级用户权限和useradd m命令添加一个yujian4的用户账户,并创建默认主目录,使用c参数指定备注信息为expired in 30 days,即30天后过期; 通过id命令查看到该用户的ID、组ID和组编号均为1004,组名为yujian4(与用户名同名); 使用cat命令显示该用户在/etc/passwd文件中的备注和默认主目录信息,查看该用户在/etc/shadow文件的信息除用户账户名外,其他内容与例35相同,因此,此处不再赘述; 使用ls/home命令验证了该命令创建了默认主目录。


图38添加“你的姓名4”普通用户,创建默认主目录,指定备注和失效时间


【例39】添加“你的姓名5”虚拟用户。
本例使用“你的姓名5”作为用户名,使用超级用户权限和useradd r命令创建该虚拟用户,并查看用户账户信息文件和用户密码影子文件。输入以下命令: 



sudouseradd-r你的姓名5

id你的姓名5

cat/etc/passwd | grep你的姓名5

sudocat/etc/shadow | grep你的姓名5



以上命令的执行效果如图39所示。从图39中可以看出,使用超级用户权限和useradd r命令添加一个用户名为yujian5的虚拟用户; 需要注意的是,与例35至例38不同,本例创建的是虚拟用户,其UID的取值范围是1~999; 通过id命令查看到该用户的UID、GID和组编号均为998,UID属于虚拟用户取值范围; 使用超级用户权限和cat命令查看/etc/shadow文件发现,该虚拟用户的最后一次修改时间与前面创建的普通用户一样,但与普通用户不同的是: 最小时间间隔、最大时间间隔和警告时间都没有设置。


图39添加“你的姓名5”虚拟用户


【例310】添加“你的姓名6”普通用户,并指定UID。
在日常工作中,为了方便管理,企事业单位通常使用员工的工号作为员工ID,而学校通常使用学号作为学号ID。本例使用“你的姓名6”作为用户名,使用超级用户权限和useradd u命令将你的学号(本书中以2019119101为例)设置为用户UID,这样,当用户登录Linux系统时,可以很方便地通过其学号和姓名进行识别和管理。最后,查看用户账户信息文件和用户密码影子文件。输入以下命令: 



sudouseradd-u你的学号你的姓名6

id你的姓名6

cat/etc/passwd|grep你的姓名6

sudocat/etc/shadow|grep你的姓名6



以上命令的执行效果如图310所示,添加了用户名为yujian6的普通用户。需要注意的是,与例35至例39不同,本例中用户的UID直接通过命令指定,而不是由系统自动分配。


图310添加“你的姓名6”普通用户,并指定UID


3.2.3passwd设置用户密码命令
命令功能: 设置指定用户账户名密码。
命令语法: passwd用户账户名。
常用参数: passwd命令的常用参数及其含义如表36所示。


表36passwd命令参数含义




参数含义

d即delete,删除指定用户的密码

e即expire,强制指定用户的密码过期

l即lock,锁定指定用户账户

u即unlock,解锁指定用户账户

【例311】passwd命令设置用户密码。
本例使用超级用户权限和passwd命令设置用户密码。为了配合例326破解系统用户密码,本例将“你的姓名1”用户的密码设置为弱口令: 654321,将“你的姓名2”用户的密码设置为弱口令: a12345。输入以下命令: 



sudopasswd你的姓名1

sudopasswd你的姓名2

su你的姓名2

sudocat/etc/shadow|grep你的姓名2

exit



以上命令的执行效果如图311所示。从图311中可以看出,使用超级用户权限和passwd命令分别设置了yujian1和yujian2的弱口令密码,并使用su命令切换到yujian2用户,由于该用户属于sudo超级用户组,因此,该用户能够使用超级用户权限查看/etc/shadow文件的信息。


图311设置用户密码


【例312】passwd命令删除用户密码。
本例为删除“你的姓名3”和“你的姓名6”两个用户的密码。输入以下命令: 



sudocat/etc/shadow|grep你的姓名3

sudopasswd-d你的姓名3

sudocat/etc/shadow|grep你的姓名3

sudopasswd-d你的姓名6



以上命令的执行效果如图312所示。从图312中可以看出,首先使用超级用户权限和cat命令查看yujian3用户没有设置密码之前,在/etc/shadow密码影子文件中的信息。可以发现,其加密后的密码是“!”,表示还没有设置密码; 当使用sudo passwd d删除该用户密码后,其加密后的密码显示为空。


图312删除用户密码


3.2.4usermod修改用户命令
命令功能: 修改用户属性信息,包括锁定和解锁用户、添加到附加组和修改UID。
命令语法: usermod[选项]用户名。
常用参数: usermod命令的常用参数及其含义如表37所示。


表37usermod命令参数含义



参数含义



l即lock,锁定用户

U即unlock,解锁用户

G附加组名称

a即append,也就是将用户附加到附加组中,而不必离开基本组; 需要与G参数一起配合使用

u修改指定用户UID

d修改用户登录的主目录

l修改用户名,注意语法为: usermodl新用户名原用户名

【例313】usermod命令锁定和解锁用户。
本例使用超级用户权限和usermod命令锁定和解锁用户,并使用su切换用户命令进行验证,成功切换到该用户账户后,尝试使用超级用户权限显示密码影子文件的内容。输入以下命令: 



sudousermod-L 你的姓名1

su你的姓名1

sudousermod-U 你的姓名1

su你的姓名1

sudocat/etc/shadow | grep 你的姓名1

exit



以上命令的执行效果如图313所示。从图313中可以看出,使用超级用户权限和usermod L锁定yujian1用户后,使用su命令切换到该用户,显示“su:认证失败”; 在使用usermod U解锁后,再次切换,提示符变成“$”,切换成功。切换到该用户后,尝试使用sudo命令显示密码影子文件,提示“yujian1不在sudoers文件中。此事将被报告。”,意思是提示yujian1用户不在sudo超级用户组中,无法使用sudo命令。这个问题将在下一个例子中解决。


图313usermod命令锁定和解锁用户


【例314】usermod命令将已有用户附加到sudo组,并修改UID。
例313中,由于yujian1用户不属于超级用户组,因此无法使用超级用户权限。本例解决了这一问题: 使用usermod命令将该用户加入sudo组。这需要使用a参数将用户附加到某个附加组和G参数指定组名。需要注意的是,aG参数通常是配合使用的。最后使用u参数修改该用户的UID。输入以下命令: 



sudousermod-aGsudo你的姓名1

su你的姓名1

sudocat/etc/shadow | grep你的姓名1

exit

id你的姓名1

sudousermod-u9999你的姓名1

id你的姓名1



以上命令的执行效果如图314所示。从图314中可以看出,使用usermod aG命令将yujian1添加到sudo超级用户组后,yujian1用户能够使用超级用户权限查看密码影子文件了。因为,不能在已经登录的yujian1用户上直接修改其UID,因此,使用exit命令回到原ubuntu用户后,使用id命令查看yujian1用户的UID为1001,接着使用usermod u命令将其改为9999,再次使用id命令查看,验证了UID已经修改成功。


图314usermod命令将用户附加到sudo组,并修改UID


3.2.5chage更改用户密码有效期命令
命令功能: 更改用户密码有效期信息。
命令语法: chage[选项]用户名。
常用参数: chage命令的常用参数及其含义如表38所示。


表38chage命令参数含义



参数含义

l列出密码的有效期

m两次修改密码相距的最小天数,如果为0,则表示随时可以修改

M密码有效的最大天数

E指定密码过期时间,0表示立刻过期,-1表示永不过期

【例315】chage命令直接修改用户密码的有效期。
本例使用chage命令和m、M参数直接将用户账户的有效期修改为两次修改密码相距的最小天数为7天,密码有效的最大天数为30天。输入以下命令: 



sudochage-1你的姓名3

sudochage-m7-M30你的姓名3

sudochage-1你的姓名3



以上命令的执行效果如图315所示。使用chage命令修改yujian3用户密码有效期: 两次修改密码相距的最小天数从0天修改为7天,密码有效的最大天数从99999天修改为30天。


图315chage命令直接修改用户密码的有效期


【例316】chage命令交互式修改用户账户的有效期。
本例使用chage命令交互式修改用户账户的有效期,不需要任何参数。对不需要修改的选项,直接输入后按Enter键跳过即可。输入以下命令: 



sudochage-1你的姓名4

sudochage你的姓名4

sudochage-1你的姓名4



以上命令的执行效果如图316所示。从图316中可以看出,使用chage命令交互式修改yujian4用户密码有效期: 两次修改密码相距的最小天数从0天修改为7天,密码有效的最大天数从99 999天修改为30天。需要注意的是,在交互式选项中,最小密码年龄表示两次修改密码相距的最小天数,最大密码年龄密码有效的最大天数。


图316chage命令交互式修改用户账户的有效期


3.2.6userdel删除用户命令
命令功能: 删除指定用户。
命令语法: userdel[选项]用户名。
常用参数: userdel命令的常用参数及其含义如表39所示。


表39userdel命令参数含义



参数含义

r删除指定用户,并递归删除其主目录下的所有文件和文件夹

f强制删除用户,即使该用户已经登录系统

【例317】userdel命令删除用户及其主目录。
本例使用userdel命令分别删除三个用户及其主目录。输入以下命令: 



sudouserdel你的姓名5

sudouserdel-r你的姓名4

ls/home



打开一个新终端,输入以下命令: 



su你的姓名3

sudouserdel-r你的姓名3

sudouserdel-rf你的姓名3



以上命令的执行效果如图317所示。从图317中可以看出,使用userdel命令删除yujian5用户,由于该用户是虚拟用户,没有创建主目录,因此不需要使用任何参数直接删除即可。对于yujian4普通用户,在例31中已经创建了主目录,需要使用r参数删除其对应的主目录。对于yujian3普通用户,特意打开一个新终端,切换到该用户上,使该用户登录系统,再使用r参数删除时,显示userdel:user yujian3 is currently used by process 6441,意思是yujian3用户正在由进程6441使用。因此,需要使用rf参数强制删除。


图317userdel命令删除用户及其主目录


3.3用户组管理命令
3.3.1groupadd添加用户组命令

命令功能: 添加用户组。
命令语法: groupadd用户组名。
常用参数: groupadd命令的常用参数及其含义如表310所示。


表310groupadd命令参数含义



参数含义


g指定新建用户组的GID

f如果组已存在,则此参数失效; 如果GID已被使用,则取消

r创建系统组账户,GID小于1000

【例318】groupadd命令添加用户组。
本例使用groupadd命令分别添加两个用户组,并指定GID。输入以下命令: 



sudogroupadd-g6666student

cat/etc/group | grep student

sudogroupadd-g8888teacher

cat/etc/group | grep teacher



以上命令的执行效果如图318所示。从图318中可以看出,使用groupadd命令添加了student用户组,并指定GID为6666; 添加了teacher用户组,并指定GID为8888,并使用cat命令查看/etc/group文件中的组信息。


图318groupadd命令添加用户组


3.3.2groupmod修改用户组命令
命令功能: 修改用户组属性信息,包括用户组的GID和用户组名。
命令语法: groupmod[选项]组名。
常用参数: groupmod命令的常用参数及其含义如表311所示。


表311groupmod命令参数含义



参数含义

g修改用户组的GID

n修改用户组名

【例319】groupmod命令修改组名和GID。
本例使用groupmod命令修改用户组名和GID。输入以下命令: 



sudogroupmod -nstustudent

sudogroupmod-g你的班级号stu

cat/etc/group|grep stu



以上命令的执行效果如图319所示。从图319中可以看出,使用groupmod命令修改了student用户组名为stu,并修改了GID为你的班级号(本书以20191191为例),最后查看/etc/group文件验证了用户组信息已经成功修改。


图319groupmod命令修改组名和GID


3.3.3gpasswd管理用户组命令
命令功能: 管理用户组,包括添加或删除用户,设置和删除组密码,以及指定管理员。
命令语法: gpasswd[选项]用户组名。
常用参数: gpasswd命令的常用参数及其含义如表312所示。


表312gpasswd命令参数含义



参数含义



a添加用户到组

d从组中删除用户

r删除组密码

A指定组管理员,不一定是组内成员,组管理员可以增删成员,修改组密码等操作

M指定组成员

【例320】gpasswd命令添加和删除用户。
本例使用gpasswd命令添加两个用户并分别添加到用户组,并从用户组中删除一个用户,最后通过id命令查看用户所属的组名是否修改成功。输入以下命令: 



sudogpasswd-a你的姓名1teacher

id你的姓名1

sudogpasswd-a你的姓名6teacher

sudogpasswd-a你的姓名6stu

id你的姓名6

sudogpasswd-d你的姓名6teacher

id你的姓名6



以上命令的执行效果如图320所示。从图320中可以看出,首先使用gpasswd a命令将yujian1添加到了teacher组,将yujian6添加到了teacher组和stu组。yujian6同时属于教师组和学生组,这有些不合理。接着,使用gpasswd d命令将yujian6用户从teacher组中删除。最后使用id命令验证了修改结果是否正确。可以发现,yujian1用户属于yujian1基本组、sudo附加组和teacher附加组,yujian6用户属于yujian6基本组、stu附加组。


图320gpasswd命令添加和删除用户


【例321】gpasswd命令设置和删除组密码。
本例设置stu组的密码,将teacher组密码删除,并通过/etc/gshadow密码影子文件查看设置情况。输入以下命令: 



sudogpasswdstu

sudocat/etc/gshadow|grep stu

sudogpasswd-rteacher

sudocat/etc/gshadow|grep teacher



以上命令的执行效果如图321所示。从图321中可以看出,使用gpasswd命令设置了stu用户组的密码(可设置为弱口令123456),目的在于方便课后习题(实操题)使用john软件破解; 使用gpasswd r命令删除了teacher组密码。通过/etc/gshadow文件,读者可以发现stu组记录末尾显示组成员有用户yujian6,teacher组记录末尾显示组成员有用户yujian1,并且teacher组密码为空。


图321gpasswd命令设置和删除组密码


3.3.4groupdel删除用户组命令
命令功能: 删除用户组。
命令语法: groupdel用户组名。
【例322】groupdel命令删除用户组。
本例首先添加了一个用户组testgroup,并使用tail n1命令查看/etc/group文件的最后一行; 然后在确认创建了该用户组后,使用groupdel命令删除,并查看/etc/group文件。输入以下命令: 



sudogroupaddtestgroup

tail-n1/etc/group

sudogroupdeltestgroup

cat/etc/group | grep testgroup



以上命令的执行效果如图322所示。删除testgroup用户组后,在/etc/group组账户信息文件中查找testgroup,显示结果为空,表明该用户组已经成功删除。


图322groupdel命令删除用户组






视频讲解



3.4用户和组的运行维护
3.4.1chpasswd批量修改用户密码命令

命令功能: 从系统的标准输入读入用户名和密码,对已存在的用户修改密码,达到批量修改用户密码的目的。
命令语法: echo用户名: 密码|chpasswd。
【例323】chpasswd命令批量修改用户密码。
本例通过一个Shell脚本文件批量添加用户user01~user10,共10个用户,并使用useradd g命令指定用户所属的组为stu; 通过chpasswd命令批量修改用户密码为123456。最后使用tail命令查看/etc/passwd文件信息,观察用户是否批量添加成功。输入以下命令: 



geditadduser.sh



打开gedit窗口后,输入以下Shell脚本内容: 



#!/bin/bash

foriin{01..10}

do

useradduser$i-gstu

echouser$i: 123456 | chpasswd

done



保存并关闭窗口。该脚本中,$i表示获取变量i的值,{01..10}表示01~10的数字序列。输入以下命令: 



sudobashadduser.sh

tail/etc/passwd

iduser01

suuser01

exit



以上命令的执行效果如图323所示。从图323中可以看出,使用tail命令查看到这10个用户已经批量添加成功,并加入了stu组(GID为20191191)。选择第一个用户user01进行验证,使用id命令查看其用户组,使用su命令输入密码123456,如果密码输入正确,就会跳转到下一行,在提示符$后可以继续输入命令,表示切换成功; 否则会提示用户“su: 认证失败”。


图323chpasswd命令批量修改用户密码


需要注意的是,本例首先批量添加了用户,如果完成后需要批量删除用户,可以输入以下命令: 


geditdeluser.sh



打开gedit窗口后,输入以下Shell脚本内容: 



#!/bin/bash

foriin{01..10}

do

userdeluser$i

done



保存并关闭窗口。然后输入以下命令: 



sudobashdeluser.sh



此时即可删除以上创建的10个用户。
3.4.2awk命令列出系统用户
/etc/passwd文件和/etc/group文件中,各字段采用冒号作为分隔符。可以使用awk命令,并使用F参数指定冒号作为分隔符,列出系统中的所有用户名,或者某些用户名。
【例324】awk命令列出当前系统的某些用户名。
输入以下命令: 



awk-F': ''{print $1}'/etc/passwd|grep你的姓名

awk-F': ''{print $1}'/etc/group|tail-n4



以上命令的执行效果如图324所示。使用awk F命令结合grep命令显示了包括yujian关键字的用户名,结合tail n4命令显示了用户组账户信息文件最后4行的内容。


图324awk命令列出当前系统的某些用户名


3.4.3修改用户名和主目录的方法和命令
当不满意安装时设定的用户名时,由于已经在该用户上做了很多配置并安装了很多软件,不希望再新建用户,这时最好在原来的基础上直接修改用户名。一个修改用户名和主目录的简单粗暴的方法是修改三个配置文件: /etc/passwd、/etc/shadow和/etc/group,将这三个文件中的原用户名修改为现在需要设置的用户名,同时修改/etc/passwd中的主目录。也可以综合使用多个命令来修改用户名和主目录。
【例325】修改用户名和主目录之简单粗暴法。
首先切换到root用户,然后创建用户testuser,分别编辑以上三个配置文件,定位到文件内容的最后一行,将用户名testuser修改为“你的姓名7”,其他内容不要修改,保存并关闭窗口。用户配置即可生效。输入以下命令: 



suroot

useradd-mtestuser

passwdtestuser



为了方便例326中的john软件破解,设置密码为弱口令: 123456。



gedit/etc/passwd



定位到最后一行,将testuser修改为“你的姓名7”,保存并关闭窗口。



gedit/etc/shadow



定位到最后一行,将testuser修改为你的姓名7,保存并关闭窗口。



gedit/etc/group



定位到最后一行,将testuser修改为你的姓名7,保存并关闭窗口。



exit

su你的姓名7

exit



以上命令的执行效果如图325所示。将以上三个配置文件对应的用户名信息修改后,输入su命令切换到yujian7,输入创建testuser用户时设置的密码123456,即可成功切换。


图325修改用户名


【例326】修改用户名和主目录之命令法。
本例综合使用多个命令修改用户名和主目录。输入以下命令: 



sudouseradd-mtemp

sudopasswdtemp

sudousermod-l你的姓名8temp

sudomv/home/temp/home/你的姓名8

sudousermod-d/home/你的姓名8你的姓名8

sudocat/etc/passwd|grep你的姓名8



以上命令的执行效果如图326所示。从326中可以看出,首先,创建temp用户,使用m参数创建对应的主目录/home/temp,并设置较复杂和难以破解的密码,例如,本书设置为hstc; 然后,使用usermod-l命令将temp用户名改为yujian8,将主目录/home/temp重命名为主目录/home/yujian8,使用usermod d命令将yujian8用户的主目录设为/home/yujian8; 最后,通过查看/etc/passwd文件,可以发现yujian8的用户名和主目录都已经修改成功了。


图326修改用户名和主目录


3.5综合实例: 使用john软件破解系统用户密码
/etc/passwd存放的是用户账户信息,而/etc/shadow存放的是用户的加密后密码信息。Linux操作系统采用安全哈希算法(MD5、SHA1)等加密用户密码,使加密后的用户密码不可逆向破解,即黑客无法从密文直接推导出明文。那么,如果想要破解Linux操作系统用户密码,只能采用字典攻击等蛮力破解方式了。
本综合实例中,首先编译john破解软件,生成其可执行文件,然后将用户名信息和用户密码信息重定向为一个新的文件,最后john软件通过字典模式破解。需要注意的是,编译john软件,需要安装GCC和make。如果系统没有安装,可以输入以下命令进行安装: 



sudo apt update

sudo apt install gcc

sudo apt install make



读者可以从本书的配套资源中下载john 1.9.0.tar.gz,并复制至Ubuntu操作系统的Downloads目录下,然后输入以下命令: 



cdDownloads

tar-xzvfjohn-1.9.0.tar.gz

cdjohn-1.9.0/src

makecleanlinux-x86-64

cd..

cdrun

sudo./unshadow/etc/passwd/etc/shadow>myshadow



以上命令的执行效果如图327所示。从图327中可以看出,将john软件使用make命令编译成功后,在其run目录下,使用超级用户权限和./执行unshadow程序,将/etc/passwd和/etc/shadow合成文件myshadow。


图327编译john破解软件


接着,可以使用./执行john破解程序,采用字典模式去破解myshadow文件,最后显示破解结果。输入以下命令: 



sudo./john-w: password.lstmyshadow

sudo./john-showmyshadow



以上命令的执行效果如图328所示。从图328中可以发现,由于在前面章节中是将各用户密码设置为弱口令,因此,使用john软件能够在比较短的时间内破解出大部分用户的密码: yujian1用户的密码为654321,yujian2用户的密码为a12345,yujian6用户没有密码(密码被删除),yujian7用户和user01~user10用户的密码为123456。这个实例说明,如果将用户的密码设置为弱口令,是很容易被破解的。在日常工作中,设置密码最好包含字母、数字和特殊字符,这样安全性比较高,难以被破解。


图328破解用户密码结果


3.6课后习题
一、 填空题
1. 使用超级用户权限,添加一个名为testuser的用户,并为该用户创建用户主目录和登录bash shell的命令是。
2. 使用超级用户权限,设置用户yy的密码的命令是。
3. 使用超级用户权限,锁定用户yy的命令是。
4. 使用超级用户权限,解锁用户yy的命令是。
5. 使用超级用户权限,强制删除用户yy,并且删除该用户文件夹的命令是。
6. 使用超级用户权限,添加用户yy,并将其加入sudo超级用户组的命令是。
7. 使用超级用户权限,将已有用户yy附加到sudo组的命令是。
8. 使用超级用户权限,修改teach用户组名为teacher的命令是。
9. 使用超级用户权限,将8888作为用户组ID,创建用户组teach的命令是。
10. 使用超级用户权限,修改teacher用户组ID为6666的命令是。
11. 使用超级用户权限,设定teach用户组的密码的命令是。
12. 使用超级用户权限,删除teach用户组的密码的命令是。
13. 使用超级用户权限,删除用户组名为teacher的命令是。
14. 在主目录上,分析并只提取出所有系统用户名的命令是。
15. 使用超级用户权限,直接修改用户yy的密码有效期为两次密码修改最小天数为7天,密码有效的最大天数为30天的命令是。
16. 用cat命令查看用户组名信息的命令是。
17. 使用超级用户权限和cat命令查看用户组影子文件的命令是。
18. 使用超级用户权限、john软件和字典模式破解系统用户密码的命令是。提示: 已经合成了用户信息和密码信息文件xx,字典文件为password.lst。
19. 修改已经创建用户的用户名,需要修改的三个配置文件分别是、和。
20. 使用超级用户权限,将用户名xx改为yy的命令是。
二、 实操题
1. 批量删除例323所创建的user01~user10用户后,再批量添加stu01~stu10用户,同样指定所属的用户组为stu。
2. 借鉴例326中的方法,使用john软件破解用户组密码。