第5章Linux系统用户管理



本章学习目标
 了解Linux的用户和组的管理。
 掌握用户管理的相关命令。
 熟悉组管理的相关命令。

在Linux系统中,任何文件都属于某一特定用户,而任何用户都至少隶属于一个用户组。用户是否有权限对某文件进行访问、读写以及执行,受到用户与用户组管理系统的严格约束。本章将对Linux系统中重要的用户和用户组管理文件进行介绍,并且介绍如何进行管理。
5.1Linux用户介绍 
5.1.1用户和用户组

登录Linux系统时,用户通过特定的用户名(Username)来标识自己,用户的用户名就代表用户自己。用户所做的任何事情都与用户的用户名有关: 系统上运行的每个进程都有一个相关的用户名。用户的用户名与用户所保存的内容有关: 系统上每个文件被表明由某个特定用户所拥有。用户的用户名与用户使用的内容有关: 用户所使用的磁盘空间总量或者用户使用的处理器时间总量都可以通过用户名追踪到。
系统上每个用户不仅有唯一的用户名,也有唯一的用户ID,用户ID缩写为UID。Linux系统分配的UID是一个32位整数,这意味着最多可以有232个不同的用户。人们喜欢用文字来思考,而对Linux内核而言使用数字更简单。当内核记录谁拥有进程或者谁拥有文件时,它记下的是用户ID而不是用户名。
系统有一个数据库,存放着用户名与UID的对应关系,这个数据库被保存在配置文件/etc/passwd中。Linux像UNIX一样有一个优良的传统,那便是系统配置文件也是可读格式的文本,从而可以方便地用文本编辑器来编辑修改。用户和管理员可以用处理文本的小工具,如分页查看程序来检查这个数据库。系统中的大多数用户都有权限读取这个文件,但是不能进行修改。
由于每个文件必须有一个组所有者,因此必须有一个与每个用户相关的默认组。这个默认组成为新建文件的组所有者,被称作用户的主要组。除了主要组以外,用户也可以根据需要隶属于其他组,这些组被称作次要组。
5.1.2用户分类
在Linux系统中,将用户分成3类: 普通用户、超级用户和系统用户。
1. 普通用户
普通用户是使用系统的多数用户人群。普通用户通常通过/bin/bash登录Shell,把/home作为用户主目录。一般情况下,普通用户只在自己的主目录和系统范围内的临时目录中创建文件。


2. 超级用户
超级用户的UID为0。超级用户在系统上有完全权限: 可以修改和删除任何文件; 可以运行任何命令; 可以取消任何进程。超级用户负责增加和保留其他用户,配置添加系统软硬件。超级用户通常使用/root作为主目录。
3. 系统用户
大多数Linux系统会将一些低UID保留给系统用户。系统用户不代表人,而代表系统的组成部分。例如,处理电子邮件的进程经常以用户名mail来运行; 运行Apache网络服务器的进程经常作为用户apache来运行。系统用户通常没有登录Shell,因为它们不代表实际登录的用户。同样地,系统用户的主目录很少在/home中,而通常在属于相关应用的系统目录中。例如,用户apache的目录/var/www。
用户类型及其ID范围如表5.1所示。

表5.1Linux用户类型及ID范围



用户ID范围用户类型

0根用户
1~499系统用户
500+普通用户

5.2相 关 文 件
Linux操作系统在存储用户信息时,继承了UNIX的传统,把全部用户信息保存为普通的文本文件。它们分别是passwd文件、shadow文件、group文件、gshadow文件。这些文件通过文本编辑器就可以查看。
5.2.1passwd文件
在Linux操作系统中,用户的关键信息被存放在系统的/etc/passwd文件中,系统的每一个合法用户账号对应于该文件中的一行记录。这行记录定义了每个用户账号的属性。用户数据按字段以冒号分隔,格式如下。

username:password:uid:gid:userinfo:home:shell

其中,各个字段的含义如表5.2所示。

表5.2/etc/passwd字段说明



字段名编号说明

