从零掌握 Linux 用户组管理:创建、修改、删除、密码策略、登录限制合集

一、用户和组介绍

1. 用户介绍

用户帐户是系统安全的基础。系统上的每个进程(运行程序)都以特定用户身份运行。每个文件都有一个特定用户作为其所有者。文件所有权有助于系统对文件用户实施访问控制。正在运行的进程关联的用户确定该进程可访问的文件和目录。

用户使用 username(用户名)标识并使其更易于使用。在内部,系统通过分配给它们的唯一标识号——用户ID(UID) 来区分用户帐户。如果用户使用用户帐户,则通常会为其分配一个密码,用户在登录时将使用该密码来证明他们是实际的授权用户。

用户帐户主要有三种类型:

类型说明用户名UID
superuser(超级用户)用于管理系统,对系统具有完全访问权限root0
system users(系统用户)由提供支持服务的进程(守护进程)使用,是非特权帐户,不用于交互式登录bin、daemon、postfix 等1-999
regular users(普通用户)大多数用户拥有常规用户帐户,用于日常工作自定义1000+

2.passwd 文件

/etc/passwd 文件保存操作系统登录用户信息。每行包含一个登录用户信息,以冒号分隔七个域。

格式:

name:password:UID:GID:GECOS:directory:shell

示例:

xuhaoyu:x:1000:1000:software admin:/home/xuhaoyu:/bin/bash

字段解释:

字段名称说明
name用户登录名用户用于登录系统的名称
password用户密码以 x 表示,实际密码存储在 /etc/shadow 中
UID用户ID系统唯一标识用户的数字
GID用户主组ID用户主要所属组的 ID
GECOS用户描述信息通常为用户的真实姓名或其他备注信息
directory用户主目录启动 shell 时的工作目录,默认位于 /home/username
shell登录 Shell用户打开终端时运行的程序,默认为 /bin/bash

系统用户示例:

[xuhaoyu@centos7 ~ 09:00:00]$ grep postfix /etc/passwd
# 说明:在 /etc/passwd 中过滤 postfix 用户的条目。
# 输出:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
# 解析:postfix 用户的 Shell 为 /sbin/nologin,表示该用户不能交互式登录。

3. group 文件

组是用户的集合,组中用户继承组权限。 与用户一样,组具有组名称以使其更易于使用。系统通过分配给它们的唯一标识号——组ID(GID) 来区分组。

/etc/group 文件保存操作系统组信息。每行包含一个组信息,以冒号分隔 4 个域。

格式:

group_name:password:GID:user_list

示例:

[xuhaoyu@centos7 ~ 09:00:05]$ grep wheel /etc/group
# 说明:在 /etc/group 中过滤 wheel 组的信息。
# 输出:wheel:x:10:xuhaoyu

字段解释:

字段名称说明
group_name组名称组的名称
password组密码用 x 表示,实际密码存储在 /etc/gshadow 中
GID组ID唯一标识组的数字
user_list组成员列表作为补充组成员的用户列表(逗号分隔)

4. 组的类型

类型说明
主要组(Primary Group)每个用户只有一个主要组,由 /etc/passwd 文件中的 GID 编号定义。默认情况下,用户创建的新文件组所有者为用户的主要组。创建新用户时,通常会创建一个与该用户同名的新组作为其主组。
补充组(Supplementary Group)用户还可以拥有补充组。补充组的成员资格由 /etc/group 文件确定。用户访问文件时,如果其任何所属组(主组或补充组)具有访问权限,则用户获得相应权限。
[xuhaoyu@centos7 ~ 09:00:10]$ id
# 说明:查看当前用户的 UID、GID 和所有所属组。
# 输出:uid=1000(xuhaoyu) gid=1000(xuhaoyu) groups=1000(xuhaoyu),10(wheel)
# 解析:xuhaoyu 的主组是 xuhaoyu(GID=1000),补充组是 wheel(GID=10)

[xuhaoyu@centos7 ~ 09:00:15]$ id -u xuhaoyu
# 说明:只查看用户 xuhaoyu 的 UID。
# 输出:1000

练习

题目答案
哪一项表示在最基本的层面上标识用户的编号?b. UID
哪一项表示提供用户命令行提示符的程序?c. 登录 shell
哪一项目或文件表示本地组信息的位置?d. /etc/group
哪一项目或文件表示用户个人文件的位置?a. 主目录
哪一项表示在最基本的层面上标识组的编号?c. GID
哪一项目或文件表示本地用户帐户信息的位置?b. /etc/passwd
/etc/passwd 文件的第四个字段是什么?d. 主要组(GID)

二、本地用户管理

1. whoami — 查看当前登录用户

[root@centos7 ~ 09:01:00]$ whoami
# 说明:查看当前终端中登录的用户名。
# 输出:root

2. who 和 w — 查看系统登录用户

[xuhaoyu@centos7 ~ 09:01:05]$ who
# 说明:查看当前系统中所有终端上登录的用户,以及用户登录的终端和来源 IP。
# 输出:
# root     pts/0        Dec 22 08:43 (10.1.8.1)
# xuhaoyu  pts/1        Dec 22 09:23 (10.1.8.1)
# xuhaoyu  pts/2        Dec 22 09:07 (10.1.8.1)

[xuhaoyu@centos7 ~ 09:01:10]$ w
# 说明:查看当前系统登录用户的详细信息,包括登录时间、空闲时间、正在执行的命令等。
# 输出:
# 09:23:19 up  1:10,  3 users,  load average: 0.00, 0.01, 0.05
# USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
# root     pts/0    10.1.8.1         08:43   39:27   0.06s  0.06s -bash
# xuhaoyu  pts/1    10.1.8.1         09:23    2.00s  0.05s  0.01s w
# xuhaoyu  pts/2    10.1.8.1         09:07    7.00s  0.05s  0.05s -bash

