
引言
在Linux系统中,我们常常会看到目录或文件的所属关系:
其中
root root
就是文件拥有者和群组,root是超管账号,接下来我们来详细学习这些账号相关的概念以及相关命令使用。
归属
文件拥有者
User:Linux是一个多用户多任务的系统,一个物理机或者虚拟机往往会有很多人同时使用,每个用户在各自的家目录进行操作(如部署自己的应用、存储文件等),这个时候就需要将这些用户进行隔离,权限分开。用户A无权读写用户B的相关目录,用户B无权读写用户A的目录,保证每个人各自的隐私。
群组
Group:多个使用者需要共享相同的东西,归属于同一个群组,举例来说,一个开发团队,在代码仓库中会属于同一个仓库地址下,这样一个团队的成员可以共享这个仓库地址下的代码进行读写,而其他开发团队的成员无权读写这个团队的代码仓库。
其他人
Others:其他人这个概念比较好理解,相对于本群组而言,跟其无关的都是其他人。
关系
三种属性关系
- 管家相当于root用户,所有幢都可以访问;
- 1幢101、1幢201、1幢301都是User,是用户,都有各自单独的家(家目录);
- 1幢和2幢都是Group,里面的1幢101、1幢201、1幢301等相当于用户,在一幢可以共享电梯的使用;
- 对于1幢而言,2幢就是Others,用不了1幢的电梯;
账号管理
账号识别码
对于计算机而言,计算机不会认识账号昵称之类的别名,只会识别二进制(0和1),在Linux中也是同样的,主机对于账号只是识别ID。
登录账号一般有两个ID,一个是
使用者ID
(UDI, User ID),存放在
/etc/passwd
中;一个是
群组ID
(GID, Group ID) ,存放在
/etc/group
中。我们可以通过
id user_name
的方式来查看UID和GID。
文件或者目录查看属性时,首先会根据
/etc/passwd和/etc/group
的内容,利用UID和GID显示对应账号和群组名称,从而判断自己的拥有者和群组。
使用者账号
账号登录流程
- 在Linux系统中输入主机ip,账号和密码;
- 系统从
中寻找输入的账号,若没有找到,则退出;否则,从/etc/passwd
以及/etc/passwd
将该账号对应的UID与GID读取出来,同时也会读取用户家目录及shell设置;/etc/group
- 系统进入
中找到对应账号与UID,核对输入密码;/etc/shadow
- 若账号和密码都核对无误,则进入shell。
/etc/passwd详解
/etc/passwd是系统用户配置文件,这个文件中存储了系统中所有用户的基本信息。
该文件是对所有用户都可读的:
文件结构详解如下:
一共7个字段,每一行中的字段由
:
隔开。第一个一般都是
root
系统管理员账户信息。
- 账号名称:登录账号的名称,与UID对应。
- 密码:早期Unix系统密码放置在改字段中,后因安全问题,放置密码数据被窃取,改放到
中,所以这边显示为/etc/shadow
。x
- UID:账号的使用者识别码。
id范围 | id对应使用者的特性 |
---|---|
0 (系统管理员) | UID=0时,表示该账号为root权限(系统管理员),普通账户的UID改为0即拥有root权限,但不建议修改。 |
1~999(系统账号) | UID=1~999时,即为系统保留的系统账号,用于更小的权限去操作系统中的服务。 |
1000~60000(可登陆账号) | UID=1000~60000时,表示一般使用者的账号。 |
- GID:该信息与
相关联,下面会阐述该目录内容的结构。/etc/group
- 使用者信息说明栏:解释说明作用,一般配合
使用。finger
- 主文件夹:用户家目录,一般
后,会自动为useradd userA
用户创建userA
用户家目录,rott的用户家目录在/root下。/home/userA
- shell:用户登录系统后会取得一个shell与系统核心联系,从而在系统上进行操作。
/etc/shadow文件结构
/etc/shadow是用于存储 Linux 系统中所有用户对应的密码信息,我们也称为“影子文件”。
除了root用户,其他用户没有权限访问该文件。
文件结构详解如下:
- 账号名称:与
对应,账号名称。/etc/passwd
- 密码:存放加密的密码。
- 最近更改密码的累积天数:该字段记录的是变更密码的那天日期,从1970年1月1日作为1开始累积,这个累积的天数可以通过代码进行计算。
其中,
86400
是一天的秒数,
+1
是为了补齐1970年1月1日那天。
- 密码不可被更改的天数:该字段限制了密码从最后一次变更后,需要经过多少天才可以进行变更。若为 ,则表示无限制,可以随时更改密码。
- 密码需要重新更改的天数:该字段限制了密码从最后一次变更后,需要经过多少天就应该再次变更。若为
,表示273年,也就是无限制。99999
- 密码需要更改前警告提示的天数:账号密码有效期快到的时候,会提前进行提示警告。
- 密码失效时间:密码更新时间(第3字段)+重新变更时间(第5字段)为有效期,过期后,还没有更新密码,密码就会过期。
- 账号失效日期:类似于第三个字段进行累计失效日期计算,过期后,账号无法使用。
- 保留:保留字段。
群组
我们在上述的
/etc/passwd
账号配置文件中发现有GID字段, 而这个字段是在
/etc/group
相关联。
/etc/group文件结构
/etc/group文件存储群组相关配置信息。
- 群组名称:群组的名称,与GID对应。
- 群组密码:群组的密码,通常给群组管理员使用,一般不设置,密码不会在此显示,会在
中显示,在此只会显示/etc/gshadow
。x
- GID:群组的ID,也就是
第四个字段的GID。/etc/passwd
- 群组支持的其他账号名称:一个账号可以加入多个群组,当其他账户加入该群组后,会填入到该字段中,逗号隔开。
/etc/gshadow
/etc/gshadow是存放群组的密码等信息;
- 群组名称:对应账户的群组名称;
- 群组密码:群组的密码;若开头为
则表示无合法密码,无群组管理员;!
- 群组管理员账号:群组管理员的账号名称
- 有加入该群组支持的所属账号:群组下所支持的账号,与
中的保持一致。/etc/group
cat命令详解_Linux | 账号管理及命令使用详解引言归属账号管理账号命令
三文件的关系:/etc/passwd、/etc/shadow、/etc/group
群组分类
群组分为
初始群组
和
有效群组
,初始群组就是
/etc/passwd
中的第四个字段中GID对应的群组;有效群组就是某个用户userA可以加入到其他群组userB中,这个群组userB对于这个用户userA来说就是有效群组。
举例:假设通过
useadd
命令创建了t1和t2用户,然后通过
usermod
命令将t1用户加入到t2群组内。
其中
-G
是指定有效群组。
- 我们可以在
中看到t1用户已加入到t2群组的第四个字段中。/etc/group
- 我们也可以登录t1账号后,通过
命令查看所支持的群组groups
第一个t1是有效群组,查看到新建的文件的使用者是t1,所属群组也是t1。
- 我们可以通过
来切换有效群组newgrp
我们可以看到文件使用者是t1,所属群组是t2。
账号命令
useradd
概述
useradd
命令是新建账号命令。
语法格式
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 主目录的绝对路径] [-s shell] 使用者账号名
参数详解
默认配置
-
:新建账号的初始群组使用GID为100(群组为GROUP=100
);但是CentOS是users
,所以系统会创建一个与账号一样的群组给用户作为初始群组,该系统不会参考100数值。只有遵守私有群组机制
的系统才会参考该数值。公有群组机制
-
:用户主文件夹的基准目录(basedir,用户家目录),用户的主文件夹通常就是与账号同名的目录,目录将会拼接在该设置值的目录后,所以一般用户家目录为HOME=/home
格式。/home/user_name
-
:密码过期后是否会失效,INACTIVE=-1
代表密码永远不会失效,若为其他数值-1
,则表示过期n
天后失效。该值对应在n
中的第7个字段。/etc/shadow
-
:账号失效日期,对应EXPIRE=
中的第8个字段,可以设置账号在某个日期后是失效,而不管密码是否失效。默认不设置。/etc/shadow
-
:默认使用的SHELL=/bin/bash
。shell程序文件名
-
:用户主文件夹参考基准目录,一个新建的账号对应的用户家目录,如SKEL=/etc/skel
这个目录的各个数据都是从/home/userA
中复制过去,如果在该目录下创建了/etc/skel
,则后续新增用户时,主文件夹中会包含test文件。如下示例:/etc/skel/test
-
:创建使用者的mailbox,查看路径等信息,可以通过CREATE_MAIL_SPOOL=yes
查看路径。如下示例查看:cat /etc/login.defs
示例
示例1
无参创建:
说明:
- 在
中创建一行与账号相关的数据,包含了UID、GID、用户家目录等信息;/etc/passwd
- 在
中创建一行与账号密码相关的数据,如果没有指定密码,则无密码填入;若需要指定密码,则需要使用/etc/shadow
命令来指定密码;passwd user_name
- 在
中创建一行与账号群组相关的数据,加入一个与账号名称一样的群组名称;/etc/group
- 在
中创建一行与账号群组密码相关的数据,包含群组名称、群组管理密码等信息;/etc/gshadow
- 在
下创建一个与账号名称相同的用户家目录,用于使用者主文件夹,且权限为/home
,700(drwx------)
示例2
加参创建:
说明:
-
是指定了账号的UID,我们可以看到-u
中的第3栏的UID是我们指定的1009;/etc/passwd
-
是指定了初始群组,我们可以看到-g
中的第4栏的GID是群组/etc/passwd
对应的100;因为指定了初始群组,users
中就不会主动创建与账号同名的群组,所以在/etc/group
和/etc/group
中没有查看到u2相关的数据。/etc/gshadow
示例3
系统账号:
说明:
-
参数代表创建一个系统账号;-r
-
中的第3栏看到数字为996,符合规定,1000及以后的号为一般账号,1000之前的号为系统账号;/etc/passwd
- 由于系统账号主要用于进行运行系统所需服务的权限设置,所以系统账号默认没有创建用户家目录。
useradd命令总结
useradd命令执行后,会涉及到以下文件或目录的变动:
- 用户账号和密码相关文件:
。/etc/passwd,/etc/shadow
- 用户群组和密码相关文件:
。/etc/group,/etc/gshadow
- 用户的主文件夹(用户家目录):
。/home/账号名称
passwd命令
概述
passwd
命令是修改账号密码的命令。
语法格式
- root或者账号自己使用:
passwd [--stdin] [账号名称]
- root账号使用:
passwd [-l] [-u] [--stdin] [-S] [-n 天数] [-x 天数] [-w 天数] [-i 日期] 账号
参数详解
密码一般要求
- 密码不能和账号同名;
- 密码尽量不要选字典中的字符;
- 密码需要超过8个字符;
- 密码不要使用个人信息(身份证、手机号、生日等);
- 密码不要使用简单的关系式,如1+2=3;
- 密码计量使用
、大小写字符
、特殊字符(数字
,$
,_
等)组合。-
示例
示例1
无参更改
我们可以看到,不管是过短、还是过于简单都会有提示,一直更改到符合密码规范才会生效。在
/etc/login.defs
中我们可以看到对于密码的一些要求。
示例2
有参更改,通过
--stdin
参数,从标准输入读取令牌(只有根用户才能进行此操作)。
示例3
查询密码状态,通过
-S
参数,报告已命名帐号的密码状态(只有根用户才能进行此操作)
示例4
加解锁密码,通过
-l
锁定,加锁时,查看状态,会出现
LK
状态,查看
/etc/shadow
中的第2个密码栏会发现多了
!!
两个字符;
-u
解锁,解锁后恢复
PS
状态,且
/etc/shadow
中的第2个密码栏会去掉
!!
。
chage命令
概念
chage
命令用于展示更详细的密码参数信息。
语法格式
chage [-ldEImMW] 账号名称
参数详解
示例
说明:
-l
参数可以展示出账号密码相关的时间信息。
usermod命令
概念
usermod
命令用于修改账号相关配置。
语法格式
usermod [-cdegGlsuLU] 账号名称
参数详解
示例
说明:通过
-c
参数添加说明信息后,我们可以看到
/etc/passwd
中更新说明生效。
userdel命令
概念
userdel
命令用于删除用户账号相关数据。主要涉及如下方面:
- 使用者账号/密码相关数据:
,/etc/passwd
;/etc/shadow
- 使用者群组相关数据:
,/etc/group
;/etc/gshadow
- 使用者个人文件数据:
,/home/user_name
等。/var/spool/mail/user_name
该命令要慎用,真的确认要删除账号及所有数据的时候才使用该命令,否则可以去
/etc/shadow
账号中的
第8个字段
进行设置为
,就可以使账号失效,但数据还在。
语法格式
userdel [-r] 账号名称
参数详解
示例
示例1
不删除用户家目录
示例2
删除用户家目录,使用
-r
参数
groupadd命令
概念
groupadd
命令用于添加群组。
语法格式
groupadd [-g GID] [-r] 群组名称
参数详解
示例
说明:要注意的是,不带
-g
时,群组的GID会从1000以上
最大的GID+1
来创建。
groupmod命令
概念
groupmod
命令类似于
usermod
命令,用于修改群组group的相关配置参数。
语法格式
groupmod [-g 新GID] [-n 新群组名称] 旧群组名称
参数详解
示例
说明:我们可以看到
/etc/group
和
/etc/group
中已经不存在g1了。
groupdel命令
概念
groupdel
命令用于删除群组。需要注意的是,在
/etc/passwd
中被使用为
有效群组
的群组不能被删除。如:
语法格式
groupdel [groupname]
参数详解
示例
参考
《鸟哥的Linux私房菜》
[每篇微语]
有些人活了一天是一天,有些人活了一天是一瞬间。时间不在于你拥有多少,只在于你怎样使用。