username1给一个用户可读的用户名称
password2加密的用户密码
uid3用户ID,Linux内核用这个整数来识别用户
gid4用户组ID,Linux内核用这个整数识别用户组
userinfo5用来保存帮助识别用户的简单文本
home6当用户登录时,分配给用户的主目录
shell7登录Shell是用户登录时的默认Shell,通常是/bin/bash

范例: 解释图5.1中第一个用户root的基本信息。

图5.1passwd文件

root用户的基本信息如表5.3所示。

表5.3root用户的基本信息



字段名编号说明

username1root
password2x
uid30
gid40
userinfo5root
home6/root
shell7/bin/bash

5.2.2shadow文件
用户的加密密码通常被保存在/etc/passwd文件的第二个字段中。由于/etc/passwd文件所包含的信息远远多于单纯的密码,每个人都必须能够读取它,因此,随着计算机性能的飞速发展,即使是暴露密码的加密形式也是非常危险的。高性能计算机可以通过穷举,在很短的时间破解密码,这就是“暴力”破解。
因此,在Linux和UNIX系统中,采用一种更新的叫作“影子密码”的技术来保存密码,用户的密码被保存在专门的/etc/shadow文件中。由于该文件包含的是只与密码有关的信息,所以其权限不允许普通用户查看内容。查看这个文件需要超级管理员root的权限。
和/etc/passwd文件类似,/etc/shadow文件中的每行记录一个合法用户账号的数据,文件中的每一行的数据也是用冒号分隔,格式如下。

username: password:lastchg:min:max:warn:inactive:expire:flag

其中,各个字段的含义如表5.4所示。

表5.4/etc/shadow字段说明



字段名编号说明

username1用户的登录名
password2加密的用户密码
lastchg3自1970年1月1日起到上次修改口令所经过的天数
min4两次修改口令之间至少经过的天数
max5口令还会有效的最大天数
warn6口令失效前多少天内向用户发出警告
inactive7禁止登录前用户还有效的天数
expire8用户被禁止登录的时间
flag9保留

范例: 解释图5.2中第一个用户root的shadow信息。

图5.2shadow文件

对root用户的信息进行解释,该信息含义如表5.5所示。

表5.5root用户的shadow文件信息



字段名编号说明

username1root
password2加密口令: $6$zAkvHVUq$Rg0ruC1MW8Iw.2 NiJMR/FDqt6/0q8vtGuLqaiXzED.YchzObeweCp3hvagWBOzl4rrNWnRqshEAuNPZs
HvbH1
lastchg3自1970年1月1日起到上次修改口令所经过的天数: 0
min4需几天可以修改口令: 0天
max5口令还会有效的最大天数: 99999天,即永不过期
warn6口令失效前7天内向用户发出警告
inactive7禁止登录前用户还有效的天数未定义,以“:”表示
expire8用户被禁止登录的时间未定义,以“: ”表示
flag9保留未使用,以“: ”表示

5.2.3group文件
Linux内核用32位整数来标识用户组。/etc/group文件把组名与组ID联系在一起,并且定义了用户属于哪些组。/etc/group文件对组的作用相当于/etc/passwd文件对用户的作用,有着类似的结构和更合理的名称。这也是一个以行为单位的配置文件,每行含有被冒号隔开的字段,格式如下。

group_name:group_password:group_id:group_members

其中,各个字段的含义如表5.6所示。

表5.6/etc/group字段说明



字段名编号说明

group_name1用户组名
group_password2加密后的用户组密码
group_id3用户组ID
group_members4逗号分隔开的组成员

范例: 解释图5.3中第一个组root的组信息。

图5.3group文件

root用户组的信息如表5.7所示。


表5.7root用户组的信息



字段名编号说明

group_name1root
group_password2加密后的用户组密码: x
group_id30
group_members4group_members4没有组成员

5.2.4gshadow文件
和用户账号文件passwd一样,为了防止暴力破解,用户组文件也采用将组口令与组的其他信息分离的安全机制,即使用/etc/gshadow文件存储加密的组口令。查看这个文件需要root权限。gshadow文件也是一个以行为单位的配置文件,每行含有被冒号隔开的字段,gshadow文件的格式如下。

