前言
本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义和使用,对常见的用户相关命令如useradd,usermod,chage,userdel,id,su,whoami,who am i,groupadd,groupmod,groupdel,gpasswd,newgrp等命令的使用方法和实际演练。
用户和组概览
用户和组概念
Linux 是多用户多任务操作系统,支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。 不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,通过这种权限的划分与管理,实现了多用户多任务的运行机制。 每个用户都有用户名和密码。在登录系统时,需要输入用户名和密码进入系统和自己的主目录。
用户组是具有相同特征用户集合。例如当需要让多个用户具有相同的权限,建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。
用户和组的关系
用户和用户组的对应关系有以下 4 种: 一对一:一个用户可存在一个组,是组中的唯一成员; 一对多:一个用户可以存在多个组中,此用户具有这多个组的权限; 多对一:多个用户存在一个组,这些用户具有和组相同的权限; 多对多:多个用户存在多个组中。
UID和GID
登陆系统时,输入用户名和密码,对于系统只认识用户名对应的 ID 。系统将用户名称与 ID 的对应关系存储在 /etc/passwd 中。
用户ID为2种,分别是用户 ID(UID)和组 ID(GID),每个文件都有自己的UID和GID。
/etc/passwd 文件中,UID 找到对应的用户名; /etc/group 文件中,GID 找到对应的组名。
系统用户UID:1-999;普通用户UID:1000+。其中超级管理员的uid为0.
演示
- 查看用户uid,及文件所属用户
//可看到用户的uid是1005
[root@node1 ~]
35:hulk:x:1005:1005::/home/hulk:/bin/bash
//可看到文件的所属所属用户是hulk
[root@node1 ~]
drwx------ 2 hulk hulk 92 Jul 21 23:41 /home/hulk/
- 修改UID,再查看文件所属用户
将hulk的uid更改成为1006
[root@node1 ~]
35:hulk:x:1006:1005::/home/hulk:/bin/bash
之前的 hulk 因为修改了UID,导致 1005 找不到对应的账号,因此显示数字,不会显示用户名
[root@node1 ~]
-rw-rw-r-- 1 1005 hulk 0 Jul 21 23:40 /home/hulk/2
[root@prometheus ~]
uid=0(root) gid=0(root) groups=0(root)
初始组和附加组
一个用户可以属于多个群组,拥有这些群组的权限,这就引出了初始组(主组)和附加组。
初始组
初始组(主组):当用户登陆系统,立刻就会拥有这个群组的相关权限;在创建文件的时候,文件显示的是这个初始组。主组是添加 用户时默认创建的群组当创建,用户不指定主组的时候,会自动创建跟用户名称相同的主组。
新建用户 mysql,并将其加入 dba 群组中,执行命令如下:
root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@prometheus ~]
mysql:x:1000:
dba:x:1001:mysql
[root@prometheus ~]
dba:x:1001:mysql
[root@prometheus ~]
mysql:x:1000:1000::/home/mysql:/bin/bash
[mysql@prometheus ~]$ touch 1
//文件属性对应的是用户的主组
[mysql@prometheus ~]$ ls -l
total 0
-rw-rw-r-- 1 mysql mysql 0 Nov 21 15:07 1
附加组
上个例子中虽然mysql用户的主组不是dba,但它也是属于dba这个组。所以看组文件的时候,会有关于mysql的成员信息。
[root@prometheus ~]
dba:x:1001:mysql
对于 mysql 用户同时属于 mysql 和dba 两个群组,所在,在读取\写入\运行文件时,只要是 mysql和 dba群组拥有的功能,mysql用户都拥有。 到此,我们已经学习了/etc/passwd、/etc/shadow、/etc/group,它们之间的关系可以这样理解,即先在 /etc/group 文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到
groups
使用 groups 命令可以知道用户有多少个组。
[root@localhost ~]
[mysql@localhost ~]$ groups
mysql dba
通过输出信息可以得知,mysql用户同时属于 mysql群组和 dba 群组,而且,第一个出现的为用户的初始组,后面的都是附加组,所以 mysql用户的初始组为 mysql群组,附加组为 dba群组。
passwd文件详解
/etc/passwd 文件是用户配置文件,存储用户的基本信息,这个文件对所有用户提供只读权限
查看文件内容
[root@localhost ~]
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
...省略部分输出...
文件格式
每行信息以 :作为分隔符,划分成 7 个字段,每个字段所表示的含义如下:
root:x:0:0:root:/root:/bin/bash
用户名 密码 UID GID 描述性信息 主目录 默认Shell
用户名
Linux 系统通过 UID 来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系。
密码
“x” 表示此用户设有密码,密码保存在 /etc/shadow 文件。 “x” 表示是否设置了密码,如果删除了 “x”,系统会认为这个用户没有密码,则用户可以免密钥登录。
UID
UID,用户 ID。每个用户有唯一的一个 UID,系统通过 UID 来识别不同的用户。操作系统版本不同,UID的保留范围也不同 UID 是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份。
范围 | 身份 |
---|
0 | 超级用户,0 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,把普通用户升级成管理员,只需把其他用户的 UID 修改为 0 就可以了,不建议操作 | 1-999 | 系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~999 分配给有系统账号需求的用户。 | 1000~65535 | 普通用户 |
GID
组ID,表示用户初始组的组 ID 号,也就是主组ID。
主目录
用户切换或者登录后的目录。有操作权限的访问目录,也称为用户的主目录。 root主目录为 /root,普通用户的默认主目录为 /home/用户名,即在 /home/ 目录下建立和用户名相同的目录作为主目录,如 mysql用户的主目录就是 /home/mysql/ 目录。
默认的Shell
Shell 命令解释器,是用户和 Linux 内核之间沟通的桥梁。Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。 通常Linux 系统默认使用的命令解释器是 bash(/bin/bash),也有其他命令解释器,例如 sh、csh 等。如果是bash,表示这个用户可以执行命令
[root@prometheus ~]
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@prometheus ~]
Last login: Sun Nov 21 15:07:37 CST 2021 on pts/0
[mysql@prometheus ~]$ ls
1
如果把 mysql用户的 Shell 命令解释器修改为 /sbin/nologin,则这个用户就不能登录了,例如:
[root@prometheus ~]
mysql:x:1000:1000::/home/mysql:/sbin/nologin
[root@prometheus ~]
Last login: Sun Nov 21 21:51:58 CST 2021 on pts/0
This account is currently not available.
如果更改为指定命令,如 /usr/bin/passwd,例如:
[root@prometheus ~]
Last login: Sun Nov 21 21:55:20 CST 2021 on pts/0
/home/mysql
[root@prometheus ~]
可以看到当切换用户的时候,用户并没有登录,只是执行了这个用户passwd这个命令。
shadow文件详解
/etc/shadow 文件用于存储用户的密码信息,称为“影子文件”。 /etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
文件格式
介绍此文件之前,我们先打开看看,执行如下命令:
[root@prometheus ~]
root:$6$k85NeopLTiGz4bS/$V0wa/dmxQu5/aI52iCwqWyAu5NTJcyPs0WKREJSTOsvVVlCvPymExcOx5s.f/2MdPRmmn09g7djbZ0FyryGYy1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
....
文件中每行代表一个用户,使用 : 作为分隔符,这一行九个字段含义: 用户名 加密密码 最后一次修改时间 最小修改时间间隔 密码有效期 密码需要变更前的警告天数 密码过期后的宽限时间 账号失效时间 保留字段
用户名
同 /etc/passwd 文件中用户名。
加密密码
保存真正加密的密码。目前密码采用的是 SHA512 散列加密算法。
所有伪用户的密码都是 !! 或 *,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录(可以通过root切换)。
[root@prometheus ~]
[root@prometheus ~]
zhangsan:!!:18075:0:99999:7:::
最后一次修改时间
最后一次修改密码的时间,当前zhangsan用户显示的是 18075 ,因为时间是以 1970 年 1 月 1 日起始,不断累加+1得到的数值,18075 代表的是哪一天呢?可以使用如下命令进行换算:
[root@prometheus ~]
Fri Jun 28 00:00:00 CST 2019
最小修改时间间隔
最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
密码有效期
经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。 该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。通过这个字段强制用户定期修改密码。
密码需要变更前的警告天数
与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。 该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
密码过期后的宽限天数
也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆。 比如此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。
账号失效时间
同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用
group文件详解
/ect/group 文件是组配置文件,用户组的所有信息存放在此文件中。
文件格式
[root@prometheus ~]
dba:x:1001:mysql,oracle
[root@prometheus ~]
mysql:x:1000:
dba:x:1001:mysql,oracle
每一行代表一个用户组。创建 的mysql 用户,系统默认生成一个 mysql 用户组,在此可以看到,此用户组的 GID 为 1000,目前它仅作为 mysql 用户的初始组。 以 “:” 作为字段之间的分隔符,分为 4 个字段,每个字段对应的含义为: 组名 密码 GID 该用户组中的用户列表
组名
也就是是用户组的名称,有字母或数字构成。组名不能重复。
组密码
和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。 很少设置组密码。
组ID (GID)
系统就是通过 GID 来区分用户组的。这里的 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。
组中的附加用户
此字段列出每个群组包含的所有用户。如果该用户组是这个用户的初始组,则该用户不会写入这个字段,该字段显示的用户都是这个用户组的附加用户。
[root@prometheus ~]
mysql:x:1000:
dba:x:1001:mysql,oracle
第四个字段没有写入 mysql 用户,因为 mysql 组是 mysql 用户的初始组。 每个用户都可以加入多个附加组,但是只能属于一个初始组。一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。
gshadow文件(了解)
组信息存储在 /etc/group 文件中,而将组的密码信息存储在/etc/gshadow 文件中。
文件格式
[root@localhost ~]
root:::
bin:::bin, daemon
daemon:::bin, daemon
...省略部分输出...
mysql:!::
每行代表一个组的密码信息,各行信息用 “:” 作为分隔符分为 4 个字段,每个字段的含义如下: 组名:加密密码:组管理员:组附加用户列表
组名
同 /etc/group 文件中的组名相对应。
组密码
对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员。
组管理员
从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢? 考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root 了。这个功能很少使用,因为可以使用sudo来操作。
组中的附加用户
该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。
login.defs文件(了解 )
login.defs文件用途
/etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。 该文件的用户默认配置对 root 用户无效。另外当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。
设置项
设置项 | 含义 |
---|
MAIL_DIR /var/spool/mail | 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 mysql 用户的邮箱是 /var/spool/mail/mysql。 | PASS_MAX_DAYS 99999 | 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。 | PASS_MIN_DAYS 0 | 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。 | PASS_MIN_LEN 5 | 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。 | PASS_WARN_AGE 7 | 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。 | UID_MIN 500 | 指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。 | UID_MAX 60000 | 指定用户最大的 UID 为 60000。 | GID_MIN 500 | 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。 | GID_MAX 60000 | 用户 GID 最大为 60000。 | CREATE_HOME yes | 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。 | UMASK 077 | 用户主目录的权限默认设置为 077。 | USERGROUPS_ENAB yes | 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。 | ENCRYPT_METHOD SHA512 | 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。 |
useradd命令
useradd: 用于创建新的用户 [root@localhost ~]#useradd [选项] 用户名
常用选项
选项 | 含义 |
---|
-u UID | 手工指定用户的 UID,注意 UID 的范围(不要小于 1000)。 | -d 主目录 | 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限; | -c 用户说明 | 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置; | -g 组名 | 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。 | -G 组名 | 指定用户的附加组。把用户加入其他组,使用附加组; | -s shell | 手工指定用户的登录 Shell,默认是 /bin/bash; | -e 曰期 | 指定用户的失效曰期,格式为 “YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段; | -o | 允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0; | -m | 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的; | -r | 创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。 |
useradd mysql
系统已经设置了很多默认值,无需使用任何选项也可成功创建用户。
[root@zaishu ~]
创建 mysql 用户。
这条会完成以下几项操作:
- 在 /etc/passwd 文件中创建一行与 mysql 用户相关的数据:
[root@zaishu ~]
mysql:x:1003:1003::/home/mysql:/bin/bash
可以看到,用户的 UID 是从 1000 开始计算的。同时默认指定了用户的家目录为 /home/mysql/,用户的登录 Shell 为 /bin/bash。
- 在 /etc/shadow 文件中新增了一行与 mysql 用户密码相关的数据:
[root@zaishu ~]
mysql:!!:18953:0:99999:7:::
用户还没有设置密码,所以密码字段是 “!!”,代表用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段,例如密码有效期有 99999 天,距离密码过期 7 天系统会提示用户“密码即将过期”等。
- 在 /etc/group 文件中创建一行与用户名一样的组:
[root@zaishu ~]
mysql:x:1003:
该群组会作为新建用户的初始组。
- 在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息:
[root@zaishu ~]
mysql:!::
没有设定组密码,也没有组管理员。
- 默认创建用户的主目录和邮箱:
[root@zaishu ~]
drwx------ 3 mysql mysql 4096 1月6 00:19 /home/mysql/
[root@zaishu ~]
-rw-rw---- 1 mysql mail 0 1月6 00:19 /var/spool/mail/mysql
useradd 命令创建用户的过程,是修改与用户相关的几个文件或目录.
useradd 执行选项
除了默认创建用户,在创建用户的时候,指定选项。
[root@zaishu ~]
[root@zaishu ~]
#建立mysql1用户,指定UID(1100 )、初始组(mysql1)、附加组(root)、家目录(/home/mysql1/)、用户说明(test user)和用户登录Shell(/bin/bash)
[root@zaishu ~]
mysql1:x:1100:1004:test user:/home/mysql1:/bin/bash
[root@zaishu ~]
mysql1:!!:18953:0:99999:7:::
[root@zaishu ~]
root:x:0:mysql1
mysql1:x:1004:
[root@zaishu ~]
drwx------ 2 mysql1 mysql1 62 Nov 22 17:22 /home/mysql1
手工创建用户
useradd 命令创建用户的过程,系统首先读取 /etc/login.defs 和 /etc/default/useradd,根据这两个配置文件中定义的规则添加用户,向 /etc/passwd、/etc/group、/etc/shadow、/etc/gshadow 文件中添加用户数据,接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录,最后复制 /etc/skel 目录中的所有文件到此主目录中,由此,一个新的用户就创建完成了。明白原理完全可以手动创建用户。
/etc/default/useradd 文件
创建用户的时候可以指定任何参数,通过默认值得到相关配置。默认值文件有两个,分别是 /etc/default/useradd 和 /etc/login.defs。上一段落讲过 /etc/login.defs,在这一段详细讲解 /etc/default/useradd 文件。
文件格式
首先,使用 Vim 命令查看 /etc/default/useradd 文件中包含哪些内容:
[root@zaishu ~]
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
或者通过命令行查看 useradd -D -D 选项指的就是查看新建用户的默认值。
[root@zaishu ~]
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
设置项
参数 | 含义 |
---|
GR0UP=100 | 这个选项用于建立用户的默认组,在添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。但 CentOS 是在添加用户时会自动建立和用户名相同的组作为此用户的初始组。也就是说这个选项并不会生效。 | Linux | 中默认用户组有两种机制:一种是私有用户组机制,会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是 100 的用户组作为所有新建用户的初始组。默认采用的是私有用户组机制。 | HOME=/home | 指的是用户主目录的默认位置,所有新建用户的主目录默认都在 /home/下,刚刚新建的 mysql1 用户的主目录就为 /home/mysql1/。 | 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/ 目录下,和用户名相同。例如,mysql1 的邮箱位于 /var/spool/mail/mysql1。 |
修改默认设置
修改方式有 2 种,一种Vim 文本编辑器修改,另一种使用useradd 命令修改
useradd -D [选项] 参数 用此命令修改 /etc/default/useradd 文件
选项 | 含义 |
---|
-b HOME | 设置所创建的主目录所在的默认目录,只需用目录名替换 HOME 即可,例如 useradd -D -b /gargae。 | -e EXPIRE | 设置密码失效时间,EXPIRE 参数应使用 YYYY-MM-DD 格式,例如 useradd -D -e 2019-10-17。 | -f INACTIVE | 设置密码过期的宽限天数,例如 useradd -D -f 7。 | -g GROUP | 设置新用户所在的初始组,例如 useradd -D -g bear。 | -s SHELL | 设置新用户的默认 shell,SHELL 必须是完整路径,例如 useradd -D -s /usr/bin/csh。 |
修改新用户默认 Shell 为 /bin/csh:
[root@zaishu ~]
[root@zaishu ~]
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
其他一些默认值,例如修改用户默认的 UID、GID,以及密码的设置,对这些默认值需要在 /etc/login.defs 文件中修改
passwd命令
passwd 用于设置密码的命令 。
常用选项
[root@localhost ~]#passwd [选项] 用户名 选项|含义 |-S:|查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用; |-l:|暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 “!”,使密码失效。 |-u:|解锁用户,和 -l 选项相对应,也是只能 root 用户使用; |–stdin:|可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用; |-n 天数:|设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段; |-x 天数:|设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段; |-w 天数:|设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段; |-i 日期:|设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。
修改密码
[root@zaishu~]
Changing password for user mysql.
New password: // 直接输入新的口令
BAD PASSWORD: it is WAY too short // 口令太简单或过短的警告信息
Retype new password: // 再次验证输入的密码,再输入一次即可
passwd: all authentication tokens updated successfully. // 修改成功
[root@zaishu~]
注意,普通用户只能使用 passwd 命令修改自己的密码,而不能修改其他用户的密码。
查看密码属性
[root@zaishu~]
mysql PS 2021-01-06 0 99999 7 -1 (Password set, SHA512 crypt.)
用户名 密码 设定时间(2021 01 06) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1),密码已使用
修改密码属性
通过命令选项修改密码属性,例如#修改 mysql的密码,使其具有 60 天变更、10 天密码失效
[root@zaishu~]
[root@zaishu~]
mysql PS 2021-01-06 0 60 7 10 (Password set, SHA512 crypt.)
锁定 mysql 用户
[root@zaishu ~]# passwd -l mysql Locking password for user mysql. passwd: Success
#用"-S"选项査看状态,很清楚地提示密码已被锁定 [root@zaishu ~]# passwd -S mysql mysql LK 2021-11-22 0 99999 7 -1 (Password locked.)
解锁mysql
锁定 用户后,用户就不能登录系统。需要解锁使用如下命令即可: #解锁 mysql 用户
[root@zaishu ~]
Unlocking password for user mysql.
passwd:Success
[root@localhost ~]
mysql PS2021-11-22 0 99999 7 -1(Password set, SHA512 crypt.)
管道符修改密码
passwd 命令提供了 --stdin 选项,用于批量给用户设置初始密码。
[root@在数~]
Changing password for user mysql.
passwd: all authentication tokens updated successfully.
usermod
Linux usermod命令:修改用户信息
常用选项
[root@zaishu ~]#usermod [选项] 用户名
选项 | 含义 |
---|
-c 用户说明 | 修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段; | -d 主目录 | 修改用户的主目录,即修改 /etc/passwd 文件中目标用户信息的第 6 个字段,需要注意的是,主目录必须写绝对路径; | -e 日期 | 修改用户的失效曰期,格式为 “YYYY-MM-DD”,即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段; | -g 组名 | 修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段(GID); | -u UID | 修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID); | -G 组名 | 修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件; | -l 用户名 | 修改用户名称; | -L | 临时锁定用户(Lock); | -U | 解锁用户(Unlock),和 -L 对应; | -s shell: | 修改用户的登录 Shell,默认是 /bin/bash。 |
接下来,给大家分别讲解 usermod 命令几个选项的具体用法。
锁定用户
对用户的临时锁定,同 passwd 命令一样,在 /etc/passwd 文件目标用户的加密密码字段前添加 “!”,使密码失效
[root@zaishu ~]
[root@zaishu ~]
mysql1:!$6$w4ctx1dF$ArGbKhuQ/.V9mZdzk.oT3smRYDWbrvWQ2DChGbRFa5RaqpW5ti399p/SQqXqInKvOk6r5bJ8/ApC.oSn1ZRyT1:18954:0:99999:7:::
解锁用户
取消了密码字段前的 “!” [root@zaishu ~]# usermod -U mysql1 [root@zaishu ~]# grep ‘mysql1’ /etc/shadow mysql1:
6
6
6w4ctx1dF$ArGbKhuQ/.V9mZdzk.oT3smRYDWbrvWQ2DChGbRFa5RaqpW5ti399p/SQqXqInKvOk6r5bJ8/ApC.oSn1ZRyT1:18954:0:99999:7:::
添加附加组
mysql1用户加入root组
[root@zaishu ~]
[root@zaishu ~]
root:x:0:mysql1 //mysql用户已经加入了root组
修改用户说明
[root@zaishu ~]
[root@zaishu ~]
mysql1:x:1100:1004:test test:/home/mysql1:/bin/bash //说明已经被修改
Linux chage
修改用户密码状态 chage 命令 显示更加详细的用户密码信息,并且和 passwd 命令一样,可以修改用户密码。chage 常和 passwd 批量初始化用户密码功能结合使用。
常用选项
[root@zaishu ~]#chage [选项] 用户名
选项 | 含义 |
---|
-l | 列出用户的详细密码状态; | -d 日期 | 修改 /etc/shadow 文件中指定用户密码信息的第 3 个字段,也就是最后一次修改密码的日期,格式为 YYYY-MM-DD; | -m 天数 | 修改密码最短保留的天数,也就是 /etc/shadow 文件中的第 4 个字段; | -M 天数 | 修改密码的有效期,也就是 /etc/shadow 文件中的第 5 个字段; | -W 天数 | 修改密码到期前的警告天数,也就是 /etc/shadow 文件中的第 6 个字段; | -i 天数 | 修改密码过期后的宽限天数,也就是 /etc/shadow 文件中的第 7 个字段; | -E 日期 | 修改账号失效日期,格式为 YYYY-MM-DD,也就是 /etc/shadow 文件中的第 8 个字段。 |
查看用户密码状态
[root@zaishu ~]
Last password change : Nov 23, 2021
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
配置初始密码强制修改
chage 更大的用途是强制用户在第一次登录后,必须先修改密码,用新密码重新登陆系统
- 添加用户,配置初始密码
[root@zaishu ~]
[root@zaishu ~]
Changing password for user oracle.
passwd: all authentication tokens updated successfully.
- 设置初始密码强制修改
chage命令设置账号密码创建日期为 1970 年 1 月 1 日(0 表示这一天),这样用户登陆后就必须修改密码。
[root@zaishu ~]
- 验证
[mysql@zaishu ~]$ su - oracle
Password: //输入初始密码
You are required to change your password immediately (root enforced)
Changing password for oracle.
(current) UNIX password: //输入初始密码
New password: //设置新密码
Retype new password:
Last failed login: Tue Nov 23 09:59:10 CST 2021 on pts/2
userdel
用于删除用户,只有 root 用户可以使用。
常用选项
[root@zaishu ~]
-f:强制删除用户,即使用户当前已登录;
-r:删除用户,并且删除家目录和其它用户相关目录。
手工删除用户
用户基本信息:存储在 /etc/passwd 文件中; 用户密码信息:存储在 /etc/shadow 文件中; 用户群组基本信息:存储在 /etc/group 文件中; 用户群组信息:存储在 /etc/gshadow 文件中; 用户个人文件:主目录默认位于 /home/用户名,邮箱位于 /var/spool/mail/用户名。 userdel 命令的作用就是从以上文件中,删除与指定用户有关的数据信息。除了使用 userdel 命令删除用户,还可以手动方式删除。
手动删除指定用户的具体操作如下: 删除oracle用户
[mysql@zaishu ~]$ id oracle
uid=1101(oracle) gid=1101(oracle) groups=1101(oracle)
1. /etc/passwd
[root@zaishu ~]
2. /etc/shadow
[root@zaishu ~]
3. /etc/group
[root@zaishu ~]
4. /etc/gshadow
[root@zaishu ~]
5. 删除目录
[root@zaishu ~]
[root@zaishu ~]
用户彻底删除,可再重新新建用户mysql。
id命令
查看用户的UID和GID。id 命令可以查询用户UID、GID 和附加组的信息。 [root@localhost ~]# id 用户名
[root@localhost ~]
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql)
[root@localhost ~]
[root@localhost ~]
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql),0(root)
su
su 是用户切换命令,注意从 root 用户切换至其他用户,不需要输入密码切换。
选项
[root@localhost ~]# su [选项] 用户名
选项 | 含义 |
---|
- | 当前用户切换为指定用户身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),su - 不加用户名,会切换为 root 用户。 | -l | 同 - 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。 | -p / -m | 表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。 | -c 命令 | 仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。 |
最常见切换形式
[mysql@localhost ~]$ su -root //代表连带环境变量一起切换,不能省略
密码:
仅执行命令
[mysql@localhost ~]$ whoami
mysql
[mysql@localhost ~]$ su - -c "useradd user1" root
密码:
[mysql@localhost ~]$ whoami
mysql
su 和 su - 的区别
使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。
- 切换到root用户
[mysql@zaishu ~]$ su root
密码:
<-输入root密码
- 查看环境变量,还是mysql用户的环境变量
[root@zaishu ~]
USER=mysql
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/mysql/bin
MAIL=/var/spool/mail/mysql
PWD=/home/mysql
LOGNAME=mysql
可以看到,在不使用 su - 的情况下,虽然用户身份成功切换,但环境变量依旧用的是原用户的,切换并不完整。
whoami和who am i
whoami 命令和 who am i 命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名。 为地区分这 2 个命令的功能,举例如下:
举例示范
- 切换之前查看
[Zhang@localhost ~]$ whoami
Zhang
[Zhang@localhost ~]$ who am i
Zhang pts/0 2017-10-09 15:30 (:0.0)
- 切换用户
在此基础上,使用 su 命令切换到 root 用户下,再执行一遍上面的命令:
[Zhang@localhost ~] su - root
[root@localhost ~]$ whoami
root
[root@localhost ~]$ who am i
Zhang pts/0 2017-10-09 15:30 (:0.0)
在未切换用户身份之前,whoami 和 who am i 命令的输出是一样的,但使用 su 命令切换用户身份后,使用 whoami 命令打印的是切换后的用户名,而 who am i 命令打印的仍旧是登陆系统时所用的用户名。
实际用户和有效用户
使用 su 或者 sudo 命令切换用户身份,骗得过 whoami,但骗不过 who am i。要解释这背后的运行机制,需要搞清楚什么是实际用户(UID)和有效用户(EUID,即 Effective UID)。
所谓实际用户,指的是登陆 Linux 系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的;而有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su 或者 sudo 命令进行任意切换的。
一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,它们会出现差异。
应用场景
那么,whoami 和 who am i通常应用在哪些场景中呢?通常,对那些经常需要切换用户的系统管理员来说,经常需要明确当前使用的是什么身份;另外,对于某些 shell 脚本,或者需要特别的用户才能执行,这时就需要利用 whoami 命令来搞清楚执行它的用户是谁;甚至还有一些 shell 脚本,一定要某个特别用户才能执行,即便使用 su 或者 sudo 命令切换到此身份都不行,此时就需要利用 who am i 来确认。
groupadd
添加用户组
选项
[root@zaishu ~]# groupadd [选项] 组名 选项: -g GID:指定组 ID; -r:创建系统群组。
[root@zaishu ~]
[root@zaishu ~]
/etc/group:group1:x:1005:
/etc/gshadow:group1:!::
groupmod
修改用户组
选项
[root@localhost ~]# groupmod [选项] 组名 选项: -g GID:修改组 ID; -n 新组名:修改组名;
例子:
[root@localhost ~]
[root@localhost ~]
testgrp:x:1005:
groupdel
刪除用户组 [root@localhost ~]#groupdel 组名 使用 groupdel 命令删除群组,其实就是删除 /etc/group 文件和 /etc/gshadow 文件中有关目标群组的数据信息。
[root@localhost ~]
/etc/group:group1:x:505:
/etc/gshadow:group1:!::
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
如果有群组还是某用户的初始群组,无法使用 groupdel 命令删除。
[root@localhost ~]
[root@localhost ~]
/etc/passwd:temp:x:505:505::/home/temp:/bin/bash
/etc/group:temp:x:505:
/etc/gshadow:temp:!::
[root@localhost ~]
groupdel:cannot remove the primary group of user 'temp'
如果要删除初始组,要么修改 用户的 GID,将其初始组改为其他群组,要么先删除 用户。
gpasswd
可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。
选项
[root@zaishu ~]# gpasswd 选项 组名
设置项 | 含义 |
---|
选项为空时 | 表示给群组设置密码。 | -A u1,… | 将群组的控制权交给 u1,… 等用户管理,设置 u1,… 等用户为群组的管理员 | -M u1,… | 将 u1,… 加入到此群组中,仅 root 用户可用。 | -r | 移除群组的密码 | -R | 让群组的密码失效 | -a user | 将 user 用户加入到群组中。 | -d user | 将 user 用户从群组中移除。 |
示范
1. 设置组的管理员
[root@prometheus ~]
[root@prometheus ~]
Changing the password for group grp1
New Password:
Re-enter new password:
[root@prometheus ~]
// 添加组grp1的管理员
[root@prometheus ~]
//查看组密码文件,可看到mysql 用户即为 grp1组的管理员。
grp1:$6$cfXLu/RIT3ZzR1l$em3s7eJiTlI9rhr8CL.7LInPaD0C/oQY2895eSrvjLNEfgnAnijb3/zSvHnsydGLjNq0x7o2XbJSmnABp4Kn/.:mysql:
2. 添加组成员(用添加的组管理员) 使用mysql将 oracle加入grp1组。
[root@prometheus ~]
[mysql@prometheus ~]
Adding user oracle to group grp1
[mysql@prometheus ~]
grp1:x:1004:oracle
使用root用户的usermod -G 命令也可以将用户加入群组。
newgrp
含义和用途
每个用户可以属于一个初始组,和多个附加组。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是初始组(主组),用户属于多个用户组,可以使用命令 newgrp 切换初始组。
newgrp的用途是切换用户的有效组,可以从用户的附加组中选择一个组,作为用户的初始组。此命令的基本格式如下: [root@localhost ~]# newgrp 组名
示例
- 创建组
[root@zaishu ~]
[root@zaishu ~]
[root@zaishu ~]
- 创建用户
创建用户 user1,初始组为 group1,附加组为 group2 和 group3
[root@localhost ~]
[root@localhost ~]
group2:x:501:user1
group3:x:1005:user1
- newgrp
使用 newgrp 命令切换 user1 的初始组
[user1@localhost ~]
[user1@localhost ~]
[user1@localhost ~]
[user1@localhost ~]
[user1@localhost ~]
- 查看文件信息
通过使用 newgrp 命令切换用户的初始组,所创建的文件各自属于不同的群组。
[user1@localhost ~]
total 12
drwxr-xr-x 2 user1 group1 4096 Oct 24 01:18 user1_doc
drwxr-xr-x 2 user1 group2 4096 Oct 24 01:18 user2_doc
drwxr-xr-x 2 user1 group3 4096 Oct 24 01:19 user3_doc
newgrp底层实现原理
newgrp 命令每一次切换用户的初始组,该用户都会以另外一个 shell登陆,在新 shell 上登陆的该用户,其初始组改变了而已。 每次使用 newgrp 命令,都会切换到一个新的进程。
[user1@localhost ~]$
[user1@localhost ~]$ echo $$
1181
[user1@localhost ~]$ newgrp group2
[user1@localhost~]$ echo $$
1200
使用 newgrp 命令切换用户初始组的整个过程,如图 所示: 每一次使用 newgrp 切换用户的初始组,用户都会切换到一个新的子 shell 中,user1 用户的初始组从最初的 group1,切换成了 group2,再切换成 group3。 回到原本的环境,需要通过 exit 命令回退到当前进程的父进程。
总结
本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义和使用,对常见的用户相关命令如useradd,usermod,chage,userdel,id,su,whoami,who am i,groupadd,groupmod,groupdel,gpasswd,newgrp等命令的使用方法和实际演练
|