知识点详细解析
useradd:创建用户
useradd 是 Linux 中创建用户账户的核心命令,通过自动修改 /etc/passwd, /etc/shadow, /etc/group 等文件完成用户创建。 基本语法:
useradd [选项] <用户名>
常用选项
| 选项 | 作用描述 | 示例值 |
|---|---|---|
-m / --create-home | 创建家目录 (默认路径 /home/<用户名>) | -m |
-s / --shell | 指定登录 Shell | -s /bin/bash (默认) |
-u / --uid | 指定用户 UID (需唯一) | -u 1500 |
-g / --gid | 指定主组 GID 或组名 | -g developers |
-G / --groups | 指定附加组 (多个组用逗号分隔) | -G sudo,www-data |
-d / --home | 自定义家目录路径 | -d /data/john |
-c / --comment | 添加用户描述信息 | -c "Dev Engineer" |
-e / --expiredate | 设置账户过期日期 (YYYY-MM-DD) | -e 2026-12-31 |
-p / --password | 设置加密密码 (需手动生成哈希) | -p '$6$salt$hash' |
-k / --skel | 指定家目录模板路径 | -k /etc/custom_skel |
-r / --system | 创建系统用户 (无家目录,UID 范围 1-999) | -r |
关键注意事项
-
密码安全
避免直接使用-p明文密码# 创建用户后设置密码(安全) useradd -m john passwd john # 交互式设置密码 -
家目录依赖
- 默认不创建家目录,必须加
-m选项 - 模板文件从
/etc/skel复制(含.bashrc等)
- 默认不创建家目录,必须加
-
UID/GID 分配逻辑
- 默认从
/etc/login.defs中UID_MIN/UID_MAX范围分配 - 冲突时报错
useradd: UID 1001 is not unique
- 默认从
典型操作示例 示例:创建普通用户(带家目录和默认 Shell)
useradd -m -s /bin/bash john
→ 生成 /home/john,用户信息写入 /etc/passwd
示例:创建指定 UID/GID 的用户
useradd -u 1500 -g developers -G docker user1
→ 主组为 developers,附加组包含 docker
示例:创建系统用户(用于服务)
useradd -r -s /usr/sbin/nologin nginx
→ 无家目录,禁止登录 Shell
示例:设置账户过期时间
useradd -e 2026-01-01 tempuser
与 adduser 的区别
| 命令 | 特点 |
|---|---|
useradd | 底层工具,需手动指定所有参数(Red Hat/CentOS 默认) |
adduser | 交互式封装,自动创建家目录、提示设置密码(Debian/Ubuntu 首选) |
# Debian/Ubuntu 推荐用法
sudo adduser john # 交互式向导
passwd:设置/修改密码
在Linux中,passwd 是管理用户密码的核心命令,它直接修改 /etc/shadow 文件中的加密密码字段。
基本语法:
# 修改当前用户自身密码
passwd
# root用户修改其他账户密码(需要root权限)
passwd [选项] <用户名>
核心功能与选项
| 命令格式 | 作用描述 |
|---|---|
passwd | 修改当前登录用户的密码 (需验证旧密码) |
passwd <用户名> | root修改指定用户的密码 (无需旧密码) |
passwd -d <用户名> | root删除用户密码 (允许无密码登录) |
passwd -l <用户名> | root锁定账户 (密码前加!禁止登录) |
passwd -u <用户名> | root解锁账户 |
passwd -e <用户名> | root强制用户下次登录修改密码 |
passwd -S <用户名> | root查看账户状态 (如PS=密码正常, LK=锁定, NP=无密码) |
passwd -x 90 <用户名> | root设置密码最长有效期(90天后过期) |
passwd -i 7 <用户名> | root密码过期后宽限天数(7天后禁用账户) |
与 /etc/shadow 的关联
passwd 修改的内容对应 shadow 文件第2字段:
# shadow文件结构
用户名:加密密码:最后修改:最小天数:最大天数:警告期:失效宽限:过期日:保留
- 锁定账户 → 密码前添加
! - 删除密码 → 密码字段变为空
- 设置过期 → 修改
最大天数等字段
安全警告
- 避免使用弱密码(如
123456,password) - 慎用
-d删除密码(无密码账户有安全风险)
chage:修改密码策略
chage 是 Linux 中用于精细化管理用户密码策略的核心命令,专用于修改 /etc/shadow 文件中的时间字段(密码过期、失效时间等)。它直接关联账户安全策略管理,以下是语法详解和关键操作指南:
基础语法
# 查看用户的密码策略
chage -l [用户名]
# 修改策略(需 root 权限)
chage [选项] [用户名]
常用选项
| 命令选项 | 作用描述 | 对应 shadow 字段 |
|---|---|---|
-m <天数> | 密码最短使用期限(修改后 X 天内禁止更改) | 第 4 字段 |
-M <天数> | 密码最长有效期(X 天后强制修改密码) | 第 5 字段 |
-W <天数> | 密码过期前警告(提前 X 天提示用户) | 第 6 字段 |
-I <天数> | 密码过期后的账户宽限期(X 天后禁用账户) | 第 7 字段 |
-E <YYYY-MM-DD> | 账户绝对过期日(到期自动禁用) | 第 8 字段 |
-d <YYYY-MM-DD> | 设置最后一次密码修改日(强制下次登录改密) | 第 3 字段 |
-l | 列出详细账户策略(最常用) | - |
典型场景操作示例 示例:为新用户强制首次登录改密码
useradd dev_user
chage -d 0 dev_user # 设置密码修改日为 Epoch(1970年),强制登录时立即修改
示例: 设置密码强度策略(90 天有效期,过期前 7 天警告)
useradd sys_admin
chage -M 90 -W 7 sys_admin # 90 天后密码过期,提前 7 天警告
示例:创建临时账户(30 天后自动过期)
useradd temp_user
chage -E $(date -d "+30 days" +%Y-%m-%d) temp_user
示例审计账户策略(关键操作!)
# 查看详细策略
chage -l web_user
输出示例:
Last password change : Jun 10, 2025
Password expires : Sep 08, 2025 # 90天后过期 (M90)
Password inactive : Sep 15, 2025 # 宽限期7天 (I7)
Account expires : never
Minimum number of days... : 0 # 可随时修改密码 (m0)
Warning number of days... : 7 # 过期前7天警告 (W7)
与 passwd 命令的区别
| 特性 | chage | passwd |
|---|---|---|
| 核心功能 | 管理密码时间策略 | 修改密码/锁定账户 |
| 操作对象 | 主要修改 /etc/shadow 时间字段 | 修改密码哈希/账户状态 |
| 高频使用场景 | 密码过期策略、临时账户管理 | 日常密码维护、账户锁定 |
| 互补性 | passwd -e 等效于 chage -d 0 | chage 无法设置新密码 |
总结使用流程
graph TD
A[创建用户] --> B[用 passwd 设置初始密码]
B --> C[用 chage 配置时间策略]
C --> D[定期检查 chage -l]
usermod:修改用户属性
usermod 是 Linux 中用于修改现有用户账户属性的核心命令,直接关联 /etc/passwd、/etc/shadow 和 /etc/group 文件的修改。
基础语法
usermod [选项] [用户名]
注意:必须用 root 权限执行(用户不能处于登录状态)
常用选项 身份标识
| 选项 | 作用 | 示例 |
|---|---|---|
-u | 修改用户 UID | sudo usermod -u 1050 dev |
-l | 重命名用户 | sudo usermod -l new_user old_user |
-c | 修改用户备注信息 | sudo usermod -c "Dev Team" user1 |
密码策略
| 选项 | 作用 | 关联文件 |
|---|---|---|
-e | 设置账户过期日期 (YYYY-MM-DD) | /etc/shadow |
-f | 密码过期后的宽限期(天数) | /etc/shadow |
-L | 锁定账户 (密码前加 !) | /etc/shadow |
-U | 解锁账户 | /etc/shadow |
组管理
| 选项 | 作用 | 说明 |
|---|---|---|
-g | 修改用户主组 (需组名或 GID) | sudo usermod -g devgrp user1 |
-aG | 追加用户到附加组(不覆盖原组) | sudo usermod -aG docker,git user1 |
-G | 覆盖式设置用户附加组(慎用!) | 移除用户原有附加组 |
目录迁移
| 选项 | 作用 | 注意事项 |
|---|---|---|
-d | 修改用户家目录路径 | 需配合 -m 迁移文件 |
-m | 将原家目录内容移动到新目录 | 必须与 -d 联用 |
-s | 修改用户默认 shell | sudo usermod -s /sbin/nologin user |
典型场景操作 示例:修改用户主组并追加附加组
usermod -g developers -aG docker,git dev_user
示例:重命名用户并迁移家目录
usermod -l new_dev -d /home/new_dev -m old_dev
示例:临时锁定账户(安全应急)
usermod -L compromised_user # 解锁用 -U
示例:设置账户过期(合同到期场景)
usermod -e 2025-12-31 temp_user
注意事项
-
用户状态要求:
- 修改时用户不能登录系统
- 关键服务账户用
ps -u [用户名]检查进程
-
家目录迁移风险:
# 错误操作(丢失权限): usermod -d /new/home user # 正确操作(迁移并保留权限): usermod -d /new/home -m user -
组管理区别:
操作 命令 替换所有附加组 usermod -G group1,group2 user保留原组追加新组 usermod -aG new_group user -
锁机原理对比:
命令 实现方式 恢复方式 usermod -L/etc/shadow 密码前加 !usermod -Upasswd -l相同实现 passwd -u
userdel:删除用户
userdel 是 Linux 中用于删除用户账户的核心命令,直接关联 /etc/passwd、/etc/shadow、/etc/group 文件的清理。
基础语法
userdel [选项] [用户名]
关键前提:
- 必须用 root 权限执行
- 确保用户未运行任何进程(
ps -u [用户名]检查) - 明确是否需保留用户文件(默认仅删除账户信息)
常用选项
| 选项 | 作用 | 文件影响 | 示例 |
|---|---|---|---|
-r | 删除用户主目录及邮件 | 清理 /home/[用户] 和 /var/spool/mail/[用户] | sudo userdel -r test_user |
-f | 强制删除(即使用户已登录) | 强行终止进程后删除,高风险 | sudo userdel -f locked_user |
-Z | 清除 SELinux 用户映射(仅 SELinux 系统) | /etc/selinux/targeted/seusers | sudo userdel -Z legacy_user |
典型场景操作 示例:安全删除普通用户(保留文件)
# 先检查用户进程
ps -u dev_user
# 删除账户(保留 /home/dev_user)
userdel dev_user
示例:彻底清理用户(包括家目录)
# 删除账户 + 家目录 + 邮件
sudo userdel -r temp_user
# 验证目录是否清除
ls -l /home | grep temp_user
示例:强制删除僵尸账户(用户仍登录)
# 强制终止进程并删除(慎用!)
userdel -rf malware_user
批量删除过期账户
# 删除所有 test_ 开头的用户
userdel -r $(awk -F: '/^test_/ {print $1}' /etc/passwd)
关键注意事项
-
文件保留策略
# 默认操作:仅删账户(保留 /home) userdel user1 # 完全清理:账户+家目录+邮件 userdel -r user2 -
处理用户进程
# 若提示 "userdel: user userX is currently logged in" pkill -u userX # 终止用户进程 userdel userX # 再执行删除 -
组关系处理逻辑
场景 组处理方式 用户是某组唯一成员 自动删除该组 用户是组普通成员 仅从组中移除用户 -
审计日志
# 检查删除记录(系统日志) grep 'userdel' /var/log/auth.log
删除后验证
# 检查账户是否存在
grep "用户名" /etc/passwd # 应无输出
grep "用户名" /etc/shadow # 应无输出
# 检查用户文件(未用 -r 时)
ls -l /home | grep "用户名"
案例代码与解析
案例:创建用户并设置家目录与Shell
# 创建用户alice,指定家目录为/home/alice,登录Shell为/bin/zsh
useradd -m -d /home/alice -s /bin/zsh alice
# 验证家目录和Shell
ls -ld /home/alice # 输出:drwx------ 2 alice alice 62 6月 23 10:15 /home/alice
grep alice /etc/passwd # 输出:alice:x:1000:1000::/home/alice:/bin/zsh
解析:
-m:自动创建家目录。-d:指定家目录路径。-s:指定登录Shell。
案例:修改用户密码策略
# 添加用户bob
useradd bob
# 设置用户bob的密码最小长度为10,过期时间为60天,过期前7天警告
chage -m 10 -M 60 -W 7 bob
# 验证密码策略
chage -l bob
# 输出:
# 最近一次密码修改时间 :6月 23, 2025
# 密码过期时间 :8月 22, 2025
# 密码失效时间 :从不
# 帐户过期时间 :从不
# 两次改变密码之间相距的最小天数 :10
# 两次改变密码之间相距的最大天数 :60
# 在密码过期之前警告的天数 :7
解析:
-m:最小修改间隔(天)。-M:最大有效期(天)。-W:警告天数。
案例:删除用户并清理家目录
# 添加用户charlie
useradd charlie
# 删除用户charlie并清理家目录
userdel -r charlie
# 验证用户是否删除
grep charlie /etc/passwd # 无输出表示删除成功
ls /home/ # 确认家目录已删除
解析:-r:删除用户时同时删除家目录和邮件池。
案例:强制用户修改密码
# 添加用户diana
useradd diana
# 强制用户diana下次登录时修改密码
chage -d 0 diana
# 验证(下次登录时会提示修改密码)
chage -l diana
# 输出
# 最近一次密码修改时间 :密码必须更改
# 密码过期时间 :密码必须更改
# 密码失效时间 :密码必须更改
# 帐户过期时间 :从不
# 两次改变密码之间相距的最小天数 :0
# 两次改变密码之间相距的最大天数 :99999
# 在密码过期之前警告的天数 :7
解析:-d 0:将密码上次修改时间设置为0(即“立即过期”)。
案例:修改用户名和家目录
# 添加用户eve
useradd eve
# 修改用户eve的用户名为eve_new,并迁移家目录
usermod -l eve_new -d /home/eve_new -m eve
# 验证用户名和家目录
grep eve_new /etc/passwd
# 输出:eve_new:x:1003:1003::/home/eve_new:/bin/bash
ls -ld /home/eve_new # 确认家目录已迁移
解析:
-l:修改用户名。-d -m:修改家目录并迁移文件。
案例:锁定和解锁用户
# 锁定用户alice
passwd -l alice
# 锁定用户 alice 的密码 。
# passwd: 操作成功
# 验证锁定状态
grep alice /etc/shadow # 密码字段前有`!`
# alice:!!:20262:0:99999:7:::
# 解锁用户alice
passwd -uf alice
# 解锁用户 alice 的密码。
# passwd: 操作成功
解析:
-l:锁定用户(禁用登录)。-u:解锁用户。-f:强制执行操作。
常见错误与解决方法
错误:useradd: cannot lock /etc/passwd
原因:/etc/passwd被其他进程占用(如vipw正在编辑)。
解决:等待占用进程结束,或使用vipw -s安全编辑。
错误:passwd: Authentication token manipulation error
原因:
/etc/shadow权限错误(应为640)。- 磁盘空间不足。
解决:
- 检查权限:
ls -l /etc/shadow,修复为640。 - 检查磁盘空间:
df -h。
错误:userdel: user diana is currently logged in
原因:用户未退出登录。
解决:使用pkill -u diana强制终止用户进程,或重启系统。
错误:newusers: invalid user name 'admin!'
原因:用户名包含非法字符(如!)。
解决:用户名仅允许字母、数字、下划线、连字符(如admin_user)。
理论练习
题目:useradd命令的-s选项的作用是什么?
答案:指定用户的登录Shell。
题目:如何查看用户bob的密码过期时间?
答案:
chage -l bob
题目:/etc/passwd中,若用户字段的第六个字段为/sbin/nologin,表示什么?
答案:用户无登录权限(通常为系统用户)。
题目:userdel命令的-r选项的作用是什么?
答案:删除用户时同时删除家目录和邮件池。
题目:如何锁定用户alice的账号?
答案:
sudo passwd -l alice
题目:chage -d 0 username的作用是什么?
答案:强制用户下次登录时修改密码。
实操练习
任务:创建用户frank,家目录为/opt/frank,登录Shell为/bin/bash,并设置密码为frank123。
答案:
useradd -m -d /opt/frank -s /bin/bash frank
echo "frank:frank123" | chpasswd
任务:修改用户frank的密码有效期为90天,并设置密码过期前14天警告。
答案:
chage -M 90 -W 14 frank
chage -l frank # 验证
# 最近一次密码修改时间 :6月 23, 2025
# 密码过期时间 :9月 21, 2025
# 密码失效时间 :从不
# 帐户过期时间 :从不
# 两次改变密码之间相距的最小天数 :0
# 两次改变密码之间相距的最大天数 :90
# 在密码过期之前警告的天数 :14
任务:禁用用户frank的登录权限,并验证。
答案:
passwd -l frank
# 锁定用户 frank 的密码 。
# passwd: 操作成功
grep frank /etc/shadow # 密码字段前应有`!`
# frank:!!$6$KE./m/lo$KjvlKWJ9nbNbVvmaLy4dcYUl.9.mG3Kls2szu3kJe65en5fzYvRaXO1Hgm4acEkGIAiHZhqcF9fHrfPfbRLBk.:20262:0:90:14:::
任务:删除用户frank并清理家目录,然后验证。
答案:
userdel -r frank
grep frank /etc/passwd # 无输出
ls /opt/ # 确认frank目录已删除
任务:添加alice用户,修改用户alice的用户名为alice_new,并迁移家目录。
答案:
useradd alice
usermod -l alice_new -d /home/alice_new -m alice
grep alice_new /etc/passwd # 验证
# alice_new:x:1000:1000::/home/alice_new:/bin/bash
任务:锁定用户alice_new的账号,并验证其无法登录。
答案:
passwd -l alice_new
grep alice_new /etc/shadow # 检查`!`标记
# alice_new:!!:20253:0:99999:7:::
知识总结
用户管理核心命令:
useradd:创建用户。passwd:设置密码。chage:修改密码策略。usermod:修改用户属性。userdel:删除用户。
关键文件:
/etc/passwd:存储用户基本信息。/etc/shadow:存储密码和策略。
注意事项:
- 操作前备份重要数据(如用户家目录)。
- 避免直接修改
/etc/passwd和/etc/shadow,使用命令工具。