group_name:group_password:group_id:group_members

其中,各个字段的含义如表5.8所示。

表5.8/etc/gshadow字段说明



字段名编号说明

group_name1用户组名
group_password2加密后的用户组密码: 
group_id3用户组ID(可以为空)
group_members4逗号分隔开的组成员(可以为空)

范例: 解释图5.4中root组的信息。

图5.4gshadow文件

root用户组的信息如表5.9所示。

表5.9root用户组的信息



字段名编号说明

group_name1root
group_password2加密后的用户组密码: *
group_id3空
group_members4空

5.3用户管理命令
5.3.1useradd命令

功能描述: 在Linux系统中创建新用户。
语法: 

useradd [选项] 用户名

选项: useradd命令中的常用选项如表5.10所示。

表5.10useradd命令选项



选项作用

d指定用户主目录
g指定gid
u指定uid
l不要把用户添加到lastlog和failog中,这个用户的登录记录不需要记载
m自动创建用户主目录
p指定新用户的密码
r建立一个系统账号
s指定Shell

范例: 
使用useradd命令创建一个test用户。用户组为test,登录Shell为/bin/bash,用户主目录为/home/Mym,命令的执行过程和结果如图5.5所示。

图5.5使用useradd命令创建用户

使用useradd命令创建一个test2用户。创建时useradd后面不添加任何参数选项,命令的执行过程和结果如图5.6所示。

图5.6使用useradd命令创建三无用户

使用useradd命令时,如果后面不添加任何参数选项,创建出来的用户将是默认的“三无”用户: 一无主目录,二无密码,三无系统Shell。
在Ubuntu系统中,还有一个可以创建用户的命令: adduser。使用adduser命令时,创建用户的过程更像是一种人机对话过程,系统会提示用户输入各种信息,然后会根据这些信息创建新用户。
范例: 使用adduser命令创建一个test1用户命令的执行过程和结果如图5.7所示。

图5.7使用adduser命令创建用户

adduser命令简单,适合初级使用者,因为不用去记那些烦琐的参数选项,只要跟着系统的提示一步一步去做即可完成。而useradd命令适合有经验的使用者,往往一行命令加参数就能解决很多问题,所以创建起来十分方便。
5.3.2passwd命令
功能描述: 为新增加的用户设置口令,也可以更改原有用户的口令,管理员还可以使用passwd命令锁定某个用户账户。
语法: 

passwd[选项]用户名

选项: passwd命令中的常用选项如表5.11所示。

表5.11passwd命令选项



选项作用

l管理员锁定已经命名的账户名称
u管理员解开账户锁定状态
x管理员设置最大密码使用时间(天)
n管理员设置最小密码使用时间(天)
d管理员用来删除用户的密码

范例: 为新建用户testl设定密码。命令的执行过程如图5.8所示。

图5.8为test设定密码

5.3.3usermod命令
功能描述: 修改用户账户的信息。
语法: 

usermod [选项]用户名

选项: 命令中的常用选项如表5.12所示。

表5.12usermode命令选项



选项作用

d修改用户主目录
e修改账号的有效期限
f修改在密码过期后多少天即关闭该账号
g修改用户所属的组
G修改用户所属的附加组
l修改用户账号名称
L锁定用户密码,使密码无效
s修改用户登录后所使用的Shell
u修改用户ID
U解除密码锁定

范例: 
将test1用户添加到组users中,命令的执行过程如图5.9所示。

图5.9修改用户附加组

修改Mym的用户名为Myx。命令的执行过程如图5.10所示。
锁定账号Myhx,锁定账号后,使用文本编辑器查看/etc/shadow,用户的密码项的开始处插入一个感叹号表示用户被锁定。命令的执行过程如图5.11所示。

图5.10修改用户名


图5.11锁定用户

解除对Myx的锁定,使用文本编辑器查看/etc/shadow,用户的密码项的开始处的感叹号消失,表示用户的锁定被解除。命令的执行过程如图5.12所示。

图5.12解除锁定

5.3.4userdel命令
功能描述: userdel命令用来删除系统中的用户。
语法: 

userdel [选项] 用户名

选项: userdel命令中的常用选项如表5.13所示。

表5.13userdel命令选项



选项作用

 r删除账户时,连同用户主目录一起删除
范例: 
删除test1账户,不删除用户主目录。命令的执行过程和结果如图5.13所示。

图5.13不删除用户主目录

删除test1账户,并将用户主目录一同删除。命令的执行过程和结果如图5.14所示。

图5.14删除用户主目录

5.4用户组管理命令 
5.4.1groupadd命令

功能描述: groupadd命令可指定组名称来建立新的组账号。
语法: 

groupadd [选项]组名

选项: groupadd命令中的常用选项如表5.14所示。

表5.14groupadd命令选项



选项作用

g组ID,除非使用o选项,否则该值必须唯一
o允许设置相同组ID的群组
r建立系统组
f强制执行,创建相同ID的组
范例: 新建组helo,指定gid为400。命令的执行过程和结果如图5.15所示。

图5.15新建组

5.4.2groupmod命令
功能描述: groupmod命令用来修改用户组属性。
语法: 

groupmod [选项] 组名

groupmod命令中的常用选项如表5.15所示。

表5.15groupmod命令选项



选项作用

g指定组ID
o与groupadd相同
n修改用户组名

范例: 修改组helo的组名为ehlo,gid为6000。命令的执行过程和结果如图5.16所示。

图5.16修改组

5.4.3groupdel命令
功能描述: groupdel命令可以从系统上删除组。如果该组中仍包含某些用户,则必须先删除这些用户后,方能删除组。
语法: 

groupdel 组名

范例: 为组ehlo添加新用户wangli,然后删除组ehlo。命令的执行过程和结果如图5.17所示。

图5.17删除组


5.4.4gpasswd命令
功能描述: gpasswd命令用来管理组。使用gpasswd命令为组设定密码,让知道该组密码的用户可以暂时切换具备该组功能。
语法: 

gpasswd [选项]组名

gpasswd命令中的常用选项如表5.16所示。

表5.16gpasswd命令选项



选项作用

a指定组ID
d从组删除用户
A指定管理员
M指定组成员
r删除密码
R限制用户登录组,只有组中的成员才可以用newgrp加入该组

范例: 系统中有个test账户,该账户本身不是users群组的成员,就不能为该组添加成员。通过gpasswd命令将test用户设置为users群组的管理员,之后test就可以为users组添加成员了。命令的执行过程如图5.18和图5.19所示。


图5.18查看test账户信息


图5.19gpasswd命令应用


5.5su和sudo命令 
5.5.1su命令

功能描述: su命令的作用是切换用户,超级权限用户root向普通或虚拟用户切换不需要密码,而普通用户切换到其他任何用户都需要密码验证。
语法: 

su [选项] 用户名

su命令中的常用选项如表5.17所示。

表5.17su命令选项



选项作用

l切换用户时,如同重新登录,如果没有指定用户名,默认为root
p切换当前用户时,不切换用户工作环境,此为默认值
c以指定用户身份执行命令
切换当前用户时,切换用户工作环境

范例: 切换用户名
不切换用户工作环境,命令的执行过程如图5.20所示。

图5.20不切换用户工作环境

范例: 切换用户名,并切换用户工作环境,命令的执行过程如图5.21所示。

图5.21切换用户工作环境

5.5.2sudo命令
使用su 命令切换到超级权限用户root后,权限是无限制的。但是当服务器的管理有多人参与时,有时不能明确哪些工作是由哪个用户切换到超级权限用户进行的操作。这对于服务器系统来说是不安全的。所以最好是针对每个管理员的技术特长和管理范围,有针对性地下放权限,并且约定其使用哪些工具来完成与其相关的工作,这时就有必要用到sudo命令了。在Ubuntu系统中,默认会将root用户关闭,使用sudo命令来获得root权限。
功能描述: 允许超级权限用户root为其他用户委派权利,使之能运行部分或全部由root用户执行的命令。
语法: 

