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

CentOS Stream 9 用户和组管理 —语法详解与实战案例


一、概述

Linux 是多用户操作系统,用户和组管理是系统安全与权限控制的核心。

  • 用户账户(User Account):标识系统使用者,每个用户有唯一 UID。
  • 组账户(Group Account):用于组织用户,简化权限管理,每个组有唯一 GID。
  • 权限模型:基于用户/组分配文件/目录的读、写、执行权限。

✅ 查看当前用户和组:

whoami          # 当前用户名
id              # 显示 UID、GID 和所属组
groups          # 显示当前用户所属的所有组

二、用户账户与组账户

2.1 用户账户类型

类型UID 范围说明
超级用户0root,拥有最高权限
系统用户1–999用于运行服务(如 apache、mysql)
普通用户1000+人工创建,用于登录和操作

✅ 查看用户 UID 范围定义:

grep UID /etc/login.defs
# 输出示例:
# UID_MIN                 1000
# UID_MAX                 60000

2.2 组账户类型

类型GID 范围说明
系统组1–999服务或系统功能使用
普通组1000+用户组,用于权限管理

✅ 查看组 GID 范围:

grep GID /etc/login.defs

三、账户配置文件详解

3.1 /etc/passwd —— 用户基本信息

格式(7字段,冒号分隔):

用户名:密码占位符:UID:GID:描述信息:家目录:默认Shell

✅ 示例:

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字段):

用户名:加密密码:最后修改日期:最小天数:最大天数:警告天数:不活动天数:失效日期:保留

✅ 示例:

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天警告

✅ 查看密码策略(推荐方式):

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:组成员列表(逗号分隔)

✅ 示例:

cat /etc/group | grep developers
# 输出:
# developers:x:1002:bob,carol

说明:

  • x:组密码在 /etc/gshadow
  • 1002:GID
  • bob,carol:附加组成员(不包括主组用户)

3.4 /etc/gshadow —— 组密码与管理员(仅 root 可读)

格式

组名:加密密码:管理员列表:成员列表

✅ 示例:

sudo cat /etc/gshadow | grep developers
# 输出:
# developers:$6$Xyz...Abc1::bob,carol

说明:

  • 管理员可使用 gpasswd 管理组成员
  • 通常为空,表示无管理员

3.5 /etc/login.defs —— 用户/组创建默认策略

控制 UID/GID 范围、密码过期策略、邮箱目录等。

✅ 关键配置项:

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、桌面文件等。

✅ 示例:为所有新用户预置欢迎文件

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 命令默认参数

✅ 查看默认配置:

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 的软链接,功能相同。

语法

useradd [选项] 用户名

常用选项

  • -u UID:指定 UID
  • -g GID/组名:指定主组
  • -G 组1,组2:指定附加组
  • -d /path:指定家目录
  • -s /shell:指定登录 Shell
  • -c "描述":添加描述信息
  • -m:强制创建家目录(默认已开启)
  • -M:不创建家目录

✅ 案例1:创建普通用户

sudo useradd -c "Project Manager" -s /bin/bash alice
sudo passwd alice   # 设置密码(见4.2)

✅ 案例2:指定 UID、GID、附加组

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:不创建家目录(系统用户)

sudo useradd -r -s /sbin/nologin -c "Web Server" apache
# -r:创建系统用户(UID<1000)
# -s /sbin/nologin:禁止登录

4.2 修改用户:passwdusermodchage

passwd:修改密码

语法

passwd [用户名]   # root 可改他人密码

✅ 案例:

sudo passwd alice
# 输入新密码两次

✅ 强制用户下次登录修改密码:

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:追加附加组

sudo usermod -aG sudo,adm alice   # 将 alice 加入 sudo 和 adm 组(不覆盖原有组)

✅ 案例2:改用户名和家目录

sudo usermod -l alice_new -d /home/alice_new -m alice
# -m:移动原家目录内容到新位置

✅ 案例3:锁定/解锁账户

sudo usermod -L alice    # 锁定(/etc/shadow 密码前加 !)
sudo usermod -U alice    # 解锁
chage:管理密码过期策略

常用选项

  • -l:查看策略
  • -E YYYY-MM-DD:账户过期日
  • -M 天数:密码最大有效期
  • -m 天数:密码最短有效期
  • -W 天数:过期前警告天数
  • -I 天数:密码过期后宽限天数

✅ 案例:设置密码90天过期,提前7天警告

sudo chage -M 90 -m 7 -W 7 alice
sudo chage -l alice   # 验证

✅ 案例:设置账户2025-12-31过期

sudo chage -E 2025-12-31 alice

4.3 删除用户:userdel

语法

userdel [选项] 用户名