3. users — 查看登录用户名列表

[root@centos7 ~ 09:01:15]$ users
# 说明:查看当前系统中所有终端上登录的用户名(简洁版,只显示用户名)。
# 输出:xuhaoyu xuhaoyu root

4. useradd — 创建用户

# 示例1:创建默认用户
[root@centos7 ~ 09:02:00]$ useradd user01
# 说明:创建名为 user01 的普通用户。
# 系统自动分配 UID(从 1000 开始递增)、GID,创建家目录 /home/user01,默认 Shell 为 /bin/bash。

[root@centos7 ~ 09:02:05]$ grep user01 /etc/passwd
# 说明:在 /etc/passwd 中过滤 user01 的条目,验证用户是否创建成功。
# 输出:user01:x:1003:1003::/home/user01:/bin/bash
# 解析:UID=1003,GID=1003,家目录 /home/user01,Shell /bin/bash

# 示例2:指定参数创建用户
[root@centos7 ~ 09:02:10]$ useradd -u 8888 -d /opt/user02 -c "user for software manage" -g wheel -s /sbin/nologin user02
# 说明:创建用户 user02,并指定各项属性:
#   -u 8888:指定 UID 为 8888
#   -d /opt/user02:指定家目录为 /opt/user02
#   -c "user for software manage":指定描述信息
#   -g wheel:指定主组为 wheel(GID=10)
#   -s /sbin/nologin:指定登录 Shell 为 /sbin/nologin(禁止交互式登录)
# 注意:如果不指定 -g,默认会创建一个与用户名同名的组作为主组。

[root@centos7 ~ 09:02:15]$ grep user02 /etc/passwd
# 说明:查看 /etc/passwd 中 user02 的条目,验证各项属性是否设置正确。
# 输出:user02:x:8888:10:user for software manager:/opt/user02:/sbin/nologin
# 解析:GID=10(wheel 组),描述信息为 "user for software manager"

[root@centos7 ~ 09:02:20]$ ls -d /opt/user02/
# 说明:查看 user02 的家目录是否被创建。
# 输出:/opt/user02/

# 示例3:创建无密码用户
[root@centos7 ~ 09:02:25]$ useradd -p '' tom
# 说明:创建一个没有密码的账户 tom(-p '' 表示密码为空字符串)。
# 该用户在图形化界面中可以直接登录(无需密码),但在终端登录时仍需输入密码(空密码)。

新用户家目录模板: /etc/skel/

[root@centos7 ~ 09:02:30]$ ls -a ~tom
# 说明:查看 tom 用户家目录中的所有文件(包括隐藏文件)。
# 输出:.  ..  .bash_logout  .bash_profile  .bashrc  .mozilla

[root@centos7 ~ 09:02:35]$ ls -a /etc/skel/
# 说明:查看 /etc/skel/ 目录的内容。
# 新用户家目录中的隐藏配置文件都来源于此目录。
# 输出:.  ..  .bash_logout  .bash_profile  .bashrc  .mozilla

创建用户的默认参数配置文件: /etc/login.defs

[root@centos7 ~ 09:02:40]$ vim /etc/login.defs
# 说明:查看 /etc/login.defs 文件,该文件定义了创建用户时的默认参数。
# 关键配置项:
#   MAIL_DIR        /var/spool/mail   # 邮件目录
#   UMASK           022                # 默认权限掩码
#   HOME_MODE       0700               # 家目录默认权限
#   PASS_MAX_DAYS   99999              # 密码最大有效期(天)
#   PASS_MIN_DAYS   0                  # 密码最小有效期(天)
#   PASS_MIN_LEN    5                  # 密码最小长度
#   PASS_WARN_AGE   7                  # 密码过期前警告天数
#   UID_MIN         1000               # 普通用户 UID 最小值
#   UID_MAX         60000              # 普通用户 UID 最大值
#   SYS_UID_MIN     201                # 系统用户 UID 最小值
#   SYS_UID_MAX     999                # 系统用户 UID 最大值
#   CREATE_HOME     yes                # 默认创建家目录
#   USERGROUPS_ENAB yes                # 创建与用户名同名的组

5. usermod — 修改用户属性

# 示例1:修改用户属性
[root@centos7 ~ 09:03:00]$ usermod user02 -u 1008 -md /home/user02 -s /bin/bash
# 说明:修改 user02 的用户属性:
#   -u 1008:将 UID 改为 1008
#   -d /home/user02:将家目录改为 /home/user02
#   -m:将原家目录 /opt/user02 的内容移动到新家目录 /home/user02
#   -s /bin/bash:将登录 Shell 改为 /bin/bash(恢复登录权限)
# 注意:-m 必须与 -d 配合使用,否则只改路径不移动文件。

[root@centos7 ~ 09:03:05]$ grep user02 /etc/passwd
# 说明:验证修改后的用户信息。
# 输出:user02:x:1008:10:user for software manager:/home/user02:/bin/bash
# 解析:UID 已变为 1008,家目录改为 /home/user02,Shell 改为 /bin/bash

[root@centos7 ~ 09:03:10]$ ls -d /home/user02/
# 说明:验证新家目录是否创建成功。
# 输出:/home/user02/

[root@centos7 ~ 09:03:15]$ su - user02
# 说明:切换到 user02 用户,验证是否可以正常登录。
# 输出:
# Last login: Mon Nov  7 17:08:58 CST 2022 on pts/2
# [user02@centos7 ~]$

# 示例2:添加补充组
[root@centos7 ~ 09:03:20]$ usermod -aG user01 user02
# 说明:将 user02 添加到 user01 组(作为补充组)。
#   -a:append(追加),必须与 -G 配合使用,表示追加补充组而不覆盖原有补充组。
#   -G:指定补充组列表(多个组用逗号分隔)。
# 注意:如果只写 usermod -G user01 user02(不加 -a),则会覆盖原有的所有补充组。

