CentOS Stream 9 用户和组管理 ---语法详解与实战案例
一、概述
Linux 是多用户操作系统,用户和组管理是系统安全与权限控制的核心。
- 用户账户(User Account):标识系统使用者,每个用户有唯一 UID。
- 组账户(Group Account):用于组织用户,简化权限管理,每个组有唯一 GID。
- 权限模型:基于用户/组分配文件/目录的读、写、执行权限。
✅ 查看当前用户和组:
bash
whoami # 当前用户名
id # 显示 UID、GID 和所属组
groups # 显示当前用户所属的所有组
二、用户账户与组账户
2.1 用户账户类型
| 类型 | UID 范围 | 说明 |
|---|---|---|
| 超级用户 | 0 | root,拥有最高权限 |
| 系统用户 | 1--999 | 用于运行服务(如 apache、mysql) |
| 普通用户 | 1000+ | 人工创建,用于登录和操作 |
✅ 查看用户 UID 范围定义:
bash
grep UID /etc/login.defs
# 输出示例:
# UID_MIN 1000
# UID_MAX 60000
2.2 组账户类型
| 类型 | GID 范围 | 说明 |
|---|---|---|
| 系统组 | 1--999 | 服务或系统功能使用 |
| 普通组 | 1000+ | 用户组,用于权限管理 |
✅ 查看组 GID 范围:
bash
grep GID /etc/login.defs
三、账户配置文件详解
3.1 /etc/passwd ------ 用户基本信息
格式(7字段,冒号分隔):
用户名:密码占位符:UID:GID:描述信息:家目录:默认Shell
✅ 示例:
bash
cat /etc/passwd | grep ^alice
# 输出:
# alice:x:1001:1001:Alice User:/home/alice:/bin/bash
📝 字段说明:
x:密码存储在/etc/shadow1001:1001:UID 和 主组 GID/home/alice:家目录/bin/bash:登录 Shell
3.2 /etc/shadow ------ 用户密码与策略(仅 root 可读)
格式(9字段):
用户名:加密密码:最后修改日期:最小天数:最大天数:警告天数:不活动天数:失效日期:保留
✅ 示例:
bash
sudo cat /etc/shadow | grep ^alice
# 输出:
# alice:$6$TrT...kQ1:19800:0:99999:7:::
📝 关键字段说明:
$6$...:SHA-512 加密密码($1=MD5,$5=SHA-256)19800:1970-01-01 至上次修改密码的天数(可用chage -l alice查看人类可读格式)0:99999:7:密码最短0天、最长99999天、过期前7天警告
✅ 查看密码策略(推荐方式):
bash
sudo chage -l alice
# 输出示例:
# Last password change : Apr 01, 2025
# 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
3.3 /etc/group ------ 组基本信息
格式(4字段):
组名:密码占位符:GID:组成员列表(逗号分隔)
✅ 示例:
bash
cat /etc/group | grep developers
# 输出:
# developers:x:1002:bob,carol
📝 说明:
x:组密码在/etc/gshadow1002:GIDbob,carol:附加组成员(不包括主组用户)
3.4 /etc/gshadow ------ 组密码与管理员(仅 root 可读)
格式:
组名:加密密码:管理员列表:成员列表
✅ 示例:
bash
sudo cat /etc/gshadow | grep developers
# 输出:
# developers:$6$Xyz...Abc1::bob,carol
📝 说明:
- 管理员可使用
gpasswd管理组成员 - 通常为空,表示无管理员
3.5 /etc/login.defs ------ 用户/组创建默认策略
控制 UID/GID 范围、密码过期策略、邮箱目录等。
✅ 关键配置项:
bash
grep -E "^(UID_MIN|GID_MIN|PASS_MAX_DAYS|CREATE_HOME)" /etc/login.defs
# 输出示例:
# UID_MIN 1000
# GID_MIN 1000
# PASS_MAX_DAYS 99999
# CREATE_HOME yes
3.6 /etc/skel/ ------ 用户家目录模板
- 新用户创建时,此目录下所有文件/目录会被复制到其家目录。
- 用于预置
.bashrc、.vimrc、桌面文件等。
✅ 示例:为所有新用户预置欢迎文件
bash
echo "Welcome to CentOS Stream 9!" | sudo tee /etc/skel/README.txt
useradd dave # 创建新用户
ls /home/dave/README.txt # 自动存在!
3.7 /etc/default/useradd ------ useradd 命令默认参数
✅ 查看默认配置:
bash
cat /etc/default/useradd
# 输出示例:
# GROUP=100
# HOME=/home
# INACTIVE=-1
# EXPIRE=
# SHELL=/bin/bash
# SKEL=/etc/skel
# CREATE_MAIL_SPOOL=yes
📝 说明:
GROUP=100:默认主组为 users (GID 100)SKEL=/etc/skel:家目录模板路径CREATE_MAIL_SPOOL=yes:自动创建/var/spool/mail/用户名
四、用户账户管理命令
4.1 创建用户:useradd 与 adduser
⚠️ 注意:
adduser在 CentOS 中通常是useradd的软链接,功能相同。
语法:
bash
useradd [选项] 用户名
常用选项:
-u UID:指定 UID-g GID/组名:指定主组-G 组1,组2:指定附加组-d /path:指定家目录-s /shell:指定登录 Shell-c "描述":添加描述信息-m:强制创建家目录(默认已开启)-M:不创建家目录
✅ 案例1:创建普通用户
bash
sudo useradd -c "Project Manager" -s /bin/bash alice
sudo passwd alice # 设置密码(见4.2)
✅ 案例2:指定 UID、GID、附加组
bash
sudo groupadd developers # 先创建组(见5.1)
sudo useradd -u 2001 -g developers -G wheel,docker -d /home/alice -s /bin/zsh -c "Alice Lee" alice
id alice # 验证:uid=2001, gid=1002(developers), groups=1002(developers),10(wheel),993(docker)
✅ 案例3:不创建家目录(系统用户)
bash
sudo useradd -r -s /sbin/nologin -c "Web Server" apache
# -r:创建系统用户(UID<1000)
# -s /sbin/nologin:禁止登录
4.2 修改用户:passwd、usermod、chage
➤ passwd:修改密码
语法:
bash
passwd [用户名] # root 可改他人密码
✅ 案例:
bash
sudo passwd alice
# 输入新密码两次
✅ 强制用户下次登录修改密码:
bash
sudo passwd -e alice # -e = expire
➤ usermod:修改用户属性
常用选项:
-l 新名:改用户名-u UID:改 UID-g 组:改主组-G 组1,组2:设置附加组(会覆盖原有附加组)-aG 组:追加附加组(常用!)-s /shell:改 Shell-d /path:改家目录(需配合-m移动内容)-L:锁定账户-U:解锁账户
✅ 案例1:追加附加组
bash
sudo usermod -aG sudo,adm alice # 将 alice 加入 sudo 和 adm 组(不覆盖原有组)
✅ 案例2:改用户名和家目录
bash
sudo usermod -l alice_new -d /home/alice_new -m alice
# -m:移动原家目录内容到新位置
✅ 案例3:锁定/解锁账户
bash
sudo usermod -L alice # 锁定(/etc/shadow 密码前加 !)
sudo usermod -U alice # 解锁
➤ chage:管理密码过期策略
常用选项:
-l:查看策略-E YYYY-MM-DD:账户过期日-M 天数:密码最大有效期-m 天数:密码最短有效期-W 天数:过期前警告天数-I 天数:密码过期后宽限天数
✅ 案例:设置密码90天过期,提前7天警告
bash
sudo chage -M 90 -m 7 -W 7 alice
sudo chage -l alice # 验证
✅ 案例:设置账户2025-12-31过期
bash
sudo chage -E 2025-12-31 alice
4.3 删除用户:userdel
语法:
bash
userdel [选项] 用户名
常用选项:
-r:同时删除家目录和邮件池- (无选项):仅删除用户,保留家目录
⚠️ 生产环境慎用
-r,建议先备份!
✅ 案例:
bash
sudo userdel -r alice # 删除用户及家目录
✅ 安全删除流程:
bash
# 1. 锁定账户
sudo usermod -L alice
# 2. 备份家目录
sudo tar -czf /backup/alice_home_$(date +%Y%m%d).tar.gz /home/alice
# 3. 确认无进程在运行
sudo pkill -u alice
# 4. 删除用户
sudo userdel -r alice
五、组账户管理命令
5.1 创建组:groupadd
语法:
bash
groupadd [选项] 组名
常用选项:
-g GID:指定 GID-r:创建系统组(GID<1000)-f:若组存在则静默退出(不报错)
✅ 案例:
bash
sudo groupadd -g 3000 project_team
sudo groupadd -r docker # 系统组
5.2 修改组:groupmod 与 gpasswd
➤ groupmod:修改组属性
常用选项:
-n 新名:改组名-g GID:改 GID
✅ 案例:
bash
sudo groupmod -n project_new -g 3001 project_team
➤ gpasswd:管理组成员与密码
常用选项:
-a 用户:添加用户到组(作为附加组)-d 用户:从组中删除用户-A 用户:设置组管理员-M 用户1,用户2:设置组成员列表(覆盖原有)- (无选项):设置组密码(不常用)
✅ 案例1:添加/删除成员
bash
sudo gpasswd -a bob project_team # 添加 bob
sudo gpasswd -d carol project_team # 删除 carol
✅ 案例2:设置组管理员
bash
sudo gpasswd -A alice project_team # alice 可管理此组(无需 root)
# alice 可执行:gpasswd -a user project_team
5.3 删除组:groupdel
语法:
bash
groupdel 组名
⚠️ 不能删除用户主组(需先改用户主组或删除用户)
✅ 案例:
bash
sudo groupdel project_team
❌ 错误示例:
bash
sudo groupdel developers
# 若 alice 主组是 developers,会报错:cannot remove the primary group of user 'alice'
✅ 正确做法:
bash
# 1. 先将用户主组改为其他组
sudo usermod -g users alice
# 2. 再删除组
sudo groupdel developers
5.4 切换组:newgrp
功能 :切换当前 Shell 的有效组(EGID),用于访问组权限文件。
语法:
bash
newgrp [组名]
✅ 案例:
bash
# 当前用户属于 project_team 组
touch /shared/project/file.txt
chmod 660 /shared/project/file.txt # 仅属主和属组可读写
chgrp project_team /shared/project/file.txt
# 若当前有效组不是 project_team,无法写入
echo "test" >> /shared/project/file.txt # Permission denied
# 切换有效组
newgrp project_team
echo "test" >> /shared/project/file.txt # 成功写入!
# 退出子 Shell(newgrp 启动新 Shell)
exit
📝 说明:
newgrp启动一个新 Shell,exit可返回原 Shell。- 若组有密码,需输入密码(极少使用)。
六、访问权限管理
6.1 查看权限:ls -l
权限格式 :-rwxr-xr--
- 第1位:文件类型(
-=文件,d=目录,l=链接) - 2-4位:属主权限(User)
- 5-7位:属组权限(Group)
- 8-10位:其他用户权限(Other)
✅ 示例:
bash
ls -l /home/alice/script.sh
# -rwxr-x--- 1 alice developers 120 Apr 1 10:00 script.sh
# 属主 alice:读+写+执行
# 属组 developers:读+执行
# 其他:无权限
6.2 修改权限:chmod
两种模式:
➤ 符号模式(推荐)
语法:
bash
chmod [ugoa][+-=][rwx] 文件...
-
u=属主,g=属组,o=其他,a=所有 -
+增加,-移除,=设置 -
r=读,w=写,x=执行
✅ 案例:
bash
chmod u+x script.sh # 给属主加执行权限
chmod g-w,o-rwx script.sh # 移除属组写权限,移除其他所有权限
chmod a=r script.sh # 所有人只有读权限
➤ 数字模式(八进制)
权限值:
-
r=4,w=2,x=1 -
三位数:属主、属组、其他






