用户和用户组管理
用户配置文件
用户信息文件/etc/passwd
在 Linux 中主要是通过用户配置文件来查看和修改用户信息
/etc/passwd : 用户基本信息文件
1 | vim /etc/passwd |
每一行代表一个用户,使用冒号分割成七个字段
- 第1字段:用户名称
- 第2字段:密码标志
- 第3字段:UID(用户ID)
- 0:超级用户
- 1-499:系统用户(伪用户)
- 500-65535:普通用户
- 第4字段:GID(用户初始组ID)
- 第5字段:用户说明
- 第6字段:家目录
- 普通用户:home/用户名/
- 超级用户:/root/
- 第7字段:登录之后的 Shell
密码标志
- 第2字段:密码标志 .
一开始设计的时候密码确实是放在/etc/passwd
的第2字段的
(否则这个文件也不会称为passwd
)
(当然,密码肯定是经过加密的,但是还是不安全)- 因为
/etc/passwd
每个用户都有r
权限,所以容易导致密码泄露- 所以后来把密码改放到
/etc/shadow
里了.
1
2
3
4
5
6
7
8
9
10
11 ll /etc/passwd
# -rw-r--r-- 1 root root 1051 Aug 24 08:41 /etc/passwd
ll /etc/shadow
# --w------- 1 root root 781 Aug 24 08:43 /etc/shadow
# 说明只有root才能操作这个文件
# /etc/shadow存放的密码是经过sha256加密的
more /etc/shadow
# root:$6$ku6PsrqS3DO06yf2$FBgBrTFv1oW11JGPZRpxMYPgnF6oaYKA1uZ7Vd7zFaPR8j67jGLNcs4W/Blzw/sB
# lDDnkpXIMMJVjC9sZA1Jb.:17226:0:99999:7:::第二字段的
x
:
1
2 vim /etc/passwd
# root:x:0:0:root:/root:/bin/bash
- 如果删除
x
, 那么这个账号就不会去检查密码,直接就能登录- 如果删除
x
, 这个账号就只能本机登录,不再允许远程登录.这样就保证了安全性- 也就是说,这个x就是一个
密码标识
, 说明这个账号是有密码的
UID
第三字段的
UID
:
- 超级用户是UID为0
- 所以,只要我们把某个用户A的UID改为0就可以让他变成超级用户了.
- 注意 : 此时linux就会用户A和原来的超级用户root视为同一个用户
伪用户
伪用户:
- 这个是系统为了调用服务而设置的用户
- 不能删除,否则系统容易崩溃
GID
用户的初始组ID
, 同类型用户的集合就可以是一个初始组ID
- 初始组:就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。
- 附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。
如果要根据初始组ID
找到对应的初始组,那么就需要用到/etc/group
文件
影子文件/etc/shadow
1 | more /etc/shadow |
第1字段:用户名
第2字段:加密密码
- 加密算法升级为SHA512散列加密算法(有加盐)
- 如果密码位是
!!
或*
代表没有密码,不能登录
第3字段:密码最后一次修改日期
- 使用1970年1月1日作为标准时间,每过一天时间戳加1
第4字段:两次密码的修改间隔时间(和第3字段相比)
(如果值为9,说明前一次修改密码9天后才能修改密码)第5字段:密码有效期(和第3字段相比)
第6字段:密码修改到期前的警告天数(和第5字段相比)
第7字段:密码过期后的宽限天数(和第5字段相比)
- 0:代表密码过期后立即失效(默认值为0)
- -1:则代表密码永远不会失效。
- n :n天后失效
第8字段:账号失效时间
- 要用时间戳表示
第9字段:保留
组信息文件/etc/group和组密码文件/etc/gshadow
存放用户组的信息
- windows默认所有用户都是属于users组(通过
C:\Users
可查) - linux是每增加一个用户A,就会新增一个组B,这个组的名字就和用户A的名字一样
1 | more /etc/group |
- 第一字段:组名
- 第二字段:组密码标志
- 第三字段:GID
- 第四字段:组中附加用户
组密码
这里的组密码标志
和密码标志
一样:
x
标志着这个组有密码- 真正的密码放在了
/etc/gshadow/
里面
附加用户
我们可以通过more /etc/group
来查看用户组的附加用户,但是如何知道初始用户?
- 打开
/etc/passwd
, 找到某个用户A的GID ,- 根据这个GID去
/etc/group
里找
1
2
3
4
5 vim /etc/passwd
# root:x:0:0:root:/root:/bin/bash
vim /etc/group
# root:x:0:
root:x:0:0:root:/root:/bin/bash
第四个字段为0,说明 root 用户的GID为4root:x:0:
第三个字段为0,所以 root 组对应的 GID 为4- 所以说,root用户对应的初始组为root组,GID为4
1 | more /etc/gshadow |
- 第一字段:组名
- 第二字段:组密码
- 第三字段:组管理员用户名
- 第四字段:组中附加用户
发现基本都没有组密码,说明组密码用的并不多,并且不推荐使用
用户管理相关文件
用户的家目录
- 普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700
- 超级用户:/root/,所有者和所属组都是root用户,权限是550
将普通用户改成超级用户
修改/etc/passwd/
, 将该用户的UID修改为0
- 在windows来说,将用户A变成超级用户是将A的所有组改为root组
- 在linux中,是将用户A直接变成root用户(也就是将UID改为0)
用户的邮箱
这里的邮件是linux用户和linux用户之间传递邮件,是不用联网的
位置 : /var/spool/mail/用户名/
用户的模板目录
- 位置 : /etc/skel/
- 用户家目录下面有一些隐藏文件 , 这些隐藏文件是自动生成的,既然是自动生成的,那就会要有模板文件,这些模板文件就在
/etc/skel/
目录下面 - 所以我们就可以在这个目录下创建一个文件 , 到时新创建的用户就会自动生成这个文件
1 | cd home/blog_user |
用户管理命令
用户添加命令 useradd
- ```bash
useradd [选项] 用户名1
2
3
4
5
6
7
8
9
10
11
12
13
14
- 选项 :
- `-u UID`:手工指定用户的UID号
- `-d 家目录`:手工指定用户的家目录的位置
- `-c 用户说明`:手工指定用户的说明
- `-g 组名`:手工指定用户的初始组
- `-G 组名`:指定用户的附加组
- `-s shell`:手工指定用户的登录 shell。默认是/bin/bash
- 示例:
```bash
useradd -u 550 -G root, bin -d /home/hyl -c "test user" -s /bin/bash hyl
执行完useradd之后,其实该用户是不完整的,必须再使用passwd命令设置密码
useradd在背后到底做了什么
我们在执行useradd hyl
,之后,实际上就是
- 修改了
passwd
,shadow
,group
,gshadow
四个文件 - 新增
/home/hyl
,/var/spool/mail/hyl
两个目录
1 | # 查看四个文件修改的内容 |
也就是说,原则上,我们可以不通过useradd命令,直接修改上面四个文件,新增两个目录来实现新用户
用户默认值配置文件(useradd命令的默认值配置文件)
/etc/default/useradd
1
2
3
4
5
6
7GROUP=100 # 用户默认组
HOME=/home # 用户家目录
INACTIVE= -1 # 密码过期宽限天数(shadow文件7字段)
EXPIRE= #密码失效时间(shadow文件8字段)
SHELL=/bin/bash # 默认 shell
SKEL=/etc/skel # 模板目录
CREATE_MAIL_SPOOL=yes # 是否建立邮箱/etc/login.defs
1
2
3
4
5
6
7
8
9PASS_MAX_DAYS 99999 # 密码有效朝(shadow文件5字段)
PASS_MIN_DAYS 0 # 密码修改问隔(shadow文件4字段)
PASS_MIN_LEN 5 # 密码最小5位(PAM)
PASS_WARN_AGE 7 # 密码到期警告(shadow文件6字段)
UID_MIN 500 # 最小和最大UID范围
UID_MAX 60000
GID_MIN 500 # 最小和最大GID范围
GID_MAX 60000
ENCRYPT_METHOD SHA512 #加密模式
修改用户密码 passwd
- ```bash
passwd [选项] 用户名1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 选项:
- `-S` 查询用户密码的密码状态。仅root用户可用。
- `-l` 暂时锁定用户。就是让这个用户不能登录。仅root用户可用
- `-u` 解锁用户。仅root用户可用
- `--stdin` 可以通过管道符输出的数据作为用户的密码
#### passwd -l 实际工作原理
```bash
cat /etc/shadow | grep blog_user
# blog_user:$6$Ikrgwvm6$lQhHUXFNQEWihyxSp5RUgKGOtgFeIDu7zZ9WKUMfPo6oXauG48W8jLf8VNy8rjhqMavvgRwaO9lh0dDvZa2/V1:18132:0:99999:7:::
# 锁定用户
passwd -l blog_user
# Locking password for user blog_user.
# passwd: Success
cat /etc/shadow | grep blog_user
# blog_user:!!$6$Ikrgwvm6$lQhHUXFNQEWihyxSp5RUgKGOtgFeIDu7zZ9WKUMfPo6oXauG48W8jLf8VNy8rjhqMavvgRwaO9lh0dDvZa2/V1:18132:0:99999:7:::
发现 , 两个cat /etc/shadow | grep blog_user
唯一的区别就是 : 给密码前面添加了!!
可以手工添加
!!
来锁定用户
使用字符串作为用户的密码
1 | echo"123" I passwd--stdin hyl |
修改用户信息 usermod
我们在创建新用户的时候有选项 :
-u UID
:手工指定用户的UID号-d 家目录
:手工指定用户的家目录的位置-c 用户说明
:手工指定用户的说明-g 组名
:手工指定用户的初始组-G 组名
:指定用户的附加组-s shell
:手工指定用户的登录 shell。默认是/bin/bash
usermod就是修改已有用户的选项
1 | usermod [选项] 用户名 |
-u UID
:修改指定用户的UID号-c 用户说明
:手工指定用户的说明-G 组名
:指定用户的附加组-L
: 锁定用户(Lock)-U
: 解锁用户(Unlock)
示例:
1 | usermod -c "test user" hyl |
修改用户密码状态 chage
1 | chage [选项] 用户名 |
选项 :
- -l : 列出用户的详细密码状态
- -d 日期:修改密码最后一次更改日期(shadow3字段)
- -m 天数:两次密码修改间隔(4字段)
- -M 天数:密码有效期(5字段)
- -W 天数:密码过期前警告天数(6字段)
- -I 天数:密码过后宽限天数(7字段)
- -E 日期:账号失效时间(8字段)
1 | chage -l blog_user |
删除用户 userdel
1 | userdel [-r] 用户名 |
-r : 删除用户的同时删除用户家目录,邮箱文件
同理 , 我们也可以通过
- 修改四个文件(只要删除用户所在行就行)
- 删除两个目录
就可以实现删除用户
1 | vi /etc/passwd |
查看用户id
1 | id hyl |
我们可以用此命令查询是否有该用户
用户切换命令su
1 | su [选项] 用户名 |
-
: 选项只使用-
代表连带用户的环境变量一起切换
(此选项坚决要加)-c
: 仅执行一次命令,而不切换用户身份
(就是暂时使用别人的身份来执行某个命令)
1 | whoami |
用户组管理命令
添加用户组 groupadd
1 | groupadd [选项] 组名 |
-g GID
: 指定组ID
示例 :
1 | groupadd new_group |
修改用户组 groupmod
1 | groupmod [选项] 组名 |
-g GID
: 修改组ID-n 新组名
: 修改组名
示例:
1 | # 把组名 group1 修改为 testgrp |
删除用户组 groupdel
1 | groupdel 组名 |
示例 :
1 | groupdel tg |
- 删除组A时, 如果组A下面有初始用户B , 那么组A不可删除,必须先删除用户B后,才能删除组A
- 删除组A时, 如果组A下面有附加用户C , 那么组A可以直接删除
把用户添加入组或从组中删除 gpasswd
1 | gpasswd 选项 组名 |
-a 用户名
: 把用户加入组-d 用户名
: 把用户从组中删除
示例 :
1 | # 将test_user用户加入到root组中 |
同理,我们也是可以手动修改
/etc/group
文件的第四个字段来给某个组添加或删除某个附加用户
1 vim /etc/group