Ubuntu 22.04 用户和组管理指南
1. 用户账户基础
1.1 Linux用户账户
Linux系统是一个多用户操作系统,通过用户账户机制实现系统资源的安全隔离和访问控制。
1.1.1 用户账户的基本概念
- 用户标识(UID):系统内部唯一标识用户的数字ID
- 用户组(GID):用户所属的主要组标识
- 家目录(Home Directory):用户登录后的默认工作目录
- Shell:用户登录后执行的命令解释器
1.1.2 用户账户的分类
-
超级用户(Root)
- UID: 0
- 具有系统最高权限
- 可以执行所有系统操作
-
系统用户
- UID: 1-999(Ubuntu 22.04)
- 用于运行系统服务和程序
- 通常没有登录权限
-
普通用户
- UID: 1000+(Ubuntu 22.04)
- 普通用户使用的账户
- 具有有限的系统权限
bash
# 查看当前用户信息
whoami # 显示当前用户名
id # 显示用户ID和组ID
id username # 显示指定用户的信息
# 查看系统用户分类
cat /etc/passwd | awk -F: '$3 == 0 {print "超级用户:", $1}'
cat /etc/passwd | awk -F: '$3 >= 1 && $3 <= 999 {print "系统用户:", $1}'
cat /etc/passwd | awk -F: '$3 >= 1000 {print "普通用户:", $1}'
1.2 Ubuntu用户账户
1.2.1 Ubuntu用户管理的特点
Ubuntu作为Debian系Linux发行版,具有以下用户管理特点:
-
用户ID范围:
- 系统用户:1-999
- 普通用户:1000-65535
-
默认Shell:/bin/bash(大多数情况下)
-
家目录位置:/home/username
-
用户组自动创建:adduser命令会自动创建同名家目录组
1.2.2 Sudo权限管理
Ubuntu使用sudo机制管理超级用户权限:
bash
# 查看sudo组权限
grep sudo /etc/group
# 查看sudoers配置
sudo visudo
# 或者
sudo cat /etc/sudoers | grep sudo
# 查看当前用户的sudo权限
sudo -l
1.3 用户配置文件
Linux系统中用户账户信息存储在多个配置文件中,这些文件协同工作提供完整的用户管理功能。
1.3.1 /etc/passwd文件
/etc/passwd文件是用户信息的主要配置文件,存储用户的基本信息。
文件结构:
用户名:密码占位:UID:GID:注释:家目录:Shell
字段详细说明:
- 用户名(Username):用户登录时使用的名称
- 密码占位(Password):由于安全考虑,实际密码存储在/etc/shadow文件中,此处显示"x"
- UID(User ID):用户唯一标识符
- GID(Group ID):用户主要组的ID
- 注释(Comment):用户描述信息,通常包含全名、联系方式等
- 家目录(Home Directory):用户登录后的默认工作目录
- Shell:用户默认的命令解释器
bash
# 查看passwd文件内容
cat /etc/passwd
# 查看特定用户信息
grep username /etc/passwd
# 查看root用户信息
grep root /etc/passwd
# 格式化显示用户信息
getent passwd username # 获取用户条目
getent group groupname # 获取组条目
# 查看UID范围分布
awk -F: '{print $3}' /etc/passwd | sort -n | uniq -c
实际示例:
bash
# 查看passwd文件典型条目
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
testuser:x:1001:1001:Test User,,,:/home/testuser:/bin/bash
1.3.2 /etc/shadow文件
/etc/shadow文件存储用户密码和密码策略信息,只有root用户可以读取。
文件结构:
用户名:加密密码:最后修改时间:最小修改间隔:最大有效期限:警告期:宽限期:失效日期:保留
字段详细说明:
- 用户名(Username):与/etc/passwd中的用户名对应
- 加密密码(Encrypted Password):SHA512加密的密码哈希值
- 最后修改时间(Last Password Change):距离1970年1月1日的天数
- 最小修改间隔(Minimum Age):密码修改的最小间隔天数
- 最大有效期限(Maximum Age):密码最大有效天数
- 警告期(Warning Period):密码到期前的警告天数
- 宽限期(Grace Period):密码到期后的宽限天数
- 失效日期(Account Expiration):账户失效日期(距离1970年1月1日的天数)
- 保留(Reserved):保留字段,暂时未使用
bash
# 查看shadow文件内容(需要root权限)
sudo cat /etc/shadow
# 查看特定用户shadow条目
sudo grep username /etc/shadow
# 格式化显示shadow信息
sudo getent shadow username
# 转换日期格式(天数转日期)
date -d "1970-01-01 + 15775 days" +"%Y-%m-%d"
密码状态特殊值:
!!:未设置密码*:密码被禁用- 空字符串:不需要密码
实际示例:
bash
# 查看shadow文件典型条目
root:$6$rounds=656000$YQKt8VxjVa2vVca5$Fh7e2gBt5u6Q9N5W.X5F2e5hN5l8e5R6t7Y8u9I0o9P6a5S4d3F2g1H7j9K0l:$6$...:19000:0:99999:7:::
daemon:*:19000:0:99999:7:::
bin:*:19000:0:99999:7:::
sys:*:19000:0:99999:7:::
www-data:*:19000:0:99999:7:::
ubuntu:$6$rounds=656000$YQKt8VxjVa2vVca5$Fh7e2gBt5u6Q9N5W...:19000:0:99999:7:::
testuser:$6$...:19750:0:99999:7:::
安全注意事项:
bash
# 检查shadow文件权限
ls -l /etc/shadow
# 验证shadow文件完整性
sudo pwck
# 检查密码策略
sudo pwconv
sudo pwunconv
2. 用户账户管理命令
2.1 新建用户账户命令
2.1.1 useradd命令
useradd是Linux系统原生的用户创建命令,提供底层的用户创建功能。
基本语法:
bash
useradd [选项] 用户名
常用参数:
-c, --comment COMMENT:添加注释信息-d, --home HOME_DIR:指定用户家目录-e, --expiredate EXPIRE_DATE:设置账户过期日期-f, --inactive INACTIVE:设置密码过期后账户禁用天数-g, --gid GROUP:指定主组GID或组名-G, --groups GROUP1[,GROUP2,...]:指定附加组-m, --create-home:创建用户家目录-M:不创建用户家目录-r, --system:创建系统用户-s, --shell SHELL:指定登录Shell-u, --uid UID:指定用户UID
使用示例:
bash
# 1. 创建基本用户账户
sudo useradd newuser
# 2. 创建用户并指定详细信息
sudo useradd -c "张三" -d /home/zhangsan -s /bin/bash -m zhangsan
# 3. 创建用户指定UID和主组
sudo useradd -u 1005 -g developers -m -s /bin/bash developer1
# 4. 创建用户并添加到多个附加组
sudo useradd -G sudo,developers,webadmin -m -s /bin/bash webdev
# 5. 创建系统用户(无登录权限)
sudo useradd -r -s /bin/false serviceuser
# 6. 创建用户指定过期日期
sudo useradd -e 2025-12-31 -m tempuser
# 7. 创建用户设置密码过期策略
sudo useradd -f 30 -e 2025-06-30 -m businessuser
# 8. 批量创建用户
for i in {1..5}; do
sudo useradd -m -s /bin/bash user$i
done
配置文件影响:
useradd命令的行为受以下配置文件影响:
bash
# 查看useradd默认配置
cat /etc/default/useradd
# 查看用户创建模板
ls -la /etc/skel/
# 编辑默认配置
sudo vi /etc/default/useradd
2.1.2 adduser命令
adduser是Debian/Ubuntu系统提供的交互式用户创建命令,它是useradd的包装脚本。
基本语法:
bash
adduser [选项] 用户名
特点:
- 交互式界面,用户友好
- 自动创建用户家目录
- 自动创建与用户名同名的组
- 设置合理的默认权限
使用示例:
bash
# 1. 交互式创建用户(推荐方式)
sudo adduser username
# 2. 创建系统用户
sudo adduser --system sysuser
# 3. 不创建家目录
sudo adduser --no-create-home user
# 4. 指定家目录
sudo adduser --home /custom/home user
# 5. 指定shell
sudo adduser --shell /bin/zsh user
# 6. 创建用户并添加到组
sudo adduser --ingroup sudo user
# 7. 禁用登录
sudo adduser --disabled-login user
# 8. 设置密码过期时间
sudo adduser --expire 2025-12-31 user
交互式创建过程示例:
bash
$ sudo adduser testuser
正在添加用户 'testuser'...
正在添加新组 'testuser' (1001)...
正在添加新用户 'testuser' (1001) 并将其加入组 'testuser'...
创建主目录 '/home/testuser'...
正在从 '/etc/skel' 复制文件...
请为这个用户输入新的密码,或者按回车键使用默认密码(无密码):
请重新输入密码:
passwd: 已成功更新密码
更改 testuser 的用户信息。
请输入新值,或按回车键接受默认值。
全名 []: Test User
房间号码 []: 101
工作电话 []: 123-456-7890
家庭电话 []: 098-765-4321
其它 []: This is a test account
这些信息是否正确?[Y/n] y
2.1.3 useradd与adduser的区别
| 特性 | useradd | adduser |
|---|---|---|
| 适用系统 | 所有Linux发行版 | Debian系发行版 |
| 交互性 | 非交互式 | 交互式 |
| 默认创建家目录 | 否(需-m参数) | 是 |
| 自动创建组 | 否 | 是(同名组) |
| 参数复杂度 | 高(参数丰富) | 低(默认值合理) |
| 自动化程度 | 高(适合脚本) | 中(适合手动操作) |
| 配置依赖 | /etc/login.defs | 交互式配置 |
bash
# 使用useradd创建用户(脚本化)
sudo useradd -m -s /bin/bash -c "Web Developer" -G www-data webdev
# 使用adduser创建用户(交互式)
sudo adduser webdev
# 查看创建结果
id webdev
getent passwd webdev
getent group webdev
ls -la /home/ | grep webdev
2.2 修改用户账户命令
2.2.1 passwd命令
passwd命令用于管理用户密码,是最常用的用户管理命令之一。
基本语法:
bash
passwd [选项] [用户名]
常用参数:
-l, --lock:锁定用户账户-u, --unlock:解锁用户账户-d, --delete:删除用户密码-e, --expire:强制用户下次登录时修改密码-n, --mindays MIN_DAYS:设置密码最小修改间隔-x, --maxdays MAX_DAYS:设置密码最大有效天数-w, --warndays WARN_DAYS:设置密码到期警告天数-i, --inactive INACTIVE:设置密码到期后禁用天数-S, --status:显示密码状态
使用示例:
bash
# 1. 修改当前用户密码
passwd
# 2. 修改指定用户密码(root权限)
sudo passwd username
# 3. 锁定用户账户
sudo passwd -l username
# 4. 解锁用户账户
sudo passwd -u username
# 5. 删除用户密码(清空密码)
sudo passwd -d username
# 6. 强制用户下次登录时修改密码
sudo passwd -e username
# 7. 设置密码策略
sudo passwd -n 7 -x 90 -w 14 -i 30 username
# 最小间隔7天,最大有效期90天,警告14天,宽限30天
# 8. 查看密码状态
sudo passwd -S username
# 9. 设置密码永不过期
sudo passwd -x -1 username
# 10. 查看所有用户密码状态
sudo passwd -Sa
密码状态说明:
bash
# passwd -S 输出格式
username PS 2023-01-15 0 99999 7 -1
# 格式:用户名 状态 最后修改日期 最小天数 最大天数 警告天数 宽限天数
# 状态含义:
# P:密码已设置且可以使用
# NP:没有密码
# L:账户被锁定
批量密码管理:
bash
# 批量为用户设置密码
for user in user1 user2 user3; do
echo "$user:TempPass123" | sudo chpasswd
done
# 生成随机密码并设置
for user in user1 user2 user3; do
password=$(openssl rand -base64 12)
echo "$user:$password" | sudo chpasswd
echo "User: $user, Password: $password"
done
2.2.2 usermod命令
usermod命令用于修改已存在用户的属性和配置。
基本语法:
bash
usermod [选项] 用户名
常用参数:
-a, --append:将用户添加到附加组(必须与-G一起使用)-c, --comment COMMENT:修改注释信息-d, --home HOME_DIR:修改用户家目录-e, --expiredate EXPIRE_DATE:设置账户过期日期-f, --inactive INACTIVE:设置密码过期后禁用天数-g, --gid GROUP:修改主组-G, --groups GROUP1[,GROUP2,...]:设置附加组(覆盖原设置)-l, --login NEW_LOGIN:修改用户名-L:锁定用户账户-m, --move-home:移动家目录到新位置-s, --shell SHELL:修改登录Shell-u, --uid UID:修改用户UID-U:解锁用户账户
使用示例:
bash
# 1. 修改用户注释信息
sudo usermod -c "Web开发工程师" username
# 2. 修改用户家目录
sudo usermod -d /new/home/dir username
# 3. 移动家目录到新位置
sudo usermod -d /new/home/dir -m username
# 4. 修改用户主组
sudo usermod -g developers username
# 5. 将用户添加到附加组
sudo usermod -aG sudo username
sudo usermod -aG docker,www-data username
# 6. 设置用户附加组(覆盖原设置)
sudo usermod -G developers,webadmin username
# 7. 修改用户shell
sudo usermod -s /bin/zsh username
# 8. 修改用户UID
sudo usermod -u 1005 username
# 9. 修改用户名
sudo usermod -l newname oldname
# 10. 锁定用户账户
sudo usermod -L username
# 11. 解锁用户账户
sudo usermod -U username
# 12. 设置账户过期日期
sudo usermod -e 2025-12-31 username
# 13. 设置密码过期禁用天数
sudo usermod -f 30 username
# 14. 综合修改用户属性
sudo usermod -c "开发工程师" -G sudo,developers -s /bin/bash username
安全注意事项:
bash
# 修改用户前先备份当前配置
cp /etc/passwd /etc/passwd.backup
cp /etc/shadow /etc/shadow.backup
cp /etc/group /etc/group.backup
# 修改后验证用户信息
id username
getent passwd username
getent group username
# 检查用户登录状态
w username
last username
2.2.3 chage命令
chage命令专门用于管理用户密码老化策略,是系统安全管理的重要工具。
基本语法:
bash
chage [选项] 用户名
常用参数:
-l, --list:显示密码老化信息-d, --lastday LAST_DAY:设置最后密码修改日期-m, --mindays MIN_DAYS:设置最小密码修改间隔-M, --maxdays MAX_DAYS:设置最大密码有效天数-W, --warndays WARN_DAYS:设置密码到期警告天数-I, --inactive INACTIVE:设置密码过期后禁用天数-E, --expiredate EXPIRE_DATE:设置账户过期日期-h, --help:显示帮助信息
使用示例:
bash
# 1. 查看用户密码策略
sudo chage -l username
# 2. 设置密码永不过期
sudo chage -M -1 username
# 3. 设置密码有效期为90天
sudo chage -M 90 username
# 4. 设置密码最小修改间隔为7天
sudo chage -m 7 username
# 5. 设置密码到期前警告14天
sudo chage -W 14 username
# 6. 设置密码过期后宽限30天
sudo chage -I 30 username
# 7. 设置密码最后修改日期
sudo chage -d 2025-01-15 username
# 8. 设置账户过期日期
sudo chage -E 2025-12-31 username
# 9. 强制用户下次登录时修改密码
sudo chage -d 0 username
# 10. 综合设置密码策略
sudo chage -m 3 -M 90 -W 14 -I 30 username
# 11. 查看所有用户密码策略
for user in $(cut -d: -f1 /etc/passwd | grep -v "^#"); do
echo "=== $user ==="
sudo chage -l $user | head -1
done
# 12. 重置密码策略为默认值
sudo chage -m 0 -M 99999 -W 7 -I -1 username
密码策略查看示例:
bash
$ sudo chage -l username
用户名: username
密码最近一次设置时间: 1月 15, 2025
密码最后修改时间: 1月 15, 2025
密码过期时间: 4月 15, 2025
密码过期后禁用天数: 30
密码最低使用天数: 7
密码最大使用天数: 90
密码到期前警告天数: 14
账户过期时间: 永不过期
批量密码策略管理:
bash
# 为开发组用户设置严格密码策略
for user in dev1 dev2 dev3; do
sudo chage -m 7 -M 60 -W 14 -I 15 $user
done
# 为管理员用户设置宽松策略
for user in admin1 admin2; do
sudo chage -M -1 $user
done
# 查看策略生效情况
for user in $(groups dev1 | cut -d: -f2 | tr ' ' '\n' | sort | uniq); do
sudo chage -l $user | grep "密码最大使用天数"
done
安全最佳实践:
bash
# 1. 设置合理的密码策略
# 普通用户:60天有效期,7天最小间隔,14天警告,15天宽限
sudo chage -m 7 -M 60 -W 14 -I 15 username
# 2. 定期审计密码策略
sudo chage -l username | grep -E "密码最大使用天数|密码到期前警告天数"
# 3. 强制新用户首次登录修改密码
sudo chage -d 0 newuser
# 4. 查看即将过期的用户
awk -F: '$5 > 0 && $5 <= 7 {print $1}' /etc/shadow | while read user; do
echo "User $user password expires in $5 days"
sudo chage -l $user
done
2.3 删除用户账户命令
2.3.1 userdel命令
userdel命令用于从系统中删除用户账户。
基本语法:
bash
userdel [选项] 用户名
常用参数:
-f, --force:强制删除用户,即使该用户当前已登录-r, --remove:删除用户的同时删除用户家目录-Z:删除用户的SELinux用户映射
使用示例:
bash
# 1. 删除用户账户(不删除家目录)
sudo userdel username
# 2. 删除用户及其家目录
sudo userdel -r username
# 3. 强制删除已登录的用户
sudo userdel -f username
# 4. 删除用户并清理相关文件
sudo userdel -r -f username
# 5. 删除用户保留备份
sudo tar -czf /backup/user_$username.tar.gz /home/$username
sudo userdel -r username
# 6. 删除用户前备份重要数据
if [ -d /home/$username ]; then
sudo cp -r /home/$username /backup/
sudo find /home/$username -type f -exec ls -l {} \; > /backup/files_$username.list
fi
sudo userdel -r username
2.3.2 deluser命令
deluser是Ubuntu/Debian系统提供的删除用户的交互式命令。
基本语法:
bash
deluser [选项] 用户名
常用参数:
--remove-home:删除用户家目录--remove-all-files:删除用户所有文件--system:仅删除系统用户--group:删除用户的同时删除同名组--help:显示帮助信息
使用示例:
bash
# 1. 删除用户账户
sudo deluser username
# 2. 删除用户及其家目录
sudo deluser --remove-home username
# 3. 删除用户及所有相关文件
sudo deluser --remove-all-files username
# 4. 删除用户及同名组
sudo deluser --group username
# 5. 删除系统用户
sudo deluser --system sysuser
# 6. 删除用户保留邮件
sudo deluser --remove-home --keep-home username
删除前的安全检查:
bash
# 1. 检查用户是否在线
who | grep username
w | grep username
# 2. 查看用户进程
ps aux | grep username
# 3. 检查用户拥有的文件
find / -user username 2>/dev/null | head -20
# 4. 检查用户定时任务
sudo crontab -l -u username 2>/dev/null
# 5. 检查用户sudo权限
sudo -l -U username 2>/dev/null
# 6. 查看用户登录历史
last username
用户删除后的清理工作:
bash
# 1. 清理相关组信息
sudo groupdel username 2>/dev/null || true
# 2. 清理cron任务
sudo crontab -r -u username 2>/dev/null || true
# 3. 清理at任务
sudo atq | grep "username" | awk '{print $1}' | xargs -r sudo atrm 2>/dev/null || true
# 4. 清理打印任务
sudo lprm -U username - 2>/dev/null || true
# 5. 清理用户邮箱
sudo rm -rf /var/mail/username 2>/dev/null || true
sudo rm -rf /var/spool/mail/username 2>/dev/null || true
# 6. 清理临时文件
sudo find /tmp -user username -delete 2>/dev/null || true
sudo find /var/tmp -user username -delete 2>/dev/null || true
3. 组账户基础
3.1 组账户配置文件
Linux系统中的组账户信息存储在配置文件中,主要包括/etc/group和/etc/gshadow两个文件。
3.1.1 组账户的基本概念
- 主组(Primary Group):用户登录时的默认组,用户只能有一个主组
- 附加组(Supplementary Groups):用户可以属于多个附加组,用于获取额外权限
- 组ID(GID):系统内部唯一标识组的数字ID
- 组管理员:可以管理组内成员的用户
3.1.2 组账户的作用
- 权限管理:通过组权限控制文件访问
- 资源共享:允许多个用户共享资源和数据
- 权限委派:通过组管理员分配管理权限
- 安全隔离:不同组用户之间权限隔离
bash
# 查看用户所属的所有组
groups # 当前用户的组
groups username # 指定用户的组
id username # 显示用户ID和组ID
# 查看组信息
getent group groupname # 获取组详细信息
cat /etc/group # 查看所有组
# 查看组中成员
getent group sudo # 查看sudo组成员
getent group www-data # 查看www-data组成员
3.2 /etc/group文件
/etc/group文件存储系统组账户的基本信息,所有用户都可以读取。
文件结构:
组名:组密码:GID:组内用户列表
字段详细说明:
- 组名(Group Name):组的名称标识
- 组密码(Group Password):通常显示"x",实际密码存储在/etc/gshadow中
- 组ID(GID):组的唯一标识符
- 组内用户列表(Member List):属于该组的用户列表,用逗号分隔
bash
# 查看group文件内容
cat /etc/group
# 查看特定组信息
grep sudo /etc/group
getent group sudo
# 查看组中包含的用户
grep "username" /etc/group
# 统计系统中组数量
wc -l /etc/group
# 查看GID范围分布
awk -F: '{print $3}' /etc/group | sort -n | uniq -c
实际示例:
bash
# 查看group文件典型条目
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,ubuntu
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:ubuntu
floppy:x:25:
tape:x:26:
sudo:x:27:ubuntu
audio:x:29:pulse
dip:x:30:ubuntu
plugdev:x:46:ubuntu
lpadmin:x:120:ubuntu
sambashare:x:126:ubuntu
ubuntu:x:1000:ubuntu
www-data:x:33:
developers:x:1001:dev1,dev2,dev3
webadmin:x:1002:webdev1,webdev2
特殊说明:
- 主组成员不一定在第4列显示,附加组成员会显示在第4列
- 系统组(1-999)通常没有成员在第4列
- 用户创建时默认加入以其用户名命名的组
3.3 /etc/gshadow文件
/etc/gshadow文件存储组密码和组管理员信息,只有root用户可以读取。
文件结构:
组名:组密码:组管理员:组内用户列表
字段详细说明:
- 组名(Group Name):与/etc/group中的组名对应
- 组密码(Group Password):加密的组密码,"!"表示无密码
- 组管理员(Group Administrators):可以管理该组的用户列表
- 组内用户列表(Group Members):该组的成员列表
bash
# 查看gshadow文件内容(需要root权限)
sudo cat /etc/gshadow
# 查看特定组的shadow信息
sudo getent gshadow groupname
# 查看组管理员
sudo grep "groupname" /etc/gshadow
实际示例:
bash
# 查看gshadow文件典型条目
root:*::
daemon:*::
bin:*::
sys:*::
adm:*::
tty:*::
disk:*::
lp:*::
mail:*::
news:*::
uucp:*::
man:*::
proxy:*::
kmem:*::
dialout:*::
fax:*::
voice:*::
cdrom:*::
floppy:*::
tape:*::
sudo:*::ubuntu
audio:*::
dip:*::
plugdev:*::
lpadmin:*::
sambashare:*::
ubuntu:*::
www-data:*::
developers:*::admin1,admin2:dev1,dev2,dev3
webadmin:!::admin3:webdev1,webdev2
特殊值说明:
!:组无密码或组被锁定*:组密码已设置但未知- 空字符串:组密码为空,允许所有成员加入
4. 组账户管理命令
4.1 创建组账户命令
4.1.1 groupadd命令
groupadd命令用于创建新的用户组,是Linux系统原生提供的组管理命令。
基本语法:
bash
groupadd [选项] 组名
常用参数:
-f, --force:如果组已存在则成功退出-g, --gid GID:指定组的GID-h, --help:显示帮助信息-K, --key KEY=VALUE:覆盖/etc/login.defs中的默认值-o, --non-unique:允许使用非唯一的GID创建组-p, --password PASSWORD:为组设置密码-r, --system:创建系统组-R, --root CHROOT_DIR:在指定目录中应用操作
使用示例:
bash
# 1. 创建基本用户组
sudo groupadd developers
# 2. 指定GID创建组
sudo groupadd -g 1001 designers
# 3. 创建系统组
sudo groupadd -r system_users
# 4. 创建非唯一GID的组
sudo groupadd -o -g 1001 temp_group
# 5. 为组设置密码
sudo groupadd -p secret123 project_group
# 6. 创建组并指定自定义参数
sudo groupadd -K GID_MIN=1000 -K GID_MAX=9999 custom_group
# 7. 批量创建组
for dept in sales marketing finance hr; do
sudo groupadd ${dept}_dept
done
# 8. 创建项目组
sudo groupadd -g 2001 project_alpha
sudo groupadd -g 2002 project_beta
sudo groupadd -g 2003 project_gamma
# 9. 创建功能组
sudo groupadd -r logreaders
sudo groupadd -r webadmins
sudo groupadd -r dbadmins
创建组前的检查:
bash
# 1. 检查组名是否已存在
getent group groupname
# 2. 检查GID是否已使用
grep ":1001:" /etc/group
# 3. 查看可用GID范围
cat /etc/login.defs | grep GID
# 4. 查看现有组数量
wc -l /etc/group
# 5. 生成组名建议
for i in {1001..1010}; do
if ! grep -q ":$i:" /etc/group; then
echo "Available GID: $i"
break
fi
done
4.1.2 addgroup命令
addgroup是Debian/Ubuntu系统提供的交互式组创建命令,是groupadd的包装脚本。
基本语法:
bash
addgroup [选项] 组名
常用参数:
--gid GID:指定GID--help:显示帮助信息--quiet:静默模式--system:创建系统组--verbose:详细输出
使用示例:
bash
# 1. 创建用户组(推荐方式)
sudo addgroup team_leaders
# 2. 创建系统组
sudo addgroup --system monitor_daemon
# 3. 指定GID创建组
sudo addgroup --gid 1100 analysts
# 4. 批量创建部门组
sudo addgroup --quiet sales_dept
sudo addgroup --quiet marketing_dept
sudo addgroup --quiet finance_dept
sudo addgroup --quiet hr_dept
# 5. 创建项目相关组
sudo addgroup --verbose project_management
sudo addgroup --verbose project_development
sudo addgroup --verbose project_testing
sudo addgroup --verbose project_delivery
# 6. 创建权限组
sudo addgroup file_managers
sudo addgroup backup_operators
sudo addgroup security_officers
交互式创建过程:
bash
$ sudo addgroup testgroup
正在添加用户组 'testgroup' (GID 1003)...
完成。
4.1.3 组管理的最佳实践
命名规范:
bash
# 1. 按功能命名
sudo addgroup file_managers # 文件管理员组
sudo addgroup backup_operators # 备份操作员组
sudo addgroup log_viewers # 日志查看器组
# 2. 按部门命名
sudo addgroup sales_team
sudo addgroup marketing_team
sudo addgroup development_team
# 3. 按项目命名
sudo addgroup project_alpha
sudo addgroup project_beta
sudo addgroup project_gamma
# 4. 按系统命名
sudo addgroup database_users
sudo addgroup web_server_admin
sudo addgroup mail_server_admin
# 5. 按权限命名
sudo addgroup read_only_users
sudo addgroup read_write_users
sudo addgroup full_access_users
批量创建脚本:
bash
#!/bin/bash
# 创建项目组的脚本
# 项目名称
PROJECT_NAME="myproject"
# 创建项目相关组
sudo addgroup ${PROJECT_NAME}_developers
sudo addgroup ${PROJECT_NAME}_testers
sudo addgroup ${PROJECT_NAME}_admins
# 创建权限组
sudo addgroup ${PROJECT_NAME}_read_access
sudo addgroup ${PROJECT_NAME}_write_access
sudo addgroup ${PROJECT_NAME}_admin_access
echo "项目组创建完成:"
getent group | grep ${PROJECT_NAME}
4.2 修改组账户属性命令
4.2.1 groupmod命令
groupmod命令用于修改已存在用户组的属性和配置。
基本语法:
bash
groupmod [选项] 组名
常用参数:
-g, --gid GID:修改组GID-h, --help:显示帮助信息-n, --new-name NEW_GROUP:修改组名-o, --non-unique:允许使用非唯一GID-p, --password PASSWORD:设置组密码
使用示例:
bash
# 1. 修改组名
sudo groupmod -n newgroupname oldgroupname
# 2. 修改组GID
sudo groupmod -g 1100 developers
# 3. 修改组名和GID
sudo groupmod -n designers -g 1101 old_designers
# 4. 设置组密码
sudo groupmod -p secret456 project_group
# 5. 强制修改为已使用的GID
sudo groupmod -o -g 1005 temp_group
# 6. 修改系统组名
sudo groupmod -n system_admins old_sysadmin
# 7. 批量重命名组
for group in old_sales old_marketing old_finance; do
newname=$(echo $group | sed 's/old_//')
sudo groupmod -n $newname $group
done
# 8. 更新项目组GID
sudo groupmod -g 2001 project_alpha
sudo groupmod -g 2002 project_beta
sudo groupmod -g 2003 project_gamma
修改组属性前的安全检查:
bash
# 1. 检查组是否存在
getent group groupname
# 2. 检查新组名是否已存在
getent group newgroupname && echo "组名已存在"
# 3. 检查新GID是否已使用
grep ":1100:" /etc/group && echo "GID已使用"
# 4. 备份现有配置
sudo cp /etc/group /etc/group.backup.$(date +%Y%m%d)
sudo cp /etc/gshadow /etc/gshadow.backup.$(date +%Y%m%d)
# 5. 检查组中是否有用户
getent group groupname | cut -d: -f4
# 6. 列出组中所有用户
echo "组 $groupname 中的用户:"
getent group groupname | cut -d: -f4 | tr ',' '\n' | grep -v '^$'
4.3 删除组账户
4.3.1 groupdel命令
groupdel命令用于从系统中删除用户组。
基本语法:
bash
groupdel [选项] 组名
常用参数:
-h, --help:显示帮助信息-R, --root CHROOT_DIR:在指定目录中应用操作
使用示例:
bash
# 1. 删除用户组
sudo groupdel temp_group
# 2. 删除系统组
sudo groupdel -r old_system_group
# 3. 删除项目组
sudo groupdel project_alpha
sudo groupdel project_beta
sudo groupdel project_gamma
# 4. 删除部门组
sudo groupdel old_sales_team
sudo groupdel old_marketing_team
删除前的检查:
bash
# 1. 检查组是否存在
getent group groupname || echo "组不存在"
# 2. 检查组中是否有用户
members=$(getent group groupname | cut -d: -f4)
if [ -n "$members" ]; then
echo "警告:组中仍有用户 $members"
echo "是否继续删除?(y/N)"
read -r response
if [[ ! "$response" =~ ^[Yy]$ ]]; then
exit 1
fi
fi
# 3. 检查是否有文件属于该组
find / -group groupname 2>/dev/null | head -10
# 4. 检查系统组依赖
grep "groupname" /etc/passwd | cut -d: -f1
# 5. 检查组是否为主组
awk -F: -v group="groupname" '$4 == group {print $1}' /etc/passwd
4.3.2 delgroup命令
delgroup是Debian/Ubuntu系统提供的交互式组删除命令。
基本语法:
bash
delgroup [选项] 组名
常用参数:
--help:显示帮助信息--only-if-empty:仅在组为空时删除--quiet:静默模式--system:仅删除系统组--verbose:详细输出
使用示例:
bash
# 1. 删除用户组
sudo delgroup groupname
# 2. 仅在组为空时删除
sudo delgroup --only-if-empty groupname
# 3. 删除系统组
sudo delgroup --system system_group
# 4. 删除所有用户组
sudo delgroup --only-if-empty old_sales
sudo delgroup --only-if-empty old_marketing
sudo delgroup --only-if-empty old_finance
# 5. 批量删除项目组
sudo delgroup --quiet project_alpha
sudo delgroup --quiet project_beta
sudo delgroup --quiet project_gamma
删除后的清理工作:
bash
# 1. 验证组已删除
getent group groupname || echo "组已删除"
# 2. 检查用户配置文件
grep -v "groupname" /etc/passwd > /tmp/passwd_new
sudo mv /tmp/passwd_new /etc/passwd
# 3. 检查其他配置文件
sudo grep -r "groupname" /etc 2>/dev/null | grep -v "Binary file"
# 4. 清理相关目录
sudo find /home -group groupname 2>/dev/null | head -10
# 5. 重启相关服务
sudo systemctl restart nscd 2>/dev/null || true
4.4 管理组账户命令
4.4.1 gpasswd命令
gpasswd命令用于管理组密码和组管理员权限。
基本语法:
bash
gpasswd [选项] 组名
常用参数:
-a, --add USER:将用户添加到组-d, --delete USER:从组中删除用户-h, --help:显示帮助信息-M, --members USER[,...]:设置组的所有成员-r, --remove-password:移除组密码-R, --restrict:限制对组的访问-A, --administrators USER[,...]:设置组管理员
使用示例:
bash
# 1. 设置组密码
sudo gpasswd groupname
# 输入并确认密码
# 2. 添加用户到组
sudo gpasswd -a username groupname
# 3. 从组中删除用户
sudo gpasswd -d username groupname
# 4. 设置组管理员
sudo gpasswd -A adminuser groupname
# 5. 添加多个组管理员
sudo gpasswd -A admin1,admin2,admin3 groupname
# 6. 设置组的所有成员
sudo gpasswd -M user1,user2,user3,user4 groupname
# 7. 移除组密码
sudo gpasswd -r groupname
# 8. 限制组访问
sudo gpasswd -R groupname
# 9. 批量添加用户到组
for user in dev1 dev2 dev3; do
sudo gpasswd -a $user developers
done
# 10. 批量设置组成员
sudo gpasswd -M user1,user2,user3,user4,user5 project_team
# 11. 查看组信息
gpasswd -A groupname # 查看组管理员
gpasswd -M groupname # 查看组所有成员
4.4.2 组权限管理实例
项目团队权限管理:
bash
# 1. 创建项目组
sudo groupadd project_omega
sudo groupadd project_omega_read
sudo groupadd project_omega_write
# 2. 添加用户到不同的权限组
sudo gpasswd -a alice project_omega_read # 读权限
sudo gpasswd -a bob project_omega_write # 写权限
sudo gpasswd -a charlie project_omega # 管理权限
# 3. 设置组管理员
sudo gpasswd -A charlie project_omega
# 4. 为组设置密码(如果需要)
sudo gpasswd project_omega_write
临时项目权限分配:
bash
# 1. 创建临时项目组
sudo groupadd temp_project_q1
# 2. 批量添加项目成员
sudo gpasswd -M alice,bob,charlie,david,temp_project_q1
# 3. 设置项目负责人
sudo gpasswd -A charlie temp_project_q1
# 4. 验证组配置
getent group temp_project_q1
# 5. 项目结束后清理组成员
sudo gpasswd -M "" temp_project_q1
文件权限组管理:
bash
# 1. 创建文件管理组
sudo groupadd file_managers
# 2. 设置文件目录组权限
sudo mkdir /project/files
sudo chgrp file_managers /project/files
sudo chmod 770 /project/files
# 3. 添加管理员到组
sudo gpasswd -a sysadmin file_managers
sudo gpasswd -A backup_admin file_managers
# 4. 查看组状态
getent group file_managers
组管理最佳实践:
bash
# 1. 定期审计组成员
echo "=== 组 $1 成员审计 ==="
getent group $1 | cut -d: -f4 | tr ',' '\n' | grep -v '^$'
# 2. 检查空组
awk -F: '{if($4=="") print "空组: " $1}' /etc/group
# 3. 检查未使用的组
echo "近30天未使用的组:"
for group in $(awk -F: '{print $1}' /etc/group); do
if ! getent passwd | cut -d: -f4 | grep -q "^.*,${group}$"; then
echo "未使用组: $group"
fi
done
# 4. 组权限同步检查
echo "=== 组权限同步检查 ==="
for user in $(awk -F: '{print $1}' /etc/passwd); do
user_groups=$(groups $user | cut -d: -f2)
echo "用户 $user 的组:$user_groups"
done
5. 本章小结
5.1 核心概念总结
5.1.1 用户管理核心要点
-
用户账户体系:
- UID 0:超级用户root,具有系统最高权限
- UID 1-999:系统用户,用于运行系统服务和程序
- UID 1000+:普通用户,日常使用的用户账户
-
关键配置文件:
/etc/passwd:用户基本信息(7个字段)/etc/shadow:密码和策略信息(9个字段)- 字段格式:用户名:密码:UID:GID:注释:家目录:Shell
-
用户创建命令对比:
useradd:底层命令,功能全面,适合脚本化adduser:交互式命令,用户友好,Ubuntu推荐
5.1.2 组管理核心要点
-
组账户体系:
- 主组:用户登录时的默认组,只能有一个
- 附加组:用户可属于多个,用于权限分配
-
关键配置文件:
/etc/group:组基本信息(4个字段)/etc/gshadow:组密码和管理员(4个字段)
-
组管理命令:
groupadd/addgroup:创建组groupmod:修改组属性groupdel/delgroup:删除组gpasswd:管理组成员和密码
5.2 安全最佳实践
5.2.1 用户安全策略
bash
# 1. 强制密码复杂度
# 编辑 /etc/pam.d/common-password
password required pam_pwquality.so retry=3 minlen=12 maxrepeat=3
# 2. 设置合理的密码过期策略
sudo chage -m 7 -M 90 -W 14 -I 30 username
# 3. 定期审计用户账户
sudo awk -F: '$7 ~ /(\/bin\/bash|\/bin\/sh)$/ {print $1}' /etc/passwd
# 4. 禁用不必要的账户登录
sudo usermod -s /usr/sbin/nologin unnecessary_user
# 5. 设置账户锁定策略
sudo passwd -l username # 锁定账户
sudo usermod -U username # 解锁账户
5.2.2 组权限管理
bash
# 1. 使用最小权限原则
# 为用户分配最小的必要组权限
# 2. 定期审计组成员
sudo awk -F: '$4 !="" {print "组 " $1 " 有成员: " $4}' /etc/group
# 3. 清理未使用的组
for group in $(awk -F: '{print $1}' /etc/group); do
if ! getent passwd | cut -d: -f4 | grep -q ".*,${group}"; then
echo "未使用组: $group"
fi
done
# 4. 使用组权限控制文件访问
sudo chgrp groupname /path/to/file
sudo chmod 770 /path/to/file
5.3 常见问题解决
5.3.1 用户管理问题
-
用户无法登录:
bash# 检查用户Shell grep username /etc/passwd # 检查密码状态 sudo passwd -S username # 检查用户是否被锁定 sudo grep username /etc/shadow -
密码过期问题:
bash# 查看密码状态 sudo chage -l username # 重置密码过期策略 sudo chage -m 0 -M -1 username -
家目录权限问题:
bash# 修复家目录权限 sudo chown -R username:username /home/username sudo chmod 700 /home/username
5.3.2 组管理问题
-
用户不在预期组中:
bash# 查看用户实际组 groups username # 查看组详细信息 getent group groupname # 重新添加用户到组 sudo usermod -aG groupname username -
文件权限问题:
bash# 查看文件所属组 ls -l filename # 修改文件所属组 sudo chgrp groupname filename # 修改文件权限 sudo chmod 770 filename
5.4 自动化脚本示例
5.4.1 用户批量创建脚本
bash
#!/bin/bash
# 批量创建用户脚本
USER_FILE="users.txt"
GROUP_NAME="developers"
while IFS=',' read -r username fullname email; do
if [ -n "$username" ]; then
echo "创建用户: $username"
sudo adduser --disabled-login --gecos "$fullname,$email,," --ingroup $GROUP_NAME $username
# 设置临时密码
temp_password=$(openssl rand -base64 12)
echo "$username:$temp_password" | sudo chpasswd
# 强制首次登录修改密码
sudo chage -d 0 $username
echo "用户 $username 创建完成,临时密码: $temp_password"
fi
done < $USER_FILE
5.4.2 用户审计脚本
bash
#!/bin/bash
# 用户账户审计脚本
echo "=== 用户账户审计报告 ==="
echo "生成时间: $(date)"
echo
echo "1. 系统用户总数:"
awk -F: '$3 < 1000 {count++} END {print count}' /etc/passwd
echo "2. 普通用户总数:"
awk -F: '$3 >= 1000 {count++} END {print count}' /etc/passwd
echo "3. 已锁定用户:"
sudo awk -F: '$2 ~ /^!/ {print $1}' /etc/shadow
echo "4. 密码过期的用户:"
for user in $(sudo awk -F: -v today=$(date +%s) '{
if ($5 > 0 && $3 + $5*86400 < today) print $1
}' /etc/shadow); do
echo " - $user"
done
echo "5. 系统组数量:"
awk -F: '$3 < 1000 {count++} END {print count}' /etc/group
echo "6. 空组数量:"
awk -F: '{if ($4 == "") count++} END {print count}' /etc/group
6. 习题
6.1 基础概念题
-
填空题:
- Linux系统中,超级用户的UID是____,系统用户的UID范围是____,普通用户的UID范围是____。
/etc/passwd文件包含____个字段,分别是:、 、、 、、、____。/etc/shadow文件包含____个字段,其中第2字段存储____,第5字段表示____。- 用户的____组是登录时的默认组,一个用户只能有一个____组,但可以有多个____组。
-
选择题:
-
下列哪个命令可以查看用户的详细组信息?
a)
groups usernameb)
id usernamec)
getent group groupnamed) 以上都可以
-
在Ubuntu系统中,推荐使用哪个命令创建新用户?
a)
useraddb)
adduserc)
newuserd)
createuser -
下列关于/etc/gshadow文件的说法正确的是?
a) 所有用户都可以读取该文件
b) 只有root用户可以读取该文件
c) 该文件存储组的密码信息
d) b和c正确
-
-
判断题:
- ( ) 用户创建后必须设置密码才能登录系统
- ( )
usermod -G命令会保留用户的原有附加组 - ( )
groupdel命令可以删除任何系统组 - ( )
chage -l命令可以修改用户的密码策略 - ( )
/etc/group文件中主组成员会显示在第4字段
6.2 操作实践题
-
用户管理实验:
bash# 任务1:创建测试用户 # 使用adduser命令创建一个名为testuser的用户 # 设置全名为"测试用户" # 添加注释信息:开发工程师 # 任务2:设置用户权限 # 将testuser添加到sudo组 # 设置密码有效期为60天 # 设置密码到期前14天警告 # 任务3:修改用户属性 # 修改testuser的shell为/bin/zsh # 修改用户注释信息为"高级开发工程师" # 将用户添加到developers和webadmin组 # 任务4:验证配置 # 查看testuser的详细信息 # 查看testuser所属的所有组 # 查看testuser的密码策略 -
组管理实验:
bash# 任务1:创建项目组 # 创建名为project_alpha的组,GID为2001 # 创建名为project_beta的组,GID为2002 # 任务2:设置组权限 # 为project_alpha组设置密码 # 设置admin1为project_alpha的组管理员 # 任务3:管理组成员 # 将testuser添加到project_alpha组 # 将dev1,dev2,dev3添加到project_beta组 # 查看各组的详细信息 # 任务4:修改组属性 # 将project_alpha重命名为project_alpha_new # 修改project_alpha_new的GID为2003 -
密码策略配置:
bash# 任务1:设置全局密码策略 # 编辑/etc/login.defs文件,设置: # PASS_MAX_DAYS = 90 # PASS_MIN_DAYS = 7 # PASS_WARN_AGE = 14 # 任务2:为特定用户设置策略 # 为testuser设置密码永不过期 # 为admin用户设置密码30天过期 # 任务3:批量策略应用 # 为开发组所有用户设置密码60天过期 # 为管理员用户设置密码永不过期 # 任务4:策略验证 # 查看所有用户的密码策略 # 生成密码即将过期的用户列表
6.3 高级应用题
-
企业用户管理系统设计:
假设你是一家公司的系统管理员,公司有以下组织结构: - 管理层:CEO, CTO, CFO - 技术部门:开发工程师,测试工程师,运维工程师 - 业务部门:销售,市场营销,客户服务 - 行政部门:人力资源,财务管理,行政助理 请设计: 1. 用户命名规范 2. 组结构设计(包括主组和附加组) 3. 权限矩阵(不同部门对不同资源的访问权限) 4. 密码策略规范 5. 编写批量用户创建脚本 -
安全审计脚本开发:
开发一个用户管理安全审计脚本,功能包括: 1. 检查空密码用户 2. 检查密码永不过期的用户 3. 检查长期未登录的用户 4. 检查组成员配置异常 5. 生成安全审计报告 6. 提供修复建议 -
文件权限管理案例:
公司有一个共享项目目录/project/shared,需要实现以下需求: - 管理层:有完全控制权限 - 开发部:读权限,可创建文件但不能删除他人的文件 - 测试部:读权限,可修改测试相关文件 - 行政部门:读权限,可删除过期文件 请设计: 1. 目录结构 2. 组划分 3. 文件权限配置 4. 实施步骤和命令
6.4 故障排除题
-
用户登录问题诊断:
现象:用户testuser无法登录系统,登录时立即被踢出 请按照以下步骤进行诊断: 1. 检查用户的shell设置 2. 检查用户密码状态 3. 检查用户家目录权限 4. 检查用户是否被锁定 5. 检查系统日志 6. 提供解决方案 -
组权限问题排查:
现象:用户alice在developers组中,但无法访问group组权限的文件 请进行以下检查: 1. 验证alice是否确实在developers组中 2. 检查文件所属组 3. 检查文件权限设置 4. 验证alice的登录状态 5. 检查文件系统挂载选项 6. 提供修复方案 -
密码策略配置错误:
现象:密码策略配置后,系统提示密码策略无效 请检查以下配置: 1. /etc/login.defs文件语法 2. PAM模块配置 3. 用户现有密码状态 4. 系统时间同步 5. 提供正确的配置方案
6.5 综合项目题
-
多用户Web服务器用户管理系统:
设计一个支持多用户的Web服务器用户管理方案,包括: 功能要求: 1. 支持用户自主注册和登录 2. 不同用户有独立的Web目录 3. 用户可以使用FTP上传文件 4. 用户之间可以共享文件(可选) 5. 支持用户配额管理 6. 提供用户使用统计 技术要求: 1. 使用虚拟用户系统 2. 集成Web管理界面 3. 实现自动化脚本 4. 包含安全防护措施 5. 提供完整的文档 请提交: 1. 系统设计文档 2. 实施步骤说明 3. 配置文件模板 4. 管理脚本代码 5. 测试验证方案 -
企业级用户生命周期管理系统:
开发一个企业级用户管理解决方案: 管理功能: 1. 用户入职流程自动化 2. 用户权限变更流程 3. 用户离职流程自动化 4. 定期权限审计 5. 用户行为监控 6. 合规性检查 技术实现: 1. 数据库存储用户信息 2. Web管理界面 3. 审批工作流 4. 审计日志系统 5. 邮件通知系统 6. 备份和恢复机制 请提供: 1. 系统架构设计 2. 数据库设计 3. API接口文档 4. 前端界面设计 5. 部署运维指南
答案提示:
基础概念题答案:
-
填空题:
- 0,1-999,1000-65535
- 7,用户名,密码占位,UID,GID,注释,家目录,Shell
- 9,加密密码,密码最大有效天数
- 主组,主组,附加组
-
选择题:
- d) 以上都可以
- b)
adduser - d) b和c正确
-
判断题:
- ×(系统用户可能不需要密码)
- ×(
-G会覆盖原有组) - ×(系统关键组不能删除)
- ×(
-l只用于查看) - ×(主组成员不显示在第4字段)
通过本章的学习和实践,您应该能够熟练掌握Ubuntu 22.04系统中用户和组管理的基本操作,理解Linux用户管理机制,并能够在实际工作中应用这些知识进行系统用户管理和安全配置。