sudo [选项]命令

sudo命令中的常用选项如表5.18所示。

表5.18sudo命令选项



选项作用

h列出帮助信息
V列出版本信息
l列出当前用户可以执行的命令
u以指定用户的身份执行命令
k清除timestamp文件,下次使用sudo时需要再输入密码
b在后台执行指定的命令
p更改询问密码的提示语
不是执行命令,而是修改文件,相当于命令sudoedit

范例: test用户环境
查看/root目录的内容,命令的执行过程如图5.22所示。

图5.22sudo命令范例1


test用户为test2用户设置密码,命令的执行过程如图5.23所示。

图5.23sudo命令范例2


范例: 清除timestamp文件,下次使用sudo命令时需要再输入密码,命令的执行过程如图5.24所示。

图5.24sudo命令范例3

sudo命令的执行流程是当前用户切换到root(或其他指定切换到的用户),然后以root(或其他指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户; 而这些前提是要通过sudo的配置文件/etc/sudoers来进行授权。
通过sudo命令,能有针对性地下放某些超级权限,并且不需要普通用户知道root密码,所以sudo命令相对于权限无限制性的su命令来说,还是比较安全的,sudo也被称为受限制的su。另外,sudo是需要授权许可的,所以也被称为授权许可的su。
小结
本章主要介绍了Linux系统中用户和组的管理,包括一些重要的文件的使用,以及管理用户和组的相关命令的使用方法。这一章介绍的内容对于系统的管理是很重要的一部分内容。
习题
1. 下面关于passwd命令说法不正确的是()。
A. 普通用户可以利用passwd命令修改自己的密码
B. 超级用户可以利用passwd命令修改自己和其他用户的密码
C. 普通用户不可以利用passwd命令修改其他用户的密码
D. 普通用户可以利用passwd命令修改自己和其他用户的密码
2. 文件exer的访问权限为rwrr,现要增加所有用户的执行权限和同组用户的写权限,下列命令正确的是()。
A. chmod a+x g+w exerB. chmod 765 exer
C. chmod o+x exer D. chmod g+w exer
3. 为了保证系统的安全,目前的Linux一般是将用户账号的口令信息加密后存储于()文件中。
A. /etc/passwdB. /etc/shadow
C. /var/passwdD. /var/shadow
4. passwd文件各字段说明中,表示使用者在系统中的名字是()。
A. accountB. passwordC. UIDD. GID
5. 把用户名“liuyidan”改为“lyd”,使用的命令是()。
A. #usermod l lyd liuyidanB. #usermod L lyd liuyidan
C. #useradd L lyd liuyidanD. #useradd l lyd liuyidan
6. 在终端提示符后使用useradd命令,该命令没做下面()操作。
A. 在/etc/passwd文件中增添了一行记录
B. 在/home目录下创建新用户的主目录
C. 将/etc/skel目录中的文件复制到新用户的主目录中去
D. 建立新的用户并且登录
7. 新建用户时指定该账户在30天后过期,现在想改变这个过期时间,使用()命令。
A. usermod aB. usermod d
C. usermod xD. usermod e
8. Linux使用哪个文件存储用户账号、密码和组名称?
9. 如何为新增用户指定用户主目录?
10. 使用什么命令可以从普通用户变为超级用户?
11. 简述su和sudo命令的作用与区别。
12. 如何让一个用户具有sudu的权限?
13. 上机练习: 对Linux用户、组管理相关的命令进行练习,掌握Linux系统中用户的创建及管理。
实验51用户和组的管理
1. 实验目的
熟悉命令行中用户和组的管理方法。
2. 实验内容
(1) 新增一个名为erdi的用户,将这个用户分配到一个新组some中。
(2) 切换到root用户,修改erdi的密码。
(3) 添加一个用户名为student,组名为students,初始密码为123456。
(4) 给student用户修改密码为123123。
(5) 删除student用户。
(6) 从普通用户切换到su用户。
(7) 比较su用户与sudo用户的区别。