[root@centos7 ~ 09:03:25]$ id user02
# 说明:查看 user02 的完整用户信息(UID、GID、所有所属组)。
# 输出:uid=1008(user02) gid=10(wheel) groups=10(wheel),1003(user01)
# 解析:user02 的主组为 wheel(GID=10),补充组为 user01(GID=1003)

6. userdel — 删除用户

# 示例1:正常删除
[root@centos7 ~ 09:04:00]$ useradd user03
# 说明:创建测试用户 user03。

[root@centos7 ~ 09:04:05]$ userdel user03
# 说明:普通删除用户 user03。
# 注意:userdel 默认只删除 /etc/passwd 和 /etc/shadow 中的条目,不会删除家目录和邮件池。

# 示例2:强制删除(用户正在登录时)
[root@centos7 ~ 09:04:10]$ userdel user02
# 说明:尝试删除 user02,但由于 user02 当前正在登录(有进程占用),删除失败。
# 输出:userdel: user user02 is currently used by process 9071

[root@centos7 ~ 09:04:15]$ id user02
# 说明:查看 user02 的信息,确认用户仍然存在。
# 输出:uid=1008(user02) gid=10(wheel) groups=10(wheel),1003(user01)

[root@centos7 ~ 09:04:20]$ userdel -f user02
# 说明:强制删除 user02(-f 表示 force),即使该用户正在登录也会被删除。
# 输出:userdel: user user02 is currently used by process 9071

[root@centos7 ~ 09:04:25]$ id user02
# 说明:再次查看 user02,确认已被强制删除。
# 输出:id: user02: no such user
# 警告:强制删除可能导致该用户正在运行的进程出现异常,生产环境中应谨慎使用。

7. 综合练习

# 1. 创建 operator1 用户
[root@centos7 ~ 09:05:00]$ useradd operator1
# 说明:创建一个名为 operator1 的普通用户,使用默认参数。

# 2. 使用 id 验证 operator1 用户信息
[root@centos7 ~ 09:05:05]$ id operator1
# 说明:查看 operator1 的 UID、GID 和所属组。
# 输出:uid=1002(operator1) gid=1002(operator1) groups=1002(operator1)

# 3. 查看 /etc/passwd 中对应条目
[root@centos7 ~ 09:05:10]$ grep operator1 /etc/passwd
# 说明:在 /etc/passwd 中过滤 operator1 的条目,确认用户已创建。
# 输出:operator1:x:1002:1002::/home/operator1:/bin/bash

# 4. 密码设置为 redhat
[root@centos7 ~ 09:05:15]$ echo "operator1:redhat" | chpasswd
# 说明:使用 chpasswd 命令通过管道设置用户密码,避免交互式输入。
# chpasswd 从标准输入读取 "用户名:密码" 格式的数据,批量设置密码。

# 5. 修改 operator1 用户 uid 为 1088
[root@centos7 ~ 09:05:20]$ usermod -u 1088 operator1
# 说明:将 operator1 的 UID 从自动分配的 1002 改为 1088。
# 注意:修改 UID 后,该用户拥有的文件所有者 UID 也会随之更新。

# 6. 修改 operator1 用户描述信息为 "Operator One"
[root@centos7 ~ 09:05:25]$ usermod -c "Operator One" operator1
# 说明:修改 /etc/passwd 中 operator1 的 GECOS 字段(描述信息)。

# 7. 将 wheel 组作为补充组添加给 operator1 用户
[root@centos7 ~ 09:05:30]$ usermod -aG wheel operator1
# 说明:将 operator1 添加到 wheel 补充组(wheel 组通常具有 sudo 权限)。
# 注意:必须加 -a,否则会覆盖所有原有补充组。

# 8. 查看 /etc/group 中对应条目
[root@centos7 ~ 09:05:35]$ grep wheel /etc/group
# 说明:查看 /etc/group 中 wheel 组的条目,确认 operator1 已加入。
# 输出:wheel:x:10:operator1

# 9. 删除 operator1 用户
[root@centos7 ~ 09:05:40]$ userdel -r operator1
# 说明:删除 operator1 用户,并同时删除其家目录和邮件池(-r 表示 remove)。
# 如果不加 -r,家目录和邮件池会被保留。

三、综合案例

案例1:手动创建一个用户

手动创建用户需要修改 3 个核心文件(/etc/passwd、/etc/group、/etc/shadow)并准备家目录。

# 步骤1:添加账户(修改 /etc/passwd)
[root@centos7 ~ 09:10:00]$ vim /etc/passwd
# 说明:使用 vim 编辑 /etc/passwd 文件,在最后一行添加用户条目。
# 添加内容:zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
# 字段解析:用户名:密码占位:UID:GID:描述:家目录:Shell
# 注意:UID 要在原有最大值的基础上 +1,避免 UID 冲突。

# 步骤2:添加组(修改 /etc/group)
[root@centos7 ~ 09:10:05]$ vim /etc/group
# 说明:使用 vim 编辑 /etc/group 文件,在最后一行添加组条目。
# 添加内容:zhangsan:x:1002:
# 字段解析:组名:密码占位:GID:成员列表(空)

# 步骤3:添加密码(修改 /etc/shadow)
[root@centos7 ~ 09:10:10]$ vim /etc/shadow
# 说明:使用 vim 编辑 /etc/shadow 文件,在最后一行添加密码条目。
# 添加内容:zhangsan:$6$FgUNKn74yoEDbcXD$pxDk9AEhsxkJGYi76Rv91zLy5LRns8olgAyGuNssQYG07ypaidhuX0gHAU4hrNi9Zp9A7vtMEvbyzCQ0e/gbk1::0:99999:7:::
# 字段解析:用户名:加密密码:最后修改:最小:最大:警告:非活跃:过期:保留
# 这里使用了预生成的加密密码。如果不知道加密密码,也可以临时设置为空(::),登录后再用 passwd 设置。

