在 Linux 系统中,用户与组管理 是系统安全与权限控制的基石。合理的用户与组配置,既能实现多用户环境下的资源隔离,又能通过权限分配保障系统安全。本文将围绕用户与组的创建、删除、管理核心命令(useradd、groupadd、passwd等)展开,从基础语法到实战场景,全面讲解 Linux 用户与组管理的核心知识。
一、Linux 用户与组的核心概念
1. 用户(User)
Linux 用户是系统的操作主体,每个用户拥有唯一的UID(用户 ID),系统通过 UID 识别用户身份。用户分为三类:
- 超级用户(root):UID 为 0,拥有系统最高权限,可执行所有操作。
- 系统用户 :UID 通常为 1~999(不同发行版略有差异),用于运行系统服务(如
nginx、mysql),无登录权限。 - 普通用户:UID 从 1000 开始,由管理员创建,用于日常操作,权限受限制。
2. 用户组(Group)
用户组是多个用户的集合,通过 **GID(组 ID)** 标识,用于简化权限管理(如为一组用户分配相同的文件访问权限)。每个用户至少属于一个主组,可附加多个附属组。
- 主组(Primary Group):用户创建文件时,文件默认归属的组,每个用户唯一。
- 附属组(Supplementary Group):用户额外加入的组,用于扩展权限,一个用户可加入多个。
3. 核心配置文件
用户与组的信息存储在以下核心文件中,是管理的基础:
/etc/passwd:存储用户基本信息(用户名、UID、GID、家目录、Shell 等)。/etc/shadow:存储用户密码(加密后)、密码有效期等安全信息(仅 root 可读取)。/etc/group:存储用户组基本信息(组名、GID、组内用户列表)。/etc/gshadow:存储用户组密码(加密后)、组管理员等信息(仅 root 可读取)。
二、用户管理核心命令实战
1. useradd:创建用户
useradd是创建用户的核心命令,支持自定义 UID、家目录、Shell、附属组等参数。
常用参数
-u:指定用户 UID(需唯一,未指定则系统自动分配)。-g:指定用户主组(需已存在的组名 / GID)。-G:指定用户附属组(多个组用逗号分隔)。-d:指定用户家目录(默认/home/用户名)。-s:指定用户登录 Shell(如/bin/bash、/sbin/nologin,后者禁止登录)。-m:自动创建家目录(若家目录不存在)。-c:添加用户注释(如用户姓名、备注)。
实战示例
bash
# 1. 创建普通用户test,默认配置(主组为test,家目录/home/test,Shell为/bin/bash)
useradd test
# 2. 创建用户admin,指定UID=1001,主组为root,附属组为wheel,家目录/opt/admin,注释"系统管理员"
useradd -u 1001 -g root -G wheel -d /opt/admin -c "系统管理员" admin
# 3. 创建系统用户nginx,禁止登录(用于运行Nginx服务),不创建家目录
useradd -r -s /sbin/nologin nginx
2. passwd:设置 / 修改用户密码
passwd用于为用户设置密码、修改密码,或配置密码有效期(仅 root 可操作其他用户密码)。
常用参数
- 无参数:修改当前用户密码。
用户名:root 用户为指定用户设置 / 修改密码。-l:锁定用户(禁止登录)。-u:解锁用户。-d:删除用户密码(允许无密码登录,不安全)。-S:查看用户密码状态(是否锁定、密码有效期等)。
实战示例
bash
# 1. root用户为test用户设置密码(输入两次密码,无回显)
passwd test
# 2. 锁定test用户(禁止登录)
passwd -l test
# 3. 解锁test用户
passwd -u test
# 4. 查看test用户密码状态
passwd -S test
3. usermod:修改用户信息
usermod用于修改已创建用户的属性(UID、主组、附属组、家目录、Shell 等)。
常用参数
-u:修改用户 UID。-g:修改用户主组。-G:修改用户附属组(覆盖原有附属组,需保留原有组需一并列出)。-aG:追加附属组(不覆盖原有组,推荐使用)。-d:修改用户家目录(需配合-m移动原有家目录数据)。-s:修改用户登录 Shell。-l:修改用户名。-L:锁定用户(同passwd -l)。-U:解锁用户(同passwd -u)。
实战示例
bash
# 1. 将test用户的UID修改为1002
usermod -u 1002 test
# 2. 为test用户追加附属组wheel(不覆盖原有附属组)
usermod -aG wheel test
# 3. 将test用户的家目录修改为/opt/test,并移动原有数据
usermod -d /opt/test -m test
# 4. 将test用户的Shell修改为/sbin/nologin(禁止登录)
usermod -s /sbin/nologin test
# 5. 将test用户的用户名修改为test_new
usermod -l test_new test
4. userdel:删除用户
userdel用于删除系统中的用户,可选择是否删除用户家目录和邮件池。
常用参数
-r:删除用户的同时,删除其家目录和邮件池(推荐使用,避免残留文件)。- 无参数:仅删除用户,保留家目录和邮件池。
实战示例
bash
# 1. 删除test用户,保留家目录和邮件池
userdel test
# 2. 删除test_new用户,同时删除其家目录和邮件池
userdel -r test_new
三、用户组管理核心命令实战
1. groupadd:创建用户组
groupadd用于创建新的用户组,支持自定义 GID。
常用参数
-g:指定组 GID(需唯一,未指定则系统自动分配)。-r:创建系统组(GID 通常为 1~999)。
实战示例
bash
# 1. 创建普通组dev,GID自动分配
groupadd dev
# 2. 创建系统组web,指定GID=888
groupadd -r -g 888 web
2. groupmod:修改用户组信息
groupmod用于修改已创建组的属性(GID、组名)。
常用参数
-g:修改组 GID。-n:修改组名。
实战示例
bash
# 1. 将dev组的GID修改为1001
groupmod -g 1001 dev
# 2. 将dev组的组名修改为develop
groupmod -n develop dev
3. groupdel:删除用户组
groupdel用于删除系统中的用户组,需确保组内无用户(或用户已切换主组),否则无法删除。
实战示例
bash
# 删除develop组
groupdel develop
4. gpasswd:管理组密码与成员
gpasswd用于设置组密码、添加 / 删除组内成员、指定组管理员。
常用参数
-a:向组中添加用户(追加成员)。-d:从组中删除用户。-A:指定组管理员(可管理组内成员)。-r:删除组密码。-R:限制组登录(仅组内成员可通过newgrp切换到该组)。
实战示例
bash
# 1. 向web组中添加test用户
gpasswd -a test web
# 2. 从web组中删除test用户
gpasswd -d test web
# 3. 指定admin为web组的管理员
gpasswd -A admin web
# 4. 为web组设置密码(用户可通过newgrp web切换到该组,需输入密码)
gpasswd web
四、用户与组管理实战场景
场景 1:创建开发团队用户与组
需求:创建dev组,添加 3 名开发用户(dev1、dev2、dev3),均属于dev主组,且可访问/data/dev目录。
bash
# 1. 创建dev组
groupadd dev
# 2. 创建3名开发用户,主组为dev,家目录/home/dev[1-3]
useradd -g dev dev1
useradd -g dev dev2
useradd -g dev dev3
# 3. 为3名用户设置密码
passwd dev1
passwd dev2
passwd dev3
# 4. 创建开发目录并分配权限
mkdir -p /data/dev
chown :dev /data/dev # 归属dev组
chmod 775 /data/dev # 组内用户可读写执行,其他用户仅读执行
场景 2:限制系统服务用户登录
需求:创建mysql系统用户,用于运行 MySQL 服务,禁止登录,不创建家目录。
bash
# 创建mysql系统用户,Shell为/sbin/nologin(禁止登录)
useradd -r -s /sbin/nologin mysql
# 验证用户信息(查看Shell是否为/sbin/nologin)
grep mysql /etc/passwd
场景 3:批量添加用户(脚本实现)
需求:批量创建 10 名用户(user1~user10),主组为users,密码统一为123456。
bash
#!/bin/bash
# 批量创建用户脚本
groupadd -r users # 创建系统组users
for i in {1..10}; do
useradd -g users user$i # 创建用户,主组为users
echo "123456" | passwd --stdin user$i # 非交互设置密码(CentOS/RHEL)
# Ubuntu/Debian系统需替换为:echo "user$i:123456" | chpasswd
done
场景 4:清理僵尸用户与组
需求:删除离职员工用户old_user,并清理其残留的组与文件。
bash
# 1. 查看用户所属组
id old_user
# 2. 删除用户并清理家目录
userdel -r old_user
# 3. 若用户主组无其他成员,删除该组
groupdel old_user_group # 替换为实际组名
五、核心命令速查与注意事项
1. 核心命令速查表
| 命令 | 作用 | 核心参数示例 |
|---|---|---|
useradd |
创建用户 | useradd -g dev -G wheel test |
passwd |
设置 / 修改密码 | passwd test、passwd -l test |
usermod |
修改用户信息 | usermod -aG wheel test |
userdel |
删除用户 | userdel -r test |
groupadd |
创建组 | groupadd dev |
groupmod |
修改组信息 | groupmod -n develop dev |
groupdel |
删除组 | groupdel develop |
gpasswd |
管理组成员 / 密码 | gpasswd -a test dev |
2. 关键注意事项
- 权限原则:普通用户仅能管理自身密码,用户与组的创建、删除、修改需 root 权限。
- UID/GID 唯一性:创建用户 / 组时,UID、GID 必须唯一,避免冲突。
- 主组与附属组 :修改用户附属组时,优先使用
-aG(追加)而非-G(覆盖),防止丢失原有权限。 - 安全规范 :禁止为普通用户分配 root 权限(如直接修改 UID 为 0);系统服务用户需设置
/sbin/nologin,禁止登录;密码需符合复杂度要求,避免弱密码。 - 残留清理 :删除用户时,使用
userdel -r清理家目录与邮件池,避免磁盘空间浪费;删除组前需确认组内无用户。