用户和用户组管理

用户配置文件

用户信息文件/etc/passwd

在 Linux 中主要是通过用户配置文件来查看和修改用户信息

/etc/passwd : 用户基本信息文件

1
2
3
4
vim /etc/passwd
# root:x:0:0:root:/root:/bin/bash
# bin:x:1:1:bin:/bin:/sbin/nologin
# daemon:x:2:2:daemon:/sbin:/sbin/nologin

每一行代表一个用户,使用冒号分割成七个字段

  • 第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
2
3
more /etc/shadow
#root:$6$ku6PsrqS3DO06yf2$FBgBrTFv1oW11JGPZRpxMYPgnF6oaYKA1uZ7Vd7zFaPR8j67jGLNcs4W/Blzw/sB
# lDDnkpXIMMJVjC9sZA1Jb.:17226:0:99999:7:::
  • 第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
2
3
4
5
6
7
8
9
10
11
12
more /etc/group
# root:x:0:
# bin:x:1:bin,daemon
# daemon:x:2:bin,daemon
# sys:x:3:bin,adm
# adm:x:4:adm,daemon
# tty:x:5:
# stapdev:x:158:
# screen:x:84:
# mysql:x:27:
# nginx:x:498:
# blog_user:x:500:
  • 第一字段:组名
  • 第二字段:组密码标志
  • 第三字段:GID
  • 第四字段:组中附加用户

组密码

这里的组密码标志密码标志一样:

  • x 标志着这个组有密码
  • 真正的密码放在了/etc/gshadow/里面

附加用户

我们可以通过more /etc/group来查看用户组的附加用户,但是如何知道初始用户?

  1. 打开 /etc/passwd , 找到某个用户A的GID ,
  2. 根据这个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为4
  • root:x:0:第三个字段为0,所以 root 组对应的 GID 为4
  • 所以说,root用户对应的初始组为root组,GID为4
1
2
3
4
5
6
7
more /etc/gshadow
# root:::
# bin:::bin,daemon
# daemon:::bin,daemon
# mysql:!::
# nginx:!::
# blog_user:!::
  • 第一字段:组名
  • 第二字段:组密码
  • 第三字段:组管理员用户名
  • 第四字段:组中附加用户

发现基本都没有组密码,说明组密码用的并不多,并且不推荐使用

用户管理相关文件

用户的家目录

  • 普通用户:/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
2
3
4
5
6
7
8
9
10
11
cd home/blog_user
ls -al
# total 32
#drwx------ 3 blog_user blog_user 4096 Aug 25 02:08 .
#drwxr-xr-x. 3 root root 4096 Aug 24 08:41 ..
#-rw------- 1 blog_user blog_user 184 Aug 25 05:47 .bash_history
#-rw-r--r-- 1 blog_user blog_user 18 Mar 23 2017 .bash_logout
#-rw-r--r-- 1 blog_user blog_user 176 Mar 23 2017 .bash_profile
#-rw-r--r-- 1 blog_user blog_user 124 Mar 23 2017 .bashrc
#drwxrw---- 3 blog_user blog_user 4096 Aug 25 01:54 .pki
#-rw------- 1 blog_user blog_user 865 Aug 25 02:08 .viminfo

用户管理命令

用户添加命令 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
2
3
4
5
6
7
8
9
10
# 查看四个文件修改的内容
grep hyl /etc/passwd
grep hyl /etc/shadow
grep hyl /etc/group
grep hyl /etc/gshadow

# 发现新增了家目录
ls -ld /home
# 发现新增了邮箱
ll /var/spool/mail

也就是说,原则上,我们可以不通过useradd命令,直接修改上面四个文件,新增两个目录来实现新用户

用户默认值配置文件(useradd命令的默认值配置文件)

  • /etc/default/useradd

    1
    2
    3
    4
    5
    6
    7
    GROUP=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
    9
    PASS_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
2
3
4
usermod -c "test user" hyl
usermod -G root hyl
usrmod -L hyl
usermod -U hyl

修改用户密码状态 chage

1
chage [选项] 用户名

选项 :

  • -l : 列出用户的详细密码状态
  • -d 日期:修改密码最后一次更改日期(shadow3字段)
  • -m 天数:两次密码修改间隔(4字段)
  • -M 天数:密码有效期(5字段)
  • -W 天数:密码过期前警告天数(6字段)
  • -I 天数:密码过后宽限天数(7字段)
  • -E 日期:账号失效时间(8字段)
1
2
3
4
5
6
7
8
9
10
11
12
13
chage -l blog_user
# Last password change : Aug 24, 2019
# 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


# 这个命令其实是把密码修改日期了归0了(shadow第3字段)
# 这样用户一登陆就要修改密码
chage -d 0 hyl

删除用户 userdel

1
userdel [-r] 用户名

-r : 删除用户的同时删除用户家目录,邮箱文件

同理 , 我们也可以通过

  • 修改四个文件(只要删除用户所在行就行)
  • 删除两个目录

就可以实现删除用户

1
2
3
4
5
6
7
vi /etc/passwd
vi /etc/shadow
vi /etc/group
vi /etc/gshadow

rm -rf /var/spool/mail/hyl
rm -rf /home/hyl/

查看用户id

1
2
id hyl
# uid=501(hyl) gid=501(hyl) groups=501(hyl)

我们可以用此命令查询是否有该用户

用户切换命令su

1
su [选项] 用户名
  • - : 选项只使用-代表连带用户的环境变量一起切换
    (此选项坚决要加)
  • -c : 仅执行一次命令,而不切换用户身份
    (就是暂时使用别人的身份来执行某个命令)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
whoami
# test_user

su - blog_user

whoami
# blog_user

env
# USER=blog_user
# HOME=/home/blog_user

# 使用test_user的身份执行useradd user3命令
su - test_user -c "useradd user3"

用户组管理命令

添加用户组 groupadd

1
groupadd [选项] 组名

-g GID : 指定组ID

示例 :

1
groupadd new_group

修改用户组 groupmod

1
groupmod [选项] 组名
  • -g GID : 修改组ID
  • -n 新组名 : 修改组名

示例:

1
2
# 把组名 group1 修改为 testgrp
groupmod -n testgrp group1

删除用户组 groupdel

1
groupdel 组名

示例 :

1
groupdel tg
  • 删除组A时, 如果组A下面有初始用户B , 那么组A不可删除,必须先删除用户B后,才能删除组A
  • 删除组A时, 如果组A下面有附加用户C , 那么组A可以直接删除

把用户添加入组或从组中删除 gpasswd

1
gpasswd 选项 组名
  • -a 用户名 : 把用户加入组
  • -d 用户名 : 把用户从组中删除

示例 :

1
2
# 将test_user用户加入到root组中
gpasswd -a test_user root

同理,我们也是可以手动修改/etc/group文件的第四个字段来给某个组添加或删除某个附加用户

1
vim /etc/group