一、用户与用户组
    1.1、什么是用户
    前面有提到,Linux具有很好的安全性,其安全性有一部分原因是有良好的用户和组管理方法。

    Linux是多用户多任务的操作系统,也就是说,多个用户可以同时登陆执行不同任务。用户需要使用系统资源则需向系统管理员申请账户进入系统。不同的用户则拥有不同的权限。

    用户又分超级用户和普通用户,超级用户即系统管理员root。

    1.2、什么是用户组
    Linux除了用户,还有一个用户组的概念。当我们需要让多个用户都拥有某一个权限,就可以把他们放进同一个用户组里,方便集中管理。(通俗点就是管理员组,相当于拉群)

    其中用户组也分两种,一种是主用户组(primary group),一种是次用户组(secondary group)

    主用户组的信息保存在/etc/passwd 文件中,次用户组的信息保存在/etc/group 中。

    当用户被创建之后默认属于同名用户组,即主用户组,后来再将该用户加入其他用户组的话,加入的用户组为该用户的次用户组。

    ~ ➤ grep datawhale /etc/group
    datawhale:x:1001:datawhale1
    # datawhale1即为次用户组

    1.3、用户与用户组的关系
    每个用户在创建时都会自动属于一个用户组,此外用户与用户组之间的关系又可以分为以下四种:

    一对一:一个用户可以存在一个组中,是组中的唯一成员;
    一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
    多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
    多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。
    二、用户ID与组ID
    在Linux系统中,并不是通过用户名来识别用户的,用户名只是方便用户记忆,在系统里,是通过用户ID来判断是哪个用户的。用户 datawhale 会被赋予一个名为Datawhale 的用户组,且成为该新建用户组的唯一成员,同时UID和GID会被分别写入/etc/passwd和/etc/group中。

    ~ ➤ sudo useradd datawhale
    ~ ➤ grep datawhale /etc/passwd
    datawhale:x:1001:1001::/home/datawhale:/bin/sh
    #用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell

    ~ ➤ grep datawhale /etc/group
    datawhale:x:1001:
    image.png
    image.png

    主目录:用户的起始工作目录,用户登录后有操作权限的访问目录

    注释性描述:这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

    登陆shell:用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

    通常情况下,UID是递增的,上一个是1000,下一个则是1001。

    ~ ➤ sudo useradd datawhale1
    ~ ➤ grep datawhale1 /etc/passwd
    datawhale1:x:1002:1002::/home/datawhale1:/bin/sh
    image.png
    系统管理员的UID为0

    ~ ➤ grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    image.png

    三、用户与用户组管理命令
    Linux用户和组管理命令主要有如下几类:

    3.1 用户的增删修改
    添加用户:

    useradd 选项 用户名

    选项 作用
    -u 手工指定用户的 UID,注意 UID 的范围(不要小于 500)。
    -d 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限;
    -c 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置;
    -g 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。
    -G 指定用户的附加组。我们把用户加入其他组,一般都使用附加组;
    -s 手工指定用户的登录 Shell,默认是 /bin/bash;
    -e 指定用户的失效日期
    -o 允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0;
    -m 创建用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;
    -r 创建系统用户
    删除用户

    userdel 选项 用户名
    -r 选项表示在删除用户的同时删除用户的家目录。

    修改用户
    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。

    修改用户密码

    passwd 选项 用户名

    选项 作用
    -l 暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 “!”,使密码失效。仅 root 用户可用;
    -u 解锁用户,和 -l 选项相对应,也是只能 root 用户使用;
    -d 使账号无口令,删除密码
    -f 强迫用户下次登录时修改口令
    -S 查询用户密码的状态,显示密码信息,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;
    -g 修改群组密码
    -n 天数 设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段;
    -x 天数 设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段;
    -w 天数 设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段;
    -i 日期 设置用户密码失效日期,口令过期后多少天停用账户,对应 /etc/shadow 文件中各行密码的第 7 个字段

    3.2 用户组管理

    添加用户组

    groupadd 选项 用户组
    选项 描述
    -g GID 指定组 ID;
    -r 创建系统群组。
    删除用户组

    groupdel 组名
    需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。

    注意,不能使用 groupdel 命令随意删除群组。此命令仅适用于删除那些 “不是任何用户初始组” 的群组,换句话说,如果有群组还是某用户的初始群组,则无法使用 groupdel 命令成功删除。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。

    修改用户组属性

    groupmod 选项 用户组
    选项 描述
    -g GID 修改组 ID
    -n 新组名 修改组名
    -o 重复使用群组识别码
    切换用户组

    newgrp 目标用户组
    newgrp 指令类似 login 指令,当它是以相同的帐号,另一个群组名称,再次登入系统。newgrp 命令可以从用户的附加组中选择一个群组,作为用户新的初始组。欲使用 newgrp 指令切换群组,您必须是该群组的用户,否则将无法登入指定的群组。单一用户要同时隶属多个群组,需利用交替用户的设置。若不指定群组名称,则 newgrp 指令会登入该用户名称的预设群组。