CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 用户和组管理 —语法详解与实战案例(6)

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/shadow
  • 1001: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/gshadow
  • 1002:GID
  • bob,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 创建用户:useraddadduser

⚠️ 注意: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 修改用户:passwdusermodchage

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 修改组:groupmodgpasswd

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开发部",需创建团队账户体系,并设置安全权限:

  1. 创建组 webdevdba
  2. 创建用户 alice(前端)、bob(后端)、carol(DBA)
  3. 设置密码策略:90天过期,提前7天警告
  4. 配置家目录模板,包含欢迎文件和基础配置
  5. 创建共享目录 /shared/webdev,仅 webdev 组可读写
  6. 创建 /shared/dba,仅 dba 组可访问
  7. 设置默认 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.defschage 强制定期修改。
  • 组管理优先:通过组分配权限,而非直接修改文件属主。
  • setgid 目录 :共享目录设置 chmod g+s,确保新文件继承组。
  • umask 合理设置 :开发团队建议 002007,生产环境 027077
  • 离职流程标准化:锁定 → 备份 → 清理,避免数据丢失。

📚 附录:用户组管理命令速查表

功能 命令示例
创建用户 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.shchmod g+w script.sh
查看默认权限掩码 umask
设置 umask umask 007

这份文档覆盖了 CentOS Stream 9 用户和组管理的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。

相关推荐
松涛和鸣1 小时前
25、数据结构:树与二叉树的概念、特性及递归实现
linux·开发语言·网络·数据结构·算法
runfarther2 小时前
mysql_mcp_server部署及应用案例
linux·mysql·centos·mcp
爱吃番茄鼠骗2 小时前
Linux操作系统———信号量
linux
灰勒塔德2 小时前
jetson orin nano super开发指南
linux·服务器·python
---学无止境---2 小时前
TSS(Task-State Segment)任务状态段详解
linux
雨落在了我的手上2 小时前
知识扩展:进制的详细介绍
c语言·学习
im_AMBER2 小时前
Leetcode 67 长度为 K 子数组中的最大和 | 可获得的最大点数
数据结构·笔记·学习·算法·leetcode
木里先森2 小时前
解决报错:/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·python
Slaughter信仰2 小时前
图解大模型_生成式AI原理与实战学习笔记(第四章)
人工智能·笔记·学习