# 步骤4:准备家目录
[root@centos7 ~ 09:10:15]$ cp -r /etc/skel/ /home/zhangsan
# 说明:将 /etc/skel/ 目录复制到 /home/zhangsan,作为该用户的家目录。
# -r:递归复制,保留所有子文件和目录。

[root@centos7 ~ 09:10:20]$ chown zhangsan:zhangsan /home/zhangsan
# 说明:修改家目录的所有者和组为 zhangsan(-R 递归修改所有子文件)。
# 如果不修改所有者,用户登录时可能无法读写家目录中的配置文件。

[root@centos7 ~ 09:10:25]$ ll -d /home/zhangsan
# 说明:查看家目录的权限和所有者信息,验证是否设置正确。
# 输出:drwxr-xr-x. 16 zhangsan zhangsan 4096 Jul 19 14:00 zhangsan

# 步骤5:测试登录
[root@centos7 ~ 09:10:30]$ ssh zhangsan@localhost
# 说明:通过 SSH 登录测试,确认用户 zhangsan 可以正常登录。
# 输入密码后登录成功。

案例2:bash 提示符变为初始字符(bash-4.2$)

故障现象: 登录后提示符显示为 bash-4.2$,而不是正常的 [user@host ~]$。

# 模拟故障:移动 /etc/bashrc 文件
[root@centos7 ~ 09:15:00]$ mv /etc/bashrc{,.ori}
# 说明:将 /etc/bashrc 重命名为 /etc/bashrc.ori(大括号展开技巧)。
# {,.ori} 展开为 原文件名 和 原文件名.ori,等同于 mv /etc/bashrc /etc/bashrc.ori。
# /etc/bashrc 是全局 bash 配置文件,定义了 PS1、umask 等环境变量。

[root@centos7 ~ 09:15:05]$ bash
# 说明:在当前 Shell 中启动一个子 Shell(非登录 Shell)。
# 由于 /etc/bashrc 被移走,子 Shell 启动时无法加载其中的配置。
# 提示符变为:bash-4.2#

# 原因:非登录 Shell 启动时会按顺序加载 ~/.bashrc 和 /etc/bashrc。
# /etc/bashrc 中定义了 PS1 环境变量,被移走后 PS1 恢复为 bash 的默认值 "bash-4.2$"。

# 恢复配置:
[root@centos7 ~ 09:15:10]$ mv /etc/bashrc{.ori,}
# 说明:将 /etc/bashrc.ori 重命名回 /etc/bashrc。
# {.ori,} 展开为 原文件名.ori 和 原文件名,等同于 mv /etc/bashrc.ori /etc/bashrc。

[root@centos7 ~ 09:15:15]$ bash
# 说明:再次启动子 Shell,此时 /etc/bashrc 已恢复,提示符恢复正常。
# 输出:[root@centos7 ~]#

案例3:误删用户家目录

故障现象: 用户登录时提示 Could not chdir to home directory: No such file or directory。

# 模拟故障:删除用户家目录
[root@centos7 ~ 09:20:00]$ rm -fr /home/zhangsan
# 说明:强制递归删除 /home/zhangsan 目录(-f 不提示确认,-r 递归删除)。
# 该操作模拟了管理员误删用户家目录的场景。

# 尝试登录,观察故障现象
[root@centos7 ~ 09:20:05]$ ssh zhangsan@localhost
# 说明:尝试通过 SSH 登录 zhangsan 用户。
# 输出:
# zhangsan@localhost's password:
# Last login: Fri Jul 19 14:13:47 2024 from ::1
# Could not chdir to home directory /home/zhangsan: No such file or directory
# -bash-4.2$
# 故障说明:家目录不存在,无法切换;由于找不到 .bashrc 等配置文件,提示符变为默认值。

# 解决方法:重新创建家目录
[root@centos7 ~ 09:20:10]$ cp -r /etc/skel/ /home/zhangsan
# 说明:从模板目录复制文件,重建用户家目录。

[root@centos7 ~ 09:20:15]$ chown zhangsan:zhangsan /home/zhangsan
# 说明:修改家目录的所有者和组为 zhangsan。

[root@centos7 ~ 09:20:20]$ ssh zhangsan@localhost
# 说明:再次尝试登录,故障已解决。

案例4:没有权限切换家目录

故障现象: 用户登录时提示 Could not chdir to home directory: Permission denied。

# 模拟故障:移除家目录的读/执行权限
[root@centos7 ~ 09:25:00]$ chmod u=- /home/zhangsan
# 说明:使用 chmod 移除家目录的所有者权限(u=- 表示移除所有者的所有权限)。
# 等价于 chmod 000 /home/zhangsan。
# 此时家目录的权限变为 ----------,所有者 zhangsan 无法进入。

# 尝试登录,观察故障现象
[root@centos7 ~ 09:25:05]$ ssh zhangsan@localhost
# 说明:尝试通过 SSH 登录 zhangsan 用户。
# 输出:
# Could not chdir to home directory /home/zhangsan: Permission denied
# -bash: /home/zhangsan/.bash_profile: 权限不够
# 故障说明:家目录存在但没有权限进入,导致无法读取配置文件。

# 解决方法:恢复正确的权限
[root@centos7 ~ 09:25:10]$ chown -R zhangsan:zhangsan /home/zhangsan
# 说明:递归修改家目录及其所有子文件的所有者和组为 zhangsan。

[root@centos7 ~ 09:25:15]$ chmod u=rwx /home/zhangsan
# 说明:为家目录的所有者设置读、写、执行权限(rwx = 7)。
# 注意:目录需要有执行权限(x)才能进入。

[root@centos7 ~ 09:25:20]$ ll -d /home/zhangsan
# 说明:查看家目录的权限和所有者信息,验证是否修复正确。
# 输出:drwx------. 3 zhangsan zhangsan 78 Jul 18 09:25 /home/zhangsan
# 700 权限表示:所有者可读/写/执行,组和其他用户无任何权限。

[root@centos7 ~ 09:25:25]$ ssh zhangsan@localhost
# 说明:再次尝试登录,故障已解决。

四、本地组管理

1. groupadd — 创建组

# 示例1:创建默认组
[root@centos7 ~ 09:30:00]$ groupadd admin
# 说明:创建名为 admin 的组。
# 系统会自动分配一个未被使用的 GID(从 1000 开始递增)。

# 示例2:指定 GID 创建组
[root@centos7 ~ 09:30:05]$ groupadd sysadmin -g 2000
# 说明:创建名为 sysadmin 的组,并指定 GID 为 2000。
# -g:指定 GID(Group ID),必须是未被使用的唯一数字。

# 验证
[root@centos7 ~ 09:30:10]$ grep admin /etc/group
# 说明:在 /etc/group 中过滤包含 admin 的行,验证组是否创建成功。
# 输出:
# printadmin:x:997:
# admin:x:1002:
# sysadmin:x:2000:
# 解析:printadmin 是系统自带的组,GID 997 属于系统组(<1000)。

2. groupmod — 修改组属性

# 示例1:修改组名称
[root@centos7 ~ 09:31:00]$ groupmod --new-name admins admin
# 说明:将 admin 组的名称修改为 admins。
# --new-name:指定新组名(注意是两个横杠)。

# 示例2:修改组 GID
[root@centos7 ~ 09:31:05]$ groupmod -g 2002 admins
# 说明:将 admins 组的 GID 从自动分配的值改为 2002。
# -g:指定新的 GID。

# 验证
[root@centos7 ~ 09:31:10]$ grep 'admins' /etc/group
# 说明:在 /etc/group 中精确匹配 admins 组,验证修改结果。
# 输出:admins:x:2002:
# 注意:如果组名包含特殊字符,用单引号包裹可以避免 Shell 解析问题。

3. groupdel — 删除组

[root@centos7 ~ 09:32:00]$ groupdel sysadmin
# 说明:删除 sysadmin 组。
# 注意:如果该组是某个用户的主组(/etc/passwd 中 GID 指向该组),则无法删除。
# 需要先修改该用户的主组或删除该用户,才能删除组。

[root@centos7 ~ 09:32:05]$ grep sysadmin /etc/group
# 说明:验证 sysadmin 组是否已被删除。
# 输出:(无任何输出,表示组已成功删除)

4. groupmems — 管理组成员

[root@centos7 ~ 09:33:00]$ groupmems --help
# 说明:查看 groupmems 命令的帮助信息。
# 输出:
# 用法:groupmems [选项] [动作]
# 选项:
#   -g, --group groupname   更改组 groupname,而不是用户的组(只 root)
#   -R, --root CHROOT_DIR   chroot 到的目录
# 动作:
#   -a, --add username      将用户 username 添加到组成员中
#   -d, --delete username   从组的成员中删除用户 username
#   -h, --help              显示此帮助信息并推出
#   -p, --purge             从组中移除所有成员
#   -l, --list              列出组中的所有成员

# 添加成员
[root@centos7 ~ 09:33:05]$ groupmems -g admins -a xuhaoyu
# 说明:将用户 xuhaoyu 添加到 admins 组(作为补充组成员)。
# -g:指定目标组名
# -a:添加用户(add)

[root@centos7 ~ 09:33:10]$ groupmems -g admins -l
# 说明:列出 admins 组中的所有成员。
# 输出:xuhaoyu

[root@centos7 ~ 09:33:15]$ id xuhaoyu
# 说明:查看 xuhaoyu 的完整用户信息,验证已成功加入 admins 组。
# 输出:uid=1000(xuhaoyu) gid=1000(xuhaoyu) 组=1000(xuhaoyu),10(wheel),2002(admins)

# 删除成员
[root@centos7 ~ 09:33:20]$ groupmems -g admins -d xuhaoyu
# 说明:从 admins 组中移除用户 xuhaoyu。
# -d:删除成员(delete)

[root@centos7 ~ 09:33:25]$ groupmems -g admins -l
# 说明:再次列出 admins 组中的成员,验证已被移除。
# 输出:(无输出,表示组成员为空)

# 清空组中所有成员
[root@centos7 ~ 09:33:30]$ groupmems -g admins -a user01
[root@centos7 ~ 09:33:35]$ groupmems -g admins -a user02
# 说明:先添加两个测试成员到 admins 组。

[root@centos7 ~ 09:33:40]$ groupmems -g admins -p
# 说明:清空 admins 组中的所有成员(purge)。
# 注意:-p 会移除组内所有成员。

[root@centos7 ~ 09:33:45]$ groupmems -g admins -l
# 说明:验证组成员是否已被全部清空。
# 输出:(无输出)

5. 课后练习完整操作

# 1. 创建 developer 组,组 id 为 2000
[root@centos7 ~ 09:35:00]$ groupadd developer -g 2000
# 说明:创建 developer 组,并指定 GID=2000。

# 2. 修改 developer 组名称为 developers,组 id 为 3000
[root@centos7 ~ 09:35:05]$ groupmod --new-name developers developer
# 说明:将组名从 developer 改为 developers。

[root@centos7 ~ 09:35:10]$ groupmod -g 3000 developers
# 说明:将 GID 从 2000 改为 3000。

[root@centos7 ~ 09:35:15]$ grep developers /etc/group
# 说明:验证修改结果。
# 输出:developers:x:3000:

# 3. 创建 developer1 用户,并添加到 developers 组
[root@centos7 ~ 09:35:20]$ useradd developer1
# 说明:创建普通用户 developer1。

[root@centos7 ~ 09:35:25]$ usermod -aG developers developer1
# 说明:将 developer1 添加到 developers 补充组。
# 注意:必须加 -a,否则会覆盖原有的补充组。

[root@centos7 ~ 09:35:30]$ id developer1
# 说明:查看 developer1 的用户信息,验证已加入 developers 组。
# 输出:uid=1004(developer1) gid=1004(developer1) groups=1004(developer1),3000(developers)

# 4. 将 developer1 用户从 developers 组中删除
[root@centos7 ~ 09:35:35]$ groupmems -g developers -d developer1
# 说明:从 developers 组中移除 developer1 用户。

[root@centos7 ~ 09:35:40]$ groupmems -g developers -l
# 说明:列出 developers 组成员,验证 developer1 已被移除。
# 输出:(无输出)

# 5. 删除 developers 组
[root@centos7 ~ 09:35:45]$ groupdel developers
# 说明:删除 developers 组。
# 注意:如果该组是某个用户的主组(GID 指向该组),则无法删除。

[root@centos7 ~ 09:35:50]$ grep developers /etc/group
# 说明:验证 developers 组是否已被删除。
# 输出:(无输出)

五、管理用户密码

1. /etc/shadow 文件详解

/etc/shadow 文件保存操作系统登录用户密码信息。每行包含一个登录用户信息,以冒号分隔九个域。

[root@centos7 ~ 09:40:00]$ grep xuhaoyu /etc/shadow
# 说明:查看 xuhaoyu 用户在 /etc/shadow 中的密码条目。
# 输出示例:xuhaoyu:$6$m0OgWyIu$P2TF1pB8MO...J3LopEUdhmp/Ir/:19300:0:99999:7:::

字段解析(9 个字段,冒号分隔):

字段字段名说明示例值
1用户名登录用户名xuhaoyu
2加密密码加密后的密码,! 或 * 表示锁定$6$m0OgWyIu$...
3最后修改日期距离 1970-01-01 的天数,0=强制改密码19300
4最小密码期限密码修改间隔最小天数,0=随时可改0
5最大密码期限密码有效最大天数,99999=永不过期99999
6警告天数过期前提前警告的天数,0=不警告7
7非活跃天数过期后仍可使用的天数,空=永久可用(空)
8账户过期时间账户过期时间(天数),空=永不过期(空)
9保留字段预留扩展字段(空)

2. chage — 更改用户密码信息

# 查看用户密码信息
[root@centos7 ~ 09:41:00]$ chage -l xuhaoyu
# 说明:列出用户 xuhaoyu 的密码策略详细信息(-l 表示 list)。
# 输出:
# 最近一次密码修改时间:Jul 18, 2026
# 密码过期时间:从不
# 密码失效时间:从不
# 帐户过期时间:从不
# 两次改变密码之间相距的最小天数:0
# 两次改变密码之间相距的最大天数:99999
# 在密码过期之前警告的天数:7

# 修改最大密码有效期
[root@centos7 ~ 09:41:10]$ chage -M 100 xuhaoyu
# 说明:设置密码最大有效期为 100 天(-M 表示 Maximum)。
# 100 天后密码过期,用户需要修改密码。

[root@centos7 ~ 09:41:15]$ chage -l xuhaoyu
# 说明:查看修改后的密码策略。
# 输出中 "密码过期时间" 会变为当前日期 + 100 天。

# 修改最小密码有效期
[root@centos7 ~ 09:41:20]$ chage -m 10 xuhaoyu
# 说明:设置密码最小有效期为 10 天(-m 表示 minimum)。
# 用户修改密码后,10 天内不能再次修改密码。

# 强制用户下次登录修改密码
[root@centos7 ~ 09:41:25]$ chage -d 0 xuhaoyu
# 说明:将最后一次密码修改日期设置为 0(-d 表示 date)。
# 0 表示距离 1970-01-01 为 0 天,即密码已过期。
# 用户下次登录时会被强制要求更改密码。

# 验证强制修改密码的效果
[root@centos7 ~ 09:41:30]$ ssh xuhaoyu@localhost
# 说明:尝试通过 SSH 登录 xuhaoyu。
# 输出:
# xuhaoyu@localhost's password:
# You are required to change your password immediately (root enforced)
# Last login: Tue Nov  8 11:13:51 2022 from localhost
# WARNING: Your password has expired.
# You must change your password now and login again!
# 更改用户 xuhaoyu 的密码 。
# (当前)UNIX 密码:

# 设置密码过期时间为过去的时间
[root@centos7 ~ 09:41:35]$ chage -d 1 xuhaoyu
# 说明:将最后一次密码修改日期设置为 1(距离 1970-01-01 的第 1 天)。
# 这同样会确保密码已过期,强制用户下次登录修改密码。

# 设置账户过期时间(锁定账户)
[root@centos7 ~ 09:41:40]$ chage -E 1970-01-01 xuhaoyu
# 说明:设置账户过期日期为 1970-01-01(-E 表示 Expire)。
# 过去的时间意味着账户已经过期,用户无法登录。

3. usermod -p — 更改用户密码

# 查看 laowang 的加密密码
[root@centos7 ~ 09:42:00]$ grep laowang /etc/shadow
# 说明:查看 laowang 用户在 /etc/shadow 中的密码条目。
# 输出:laowang:$6$dQcDSqtz$Nboi6QLMzscWSLvnnRO86gm3XI/qbgfnK5zVv2Ix13EktQ97vwNsqQlrfI2K/b1mVnHNgzmMNIb0P4HnTugog/:19304:0:99999:7:::

# 将 laowang 的密码复制给 xuhaoyu
[root@centos7 ~ 09:42:05]$ usermod -p '$6$dQcDSqtz$Nboi6QLMzscWSLvnnRO86gm3XI/qbgfnK5zVv2Ix13EktQ97vwNsqQlrfI2K/b1mVnHNgzmMNIb0P4HnTugog/' xuhaoyu
# 说明:使用 usermod -p 直接设置 xuhaoyu 的加密密码。
# -p:指定加密后的密码(注意用单引号包裹,防止 $ 被 Shell 解释为变量)。
# 此时 xuhaoyu 的密码与 laowang 相同。

# 删除用户密码(无密码登录)
[root@centos7 ~ 09:42:10]$ usermod -p '' xuhaoyu
# 说明:将用户密码设置为空字符串。
# 效果:用户登录时只需输入用户名即可登录(无需密码)。
# 警告:这是非常不安全的操作,仅用于测试或特殊场景。

4. usermod -s — 限定用户 Shell(限制登录)

# 默认情况下,root 用户可以切换到任何用户且无需密码
[root@centos7 ~ 09:43:00]$ su - laowang
# 说明:使用 su - 切换用户,如果 root 用户执行,不需要输入密码。
# 输出:
# 上一次登录:二 11月  8 11:19:14 CST 2022tty1 上
# [laowang@centos7 ~]$

# 更改用户 Shell 为 /sbin/nologin(禁止登录)
[root@centos7 ~ 09:43:05]$ usermod -s /sbin/nologin laowang
# 说明:将 laowang 的登录 Shell 改为 /sbin/nologin。
# /sbin/nologin 是一个特殊的 Shell,会直接拒绝登录并显示提示信息。

[root@centos7 ~ 09:43:10]$ su - laowang
# 说明:再次尝试切换用户。
# 输出:
# 上一次登录:二 11月  8 11:21:23 CST 2022pts/0 上
# This account is currently not available.
# 说明:用户已被禁止登录。

# 恢复用户的登录权限
[root@centos7 ~ 09:43:15]$ usermod -s /bin/bash laowang
# 说明:将 laowang 的登录 Shell 改回 /bin/bash,恢复登录权限。

5. usermod -L — 锁定用户密码

[root@centos7 ~ 09:44:00]$ usermod -L laowang
# 说明:锁定用户 laowang 的密码(-L 表示 Lock)。
# 原理:在 /etc/shadow 中该用户的加密密码前添加一个 "!" 字符,使密码失效。
# 等效于 passwd -l。

# 尝试切换用户(输入正确密码也无法登录)
[xuhaoyu@centos7 ~ 09:44:05]$ su - laowang
# 说明:尝试切换用户,输入密码。
# 输出:
# Password:
# su: Authentication failure
# 说明:密码验证失败,即使输入正确的密码也无法登录。

6. usermod -U — 解锁用户密码

[root@centos7 ~ 09:44:10]$ usermod -U laowang
# 说明:解锁用户 laowang 的密码(-U 表示 Unlock)。
# 原理:移除 /etc/shadow 中加密密码前的 "!" 字符。
# 等效于 passwd -u。

# 再次尝试切换用户
[xuhaoyu@centos7 ~ 09:44:15]$ su - laowang
# 说明:再次尝试切换用户。
# 输出:
# Password:
# [laowang@centos7 ~]$
# 说明:用户已成功登录,密码恢复正常。

7. passwd -d — 删除密码

[root@centos7 ~ 09:45:00]$ passwd -d laowang
# 说明:删除用户 laowang 的密码(-d 表示 delete)。
# 输出:清除用户的密码 laowang。 passwd: 操作成功

# 效果:用户 laowang 在登录时只需要输入用户名即可登录(无需密码)。
# 注意:与 usermod -p '' 效果相同。

8. 设置账户过期

# 方法一:使用 usermod -e
[root@centos7 ~ 09:46:00]$ usermod -e 2024-07-18 laowang
# 说明:设置用户 laowang 的账户过期日期为 2024-07-18(-e 表示 expire)。
# 日期格式:YYYY-MM-DD。过期后用户无法登录。

# 方法二:使用 chage -E
[root@centos7 ~ 09:46:05]$ chage -E 2024-07-18 laowang
# 说明:与 usermod -e 等效,设置账户过期时间。
# 也可以使用过去的日期来立即过期账户。
# 等效于 passwd -e(但 passwd -e 是强制密码过期,不是账户过期)

9. 增加一个 UID 为 0 的用户(获取 root 权限)

方法一:直接修改 /etc/passwd

[root@centos7 ~ 09:47:00]$ vim /etc/passwd
# 说明:手动编辑 /etc/passwd 文件,将 xuhaoyu 用户的 UID 改为 0。
# 原内容:xuhaoyu:x:1000:1000:xuhaoyu:/home/xuhaoyu:/bin/bash
# 修改后:xuhaoyu:x:0:1000:xuhaoyu:/home/xuhaoyu:/bin/bash

[root@centos7 ~ 09:47:05]$ id xuhaoyu
# 说明:查看 xuhaoyu 的用户信息。
# 输出:uid=0(root) gid=1000(xuhaoyu) 组=1000(xuhaoyu)
# 说明:xuhaoyu 的 UID 变为 0,获得了 root 权限。

方法二:使用 useradd -o -u 0

[root@centos7 ~ 09:47:10]$ useradd -o -u 0 xuhaoyu
# 说明:创建用户 xuhaoyu,使用 -o 允许重复的 UID,-u 0 指定 UID 为 0。
# 注意:如果 xuhaoyu 用户已存在,需要先删除再创建。

[root@centos7 ~ 09:47:15]$ id xuhaoyu
# 说明:查看 xuhaoyu 的用户信息。
# 输出:uid=0(root) gid=0(root) 组=0(root)
# 说明:xuhaoyu 和 root 是两个不同的账户,但 xuhaoyu 获得了 root 账户权限。

# 安全提示:UID 为 0 的用户拥有系统最高权限,应尽量避免创建。

10、总结

操作分类命令说明
创建用户useradd [选项] 用户名创建新用户
修改用户usermod [选项] 用户名修改用户属性
删除用户userdel [-r] 用户名删除用户(-r 同时删除家目录)
创建组groupadd [-g GID] 组名创建新组
修改组groupmod [-n 新名] [-g 新GID] 组名修改组属性
删除组groupdel 组名删除组
管理组成员groupmems -g 组名 -a/-d/-l/-p添加/删除/列出/清空成员
查看密码策略chage -l 用户名查看用户密码策略
设置密码策略chage -M/-m/-d/-E 用户名设置密码最大/最小/过期/账户过期
锁定用户usermod -L 或 passwd -l锁定用户密码
解锁用户usermod -U 或 passwd -u解锁用户密码
限制登录usermod -s /sbin/nologin修改 Shell 禁止交互式登录
设置账户过期chage -E 或 usermod -e设置账户过期时间

11. 练习

# 1. 添加用户 laowang,设置密码与 laoma 用户一致(不允许使用 passwd 命令)
[root@centos7 ~ 09:50:00]$ useradd laowang
# 说明:创建用户 laowang。

[root@centos7 ~ 09:50:05]$ grep laoma /etc/shadow
# 说明:查看 laoma 的加密密码。
# 输出:laoma:$6$m0OgWyIu$P2TF...J3LopEUdhmp/Ir/:19300:0:99999:7:::

[root@centos7 ~ 09:50:10]$ usermod -p '从上面复制的加密密码' laowang
# 说明:使用 usermod -p 将 laowang 的密码设置为与 laoma 相同的加密密码。
# 注意:使用单引号包裹密码,防止 $ 被 Shell 解析。

# 2. 设置 laowang 密码策略:
#    - 首次登录必须修改密码
#    - 3 天内不允许修改
#    - 100 天后过期

[root@centos7 ~ 09:50:15]$ chage -d 0 laowang
# 说明:将最后一次密码修改日期设为 0,强制用户下次登录修改密码。

[root@centos7 ~ 09:50:20]$ chage -m 3 laowang
# 说明:设置最小密码有效期为 3 天(3 天内不能修改密码)。

[root@centos7 ~ 09:50:25]$ chage -M 100 laowang
# 说明:设置最大密码有效期为 100 天(100 天后密码过期)。

[root@centos7 ~ 09:50:30]$ chage -l laowang
# 说明:查看 laowang 的密码策略,确认设置正确。
# 输出应显示:最小天数=3,最大天数=100,最后修改时间=1970-01-01

# 3. 禁止 laowang 登录系统,至少使用 2 种方法

# 方法一:锁定用户密码
[root@centos7 ~ 09:50:35]$ usermod -L laowang
# 说明:锁定用户密码,用户无法登录。
# 等效命令:passwd -l laowang

# 方法二:修改 Shell 为 /sbin/nologin
[root@centos7 ~ 09:50:40]$ usermod -s /sbin/nologin laowang
# 说明:将登录 Shell 改为 /sbin/nologin,用户无法交互式登录。

# 方法三:设置账户过期
[root@centos7 ~ 09:50:45]$ chage -E 1970-01-01 laowang
# 说明:将账户过期时间设为过去的日期,用户无法登录。

# 方法四:在 /etc/passwd 中修改 Shell
[root@centos7 ~ 09:50:50]$ vim /etc/passwd
# 说明:手动编辑 /etc/passwd,将 laowang 的 Shell 字段改为 /sbin/nologin。
# 原内容:laowang:x:1002:1002::/home/laowang:/bin/bash
# 修改后:laowang:x:1002:1002::/home/laowang:/sbin/nologin

六、其他 Shell

1. 查看系统中 Shell 清单

[root@centos7 ~ 09:55:00]$ cat /etc/shells
# 说明:查看系统支持的所有合法 Shell 列表。
# 输出:
# /bin/sh
# /bin/bash
# /usr/bin/sh
# /usr/bin/bash

[root@centos7 ~ 09:55:05]$ ll /bin/sh /usr/bin/sh
# 说明:查看 sh 的软链接指向。
# 输出:
# lrwxrwxrwx. 1 root root 4 Feb 10 20:31 /bin/sh -> bash
# lrwxrwxrwx. 1 root root 4 Feb 10 20:31 /usr/bin/sh -> bash
# 说明:/bin/sh 实际上是 /bin/bash 的软链接。

2. 安装其他 Shell

# 安装 tmux(终端复用器)
[root@centos7 ~ 09:56:00]$ yum install -y tmux
# 说明:使用 yum 安装 tmux。
# tmux 是一个终端复用工具,支持多窗口、多会话管理。

# 安装 tcsh(C Shell)
[root@centos7 ~ 09:56:05]$ yum install -y tcsh
# 说明:使用 yum 安装 tcsh(增强版 C Shell)。
# tcsh 是 csh 的增强版本,提供了命令行编辑、命令补全等高级功能。

[root@centos7 ~ 09:56:10]$ ll /bin/csh /usr/bin/csh
# 说明:查看 csh 的软链接指向。
# 输出:
# lrwxrwxrwx. 1 root root 4 Apr 23 2022 /bin/csh -> tcsh
# lrwxrwxrwx. 1 root root 4 Apr 23 2022 /usr/bin/csh -> tcsh
# 说明:/bin/csh 实际上是 /bin/tcsh 的软链接。

3. tmux 快捷键

tmux 的控制键为 Ctrl+b(先按 Ctrl+b,然后松开,再按功能键):

快捷键功能
Ctrl+b c新建一个会话窗口(create)
Ctrl+b N切换到 N 号会话窗口(N 为数字,如 Ctrl+b 1 切换到 1 号窗口)
Ctrl+b ,重命名当前窗口
Ctrl+b d脱离(detach)当前会话,后台运行
Ctrl+b ?显示所有快捷键帮助
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