「Linux用户账号管理」用户账号管理

278 阅读11分钟

知识点详细解析

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

关键注意事项

  1. 密码安全
    避免直接使用 -p 明文密码

    # 创建用户后设置密码(安全)
    useradd -m john
    passwd john  # 交互式设置密码
    
  2. 家目录依赖

    • 默认不创建家目录,必须加 -m 选项
    • 模板文件从 /etc/skel 复制(含 .bashrc 等)
  3. UID/GID 分配逻辑

    • 默认从 /etc/login.defsUID_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文件结构
用户名:加密密码:最后修改:最小天数:最大天数:警告期:失效宽限:过期日:保留
  • 锁定账户 → 密码前添加 !
  • 删除密码 → 密码字段变为空
  • 设置过期 → 修改 最大天数 等字段

安全警告

  1. 避免使用弱密码(如 123456, password
  2. 慎用 -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 命令的区别

特性chagepasswd
核心功能管理密码时间策略修改密码/锁定账户
操作对象主要修改 /etc/shadow 时间字段修改密码哈希/账户状态
高频使用场景密码过期策略、临时账户管理日常密码维护、账户锁定
互补性passwd -e 等效于 chage -d 0chage 无法设置新密码

总结使用流程

graph TD
    A[创建用户] --> B[用 passwd 设置初始密码]
    B --> C[用 chage 配置时间策略]
    C --> D[定期检查 chage -l]

usermod:修改用户属性

usermod 是 Linux 中用于修改现有用户账户属性的核心命令,直接关联 /etc/passwd/etc/shadow/etc/group 文件的修改。

基础语法

usermod [选项] [用户名]

注意:必须用 root 权限执行(用户不能处于登录状态)

常用选项 身份标识

选项作用示例
-u修改用户 UIDsudo 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修改用户默认 shellsudo 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

注意事项

  1. 用户状态要求

    • 修改时用户不能登录系统
    • 关键服务账户用 ps -u [用户名] 检查进程
  2. 家目录迁移风险

    # 错误操作(丢失权限):
    usermod -d /new/home user
    
    # 正确操作(迁移并保留权限):
    usermod -d /new/home -m user
    
  3. 组管理区别

    操作命令
    替换所有附加组usermod -G group1,group2 user
    保留原组追加新组usermod -aG new_group user
  4. 锁机原理对比

    命令实现方式恢复方式
    usermod -L/etc/shadow 密码前加 !usermod -U
    passwd -l相同实现passwd -u

userdel:删除用户

userdel 是 Linux 中用于删除用户账户的核心命令,直接关联 /etc/passwd/etc/shadow/etc/group 文件的清理。

基础语法

userdel [选项] [用户名]

关键前提

  1. 必须用 root 权限执行
  2. 确保用户未运行任何进程ps -u [用户名] 检查)
  3. 明确是否需保留用户文件(默认仅删除账户信息)

常用选项

选项作用文件影响示例
-r删除用户主目录及邮件清理 /home/[用户]/var/spool/mail/[用户]sudo userdel -r test_user
-f强制删除(即使用户已登录)强行终止进程后删除,高风险sudo userdel -f locked_user
-Z清除 SELinux 用户映射(仅 SELinux 系统)/etc/selinux/targeted/seuserssudo 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)

关键注意事项

  1. 文件保留策略

    # 默认操作:仅删账户(保留 /home)
    userdel user1
    
    # 完全清理:账户+家目录+邮件
    userdel -r user2
    
  2. 处理用户进程

    # 若提示 "userdel: user userX is currently logged in"
    pkill -u userX      # 终止用户进程
    userdel userX       # 再执行删除
    
  3. 组关系处理逻辑

    场景组处理方式
    用户是某组唯一成员自动删除该组
    用户是组普通成员仅从组中移除用户
  4. 审计日志

    # 检查删除记录(系统日志)
    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,使用命令工具。