常用选项

  • -r同时删除家目录和邮件池
  • (无选项):仅删除用户,保留家目录

⚠️ 生产环境慎用 -r,建议先备份!

✅ 案例:

sudo userdel -r alice   # 删除用户及家目录

✅ 安全删除流程:

# 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

语法

groupadd [选项] 组名

常用选项

  • -g GID:指定 GID
  • -r:创建系统组(GID<1000)
  • -f:若组存在则静默退出(不报错)

✅ 案例:

sudo groupadd -g 3000 project_team
sudo groupadd -r docker   # 系统组

5.2 修改组:groupmodgpasswd

groupmod:修改组属性

常用选项

  • -n 新名:改组名
  • -g GID:改 GID

✅ 案例:

sudo groupmod -n project_new -g 3001 project_team
gpasswd:管理组成员与密码

常用选项

  • -a 用户:添加用户到组(作为附加组)
  • -d 用户:从组中删除用户
  • -A 用户:设置组管理员
  • -M 用户1,用户2设置组成员列表(覆盖原有)
  • (无选项):设置组密码(不常用)

✅ 案例1:添加/删除成员

sudo gpasswd -a bob project_team   # 添加 bob
sudo gpasswd -d carol project_team # 删除 carol

✅ 案例2:设置组管理员

sudo gpasswd -A alice project_team  # alice 可管理此组(无需 root)
# alice 可执行:gpasswd -a user project_team

5.3 删除组:groupdel

语法

groupdel 组名

⚠️ 不能删除用户主组(需先改用户主组或删除用户)

✅ 案例:

sudo groupdel project_team

❌ 错误示例:

sudo groupdel developers
# 若 alice 主组是 developers,会报错:cannot remove the primary group of user 'alice'

✅ 正确做法:

# 1. 先将用户主组改为其他组
sudo usermod -g users alice
# 2. 再删除组
sudo groupdel developers

5.4 切换组:newgrp

功能:切换当前 Shell 的有效组(EGID),用于访问组权限文件。

语法

newgrp [组名]

✅ 案例:

# 当前用户属于 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)

✅ 示例:

ls -l /home/alice/script.sh
# -rwxr-x--- 1 alice developers 120 Apr 1 10:00 script.sh
# 属主 alice:读+写+执行
# 属组 developers:读+执行
# 其他:无权限

6.2 修改权限:chmod

两种模式

➤ 符号模式(推荐)

语法

chmod [ugoa][+-=][rwx] 文件...
  • u=属主,g=属组,o=其他,a=所有

  • +增加,-移除,=设置

  • r=读,w=写,x=执行

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

✅ 案例:

chmod u+x script.sh        # 给属主加执行权限
chmod g-w,o-rwx script.sh  # 移除属组写权限,移除其他所有权限
chmod a=r script.sh        # 所有人只有读权限
➤ 数字模式(八进制)

权限值

  • r=4, w=2, x=1

  • 三位数:属主、属组、其他

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

✅ 案例:

chmod 755 script.sh   # rwxr-xr-x
chmod 640 file.txt    # rw-r-----
chmod 770 dir/        # rwxrwx---(目录需 x 才能进入)

✅ 递归修改目录权限:

chmod -R 755 /var/www/html/   # -R:递归应用到所有子文件/目录

6.3 管理默认权限:umask

功能:设置新创建文件/目录的默认权限掩码

  • 文件默认最大权限:666(rw-rw-rw-)
  • 目录默认最大权限:777(rwxrwxrwx)
  • 实际权限 = 最大权限 - umask

✅ 查看当前 umask:

umask
# 输出:0022

✅ 计算默认权限:

  • 文件:666 - 022 = 644(rw-r–r–)
  • 目录:777 - 022 = 755(rwxr-xr-x)

✅ 设置 umask:

umask 027   # 仅当前 Shell 有效
# 文件:666-027=640 (rw-r-----)
# 目录:777-027=750 (rwxr-x---)
# 永久设置:写入 ~/.bashrc 或 /etc/profile
echo "umask 027" >> ~/.bashrc
source ~/.bashrc

✅ 验证:

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(组内共享,其他无权限)

案例详解(带详细注释的完整脚本)

#!/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 "=================================="

使用方法:

chmod +x setup_web_team.sh
sudo ./setup_web_team.sh

安全提示:

  • 脚本中使用 echo "user:pass" | chpasswd 仅为演示,生产环境应强制用户首次登录修改密码
sudo passwd -e alice   # 强制 alice 下次登录改密码

扩展综合案例:自动化离职员工账户清理脚本

#!/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"

✅ 使用:

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
设置 umaskumask 007

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

posted @ 2026-01-03 11:01  clnchanpin  阅读(31)  评论(0)    收藏  举报