✅ 案例:
bash
chmod 755 script.sh # rwxr-xr-x
chmod 640 file.txt # rw-r-----
chmod 770 dir/ # rwxrwx---(目录需 x 才能进入)
✅ 递归修改目录权限:
bash
chmod -R 755 /var/www/html/ # -R:递归应用到所有子文件/目录
6.3 管理默认权限:umask
功能 :设置新创建文件/目录的默认权限掩码。
- 文件默认最大权限:666(rw-rw-rw-)
- 目录默认最大权限:777(rwxrwxrwx)
- 实际权限 = 最大权限 - umask
✅ 查看当前 umask:
bash
umask
# 输出:0022
✅ 计算默认权限:
- 文件:666 - 022 = 644(rw-r--r--)
- 目录:777 - 022 = 755(rwxr-xr-x)
✅ 设置 umask:
bash
umask 027 # 仅当前 Shell 有效
# 文件:666-027=640 (rw-r-----)
# 目录:777-027=750 (rwxr-x---)
# 永久设置:写入 ~/.bashrc 或 /etc/profile
echo "umask 027" >> ~/.bashrc
source ~/.bashrc
✅ 验证:
bash
touch testfile
mkdir testdir
ls -l testfile testdir
# -rw-r----- 1 user group ... testfile
# drwxr-x--- 2 user group ... testdir
七、综合案例:用户和组管理综合实践
🎯 案例概述
场景 :
公司新成立"Web开发部",需创建团队账户体系,并设置安全权限:
- 创建组
webdev和dba - 创建用户
alice(前端)、bob(后端)、carol(DBA) - 设置密码策略:90天过期,提前7天警告
- 配置家目录模板,包含欢迎文件和基础配置
- 创建共享目录
/shared/webdev,仅webdev组可读写 - 创建
/shared/dba,仅dba组可访问 - 设置默认 umask 为 007(组内共享,其他无权限)
🧩 案例详解(带详细注释的完整脚本)
bash
#!/bin/bash
# 文件名:setup_web_team.sh
# 功能:自动化创建 Web 开发团队用户、组、权限体系
echo "🚀 开始部署 Web 开发团队环境..."
echo "=================================="
# === 1. 创建组 ===
echo "🔧 正在创建用户组..."
sudo groupadd webdev
sudo groupadd dba
echo "✅ 组 'webdev' 和 'dba' 创建完成"
# === 2. 配置家目录模板 ===
echo "📂 配置 /etc/skel 模板..."
cat << 'EOF' | sudo tee /etc/skel/README.txt > /dev/null
欢迎加入 Web 开发团队!
请遵守:
- 代码提交前需测试
- 敏感信息勿上传
- 定期修改密码
技术支持:it-support@company.com
EOF
echo '# Web 开发环境别名' | sudo tee -a /etc/skel/.bashrc > /dev/null
echo 'alias ll="ls -alF"' | sudo tee -a /etc/skel/.bashrc > /dev/null
echo 'alias gs="git status"' | sudo tee -a /etc/skel/.bashrc > /dev/null
echo "✅ 家目录模板配置完成"
# === 3. 创建用户并分配组 ===
echo "👤 正在创建用户账户..."
# Alice - 前端开发,主组 webdev,附加组 dba(可访问DB文档)
sudo useradd -c "Frontend Developer" -g webdev -G dba -m -s /bin/bash alice
echo "alice:DevPass123!" | sudo chpasswd # 批量设置密码(仅测试用!)
sudo chage -M 90 -W 7 alice # 密码90天过期,提前7天警告
# Bob - 后端开发,主组 webdev
sudo useradd -c "Backend Developer" -g webdev -m -s /bin/bash bob
echo "bob:DevPass123!" | sudo chpasswd
sudo chage -M 90 -W 7 bob
# Carol - DBA,主组 dba,附加组 webdev(可部署脚本)
sudo useradd -c "Database Administrator" -g dba -G webdev -m -s /bin/bash carol
echo "carol:DBAPass123!" | sudo chpasswd
sudo chage -M 90 -W 7 carol
echo "✅ 用户 alice, bob, carol 创建完成"
# === 4. 创建共享目录并设置权限 ===
echo "📁 创建共享目录并配置权限..."
# Web 开发共享目录
sudo mkdir -p /shared/webdev
sudo chgrp webdev /shared/webdev
sudo chmod 2770 /shared/webdev # 2=setgid, 770=rwxrwx---
# setgid:新文件自动继承组为 webdev
# DBA 共享目录
sudo mkdir -p /shared/dba
sudo chgrp dba /shared/dba
sudo chmod 2770 /shared/dba
echo "✅ 共享目录 /shared/webdev 和 /shared/dba 创建完成"
# === 5. 设置全局 umask(影响新用户)===
echo "⚙️ 设置默认 umask 为 007..."
# 修改全局配置(影响所有新登录用户)
echo "umask 007" | sudo tee -a /etc/profile > /dev/null
echo "umask 007" | sudo tee -a /etc/bashrc > /dev/null
# 为现有用户设置(需重新登录生效)
echo "umask 007" | sudo tee -a /home/alice/.bashrc > /dev/null
echo "umask 007" | sudo tee -a /home/bob/.bashrc > /dev/null
echo "umask 007" | sudo tee -a /home/carol/.bashrc > /dev/null
echo "✅ umask 007 已设置(新文件权限:660,新目录:770)"
# === 6. 验证配置 ===
echo
echo "🔍 正在验证配置..."
echo "----------------------------------"
echo "👥 用户信息:"
id alice
id bob
id carol
echo
echo "📁 共享目录权限:"
ls -ld /shared/webdev /shared/dba
echo
echo "🛡️ 密码策略:"
sudo chage -l alice | grep -E "(Last|Maximum|Warning)"
echo
echo "🎉 部署完成!"
echo "💡 提示:"
echo " - 用户首次登录需修改密码:passwd"
echo " - 共享目录路径:/shared/webdev, /shared/dba"
echo " - umask 007 生效需重新登录 Shell"
echo "=================================="
💡 使用方法:
bash
chmod +x setup_web_team.sh
sudo ./setup_web_team.sh
📌 安全提示:
- 脚本中使用
echo "user:pass" | chpasswd仅为演示,生产环境应强制用户首次登录修改密码:
bash
sudo passwd -e alice # 强制 alice 下次登录改密码
🧪 扩展综合案例:自动化离职员工账户清理脚本
bash
#!/bin/bash
# 文件名:offboard_user.sh
# 功能:安全清理离职员工账户
if [ $# -ne 1 ]; then
echo "用法: $0 <用户名>"
exit 1
fi
USER=$1
# 1. 检查用户是否存在
if ! id "$USER" &>/dev/null; then
echo "❌ 用户 $USER 不存在"
exit 1
fi
echo "🔄 开始清理用户: $USER"
# 2. 锁定账户
sudo usermod -L "$USER"
echo "🔒 账户已锁定"
# 3. 终止用户进程
sudo pkill -u "$USER" 2>/dev/null && echo "🛑 用户进程已终止"
# 4. 备份家目录
BACKUP_DIR="/backup/user_offboard/$(date +%Y%m%d)"
sudo mkdir -p "$BACKUP_DIR"
sudo tar -czf "$BACKUP_DIR/${USER}_home.tar.gz" "/home/$USER" 2>/dev/null && echo "📦 家目录已备份: $BACKUP_DIR/${USER}_home.tar.gz"
# 5. 备份邮件池
sudo cp -f "/var/spool/mail/$USER" "$BACKUP_DIR/${USER}_mail" 2>/dev/null && echo "📧 邮件池已备份"
# 6. 从所有组中移除用户(除主组)
for GROUP in $(groups "$USER" | cut -d: -f2 | tr ' ' '\n' | grep -v "^$(id -gn $USER)$"); do
sudo gpasswd -d "$USER" "$GROUP" 2>/dev/null && echo "➖ 从组 $GROUP 移除"
done
# 7. 删除用户(保留主组)
sudo userdel "$USER" && echo "🗑️ 用户 $USER 已删除(家目录保留)"
# 8. 可选:删除家目录(确认备份后)
# sudo rm -rf "/home/$USER"
echo "✅ 用户 $USER 清理完成!"
echo "💾 备份位置: $BACKUP_DIR"
✅ 使用:
bash
sudo ./offboard_user.sh alice
✅ 学习建议与最佳实践
- 最小权限原则:用户只分配必要权限。
- 定期审计 :
awk -F: '$3 >= 1000 {print $1}' /etc/passwd列出所有普通用户。 - 密码策略 :通过
/etc/login.defs和chage强制定期修改。 - 组管理优先:通过组分配权限,而非直接修改文件属主。
- setgid 目录 :共享目录设置
chmod g+s,确保新文件继承组。 - umask 合理设置 :开发团队建议
002或007,生产环境027或077。 - 离职流程标准化:锁定 → 备份 → 清理,避免数据丢失。
📚 附录:用户组管理命令速查表
| 功能 | 命令示例 |
|---|---|
| 创建用户 | sudo useradd -m -s /bin/bash alice |
| 设置密码 | sudo passwd alice |
| 强制改密 | sudo passwd -e alice |
| 添加附加组 | sudo usermod -aG sudo alice |
| 查看密码策略 | sudo chage -l alice |
| 创建组 | sudo groupadd developers |
| 添加组成员 | sudo gpasswd -a alice developers |
| 切换有效组 | newgrp developers |
| 修改文件权限 | chmod 750 script.sh 或 chmod g+w script.sh |
| 查看默认权限掩码 | umask |
| 设置 umask | umask 007 |
这份文档覆盖了 CentOS Stream 9 用户和组管理的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。