跳转到内容

用户和组管理

适用于 CentOS Stream 9 & 10 / AlmaLinux 9.x & 10.x / Rocky Linux 9.x & 10.x

Linux 是一个多用户操作系统。正确管理用户和组是系统安全的基础。本文介绍如何在 EL 系统上创建、修改和删除用户与组,以及相关配置文件的结构。

  • 创建、修改和删除用户
  • 管理用户组
  • 理解 /etc/passwd/etc/shadow/etc/group 文件结构
  • 使用 id 命令查看用户信息
  • 配置密码过期策略
  • 一台已安装 EL 9.x 的系统
  • 拥有 sudo 权限的用户账户
查看当前用户的 UID、GID 和所属组
$ id
uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)
查看指定用户的信息
$ id username
查看当前登录的用户名
$ whoami
admin
创建一个新用户
$ sudo useradd webuser

这会自动完成以下操作:

  • /etc/passwd 中添加用户记录
  • /etc/shadow 中添加密码记录
  • 创建同名用户组
  • 创建主目录 /home/webuser
  • /etc/skel 复制默认配置文件到主目录
为新用户设置密码
$ sudo passwd webuser
Changing password for user webuser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
创建用户并指定主目录
$ sudo useradd -d /opt/appuser appuser
创建用户并指定默认 Shell
$ sudo useradd -s /bin/zsh devuser
创建用户并指定 UID
$ sudo useradd -u 1500 customuser
创建用户并添加到附加组
$ sudo useradd -G wheel,docker deploy
创建系统用户(无主目录、无登录 Shell)
$ sudo useradd -r -s /sbin/nologin appservice

常用选项汇总:

选项说明
-d <目录>指定主目录
-s <Shell>指定登录 Shell
-u <UID>指定 UID
-g <主组>指定主组
-G <附加组>指定附加组(逗号分隔多个)
-m强制创建主目录(默认行为)
-M不创建主目录
-r创建系统用户
-e <日期>设置账户过期日期(YYYY-MM-DD)
-c <注释>设置用户注释(全名等)
修改用户的登录 Shell
$ sudo usermod -s /bin/zsh webuser
将用户添加到附加组(保留原有组)
$ sudo usermod -aG wheel webuser
修改用户名
$ sudo usermod -l newname oldname
锁定用户账户(禁止登录)
$ sudo usermod -L webuser
解锁用户账户
$ sudo usermod -U webuser
设置账户过期日期
$ sudo usermod -e 2026-12-31 tempuser
删除用户(保留主目录)
$ sudo userdel webuser
删除用户并同时删除主目录和邮箱
$ sudo userdel -r webuser
查看当前用户所属的所有组
$ groups
admin wheel
查看指定用户所属的组
$ groups webuser
查看某个组的成员
$ getent group wheel
wheel:x:10:admin,deploy
创建新组
$ sudo groupadd developers
创建指定 GID 的组
$ sudo groupadd -g 2000 dbadmin
将用户添加到组
$ sudo usermod -aG developers webuser
使用 gpasswd 添加用户到组
$ sudo gpasswd -a webuser developers
使用 gpasswd 从组中移除用户
$ sudo gpasswd -d webuser developers
修改组名
$ sudo groupmod -n newname oldname
删除组
$ sudo groupdel developers

存储用户账户基本信息,每行一个用户,共 7 个字段:

用户名:密码占位:UID:GID:注释:主目录:Shell
查看 /etc/passwd 中的用户记录
$ grep webuser /etc/passwd
webuser:x:1001:1001::/home/webuser:/bin/bash

各字段说明:

字段示例说明
1webuser用户名
2x密码占位符(实际密码存于 /etc/shadow
31001UID(用户 ID)
41001GID(主组 ID)
5(空)GECOS 注释字段(通常放全名)
6/home/webuser主目录路径
7/bin/bash登录 Shell

存储用户的加密密码和密码策略信息。只有 root 可以读取。

查看 shadow 文件中的记录(需要 root 权限)
$ sudo grep webuser /etc/shadow
webuser:$6$xxxx...hash...:19807:0:99999:7:::

共 9 个字段,以冒号分隔:

字段说明
1用户名
2加密后的密码(!!! 表示账户被锁定/无密码)
3最后一次修改密码的日期(从 1970-01-01 算起的天数)
4密码最小使用天数(0 表示不限制)
5密码最大使用天数(99999 表示永不过期)
6密码到期前的警告天数
7密码过期后账户被禁用的天数
8账户过期日期
9保留字段

存储组信息,每行一个组,共 4 个字段:

组名:密码:GID:成员列表
查看 wheel 组的信息
$ grep wheel /etc/group
wheel:x:10:admin,deploy
字段示例说明
1wheel组名
2x组密码(几乎不使用)
310GID
4admin,deploy组成员(逗号分隔)
查看用户的密码过期详情
$ sudo chage -l webuser

输出示例:

Last password change : Mar 24, 2026
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
设置密码最大有效天数为 90 天
$ sudo chage -M 90 webuser
设置密码最小修改间隔为 7 天
$ sudo chage -m 7 webuser
设置过期前 14 天开始警告
$ sudo chage -W 14 webuser
设置账户过期日期
$ sudo chage -E 2026-12-31 tempuser
强制用户下次登录时修改密码
$ sudo chage -d 0 webuser

全局默认值存储在 /etc/login.defs 中:

查看默认密码策略配置
$ grep -E "^PASS_" /etc/login.defs
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7

以下是一个完整的示例,演示如何为一个项目团队创建用户和组。

  1. 创建项目组

    创建 project 组
    $ sudo groupadd project
  2. 创建团队成员

    创建用户并加入 project 组
    $ sudo useradd -G project -c "Zhang San" zhangsan
    $ sudo useradd -G project -c "Li Si" lisi
  3. 为用户设置密码

    设置密码
    $ sudo passwd zhangsan
    $ sudo passwd lisi
  4. 配置密码策略

    设置 90 天密码过期
    $ sudo chage -M 90 zhangsan
    $ sudo chage -M 90 lisi
  5. 验证配置

    确认用户和组配置正确
    $ id zhangsan
    uid=1002(zhangsan) gid=1002(zhangsan) groups=1002(zhangsan),2001(project)
    $ getent group project
    project:x:2001:zhangsan,lisi

在 EL 系统上,adduseruseradd 的符号链接,两者完全一致:

验证 adduser 指向 useradd
$ ls -la /usr/sbin/adduser
lrwxrwxrwx 1 root root 7 ... /usr/sbin/adduser -> useradd

检查以下几点:

确认账户未被锁定
$ sudo passwd -S webuser
webuser PS 2026-03-24 0 99999 7 -1 (Password set, SHA512 crypt.)

状态字段含义:PS = 密码已设置,LK = 已锁定,NP = 无密码。

确认 Shell 是否允许登录
$ grep webuser /etc/passwd | cut -d: -f7
/bin/bash

如果 Shell 是 /sbin/nologin/bin/false,用户无法交互式登录。

列出 UID >= 1000 的普通用户
$ awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd