useradd、usermod、userdel:用户生命周期管理三剑客
在 Linux 系统中,每个使用系统的人都应该拥有一个独立的用户账号。useradd、usermod 和 userdel 这三个命令覆盖了用户从创建、修改到删除的完整生命周期。它们本质上是在维护 /etc/passwd、/etc/shadow、/etc/group 等关键文件,但提供了更安全、更方便的操作接口,避免手动编辑这些文件时可能出现的格式错误或权限问题。
1. useradd:创建新用户
命令格式
useradd [选项] 用户名
最简示例
sudo useradd alice
这会创建一个名为 alice 的用户,并自动生成同名的用户组(除非另行指定),同时分配一个空密码(账户处于锁定状态,无法直接登录)。此时系统会在 /etc/passwd 中新增一行记录,并在 /home 下创建默认家目录(部分发行版可能需要 -m 选项才会创建家目录,建议显式使用)。
常用选项
-m:自动创建用户家目录(如/home/alice),并从/etc/skel复制骨架文件(.bashrc、.profile等)。-s /bin/bash:指定用户的默认登录 Shell,不指定时通常为/bin/bash或/bin/sh。-G sudo:将用户附加到一个或多个辅助组中,比如sudo组可使其拥有管理员权限。-u 1001:手动指定用户的 UID(用户 ID),一般不常用,但在迁移或同步环境时有用。-e 2025-12-31:设置账户过期日期,到期后账户自动禁用。
实战示例
sudo useradd -m -s /bin/bash -G docker,adm bob
创建用户 bob,创建家目录,指定 bash 为登录 Shell,并额外加入 docker 和 adm 两个组。
设置密码useradd 默认不会设置可用密码。需要用 passwd 命令为新用户创建或修改密码:
sudo passwd alice
密码会被加密后存储在 /etc/shadow 文件中。
2. usermod:修改已有用户
命令格式
usermod [选项] 用户名
常用选项与 useradd 高度重合:-s 改 shell,-G 改附加组,-u 改 UID 等,此外还有几个特别实用的参数:
-a -G 组名:保留用户原有组的同时,附加到新组。注意:直接使用-G会覆盖用户的所有附加组,所以务必加上-a(append)。-L:锁定用户密码,在/etc/shadow的密码字段前添加!,使密码暂时失效(锁定账户)。-U:解锁用户密码,移除!。-l 新用户名:更改用户名,如usermod -l newname oldname。改名后建议也相应修改家目录:usermod -d /home/newname -m newname(-m会移动原家目录的内容)。-e 日期:修改账户过期时间,格式YYYY-MM-DD。
实战示例
# 将 alice 加入 sudo 组,并保留原有组
sudo usermod -a -G sudo alice
# 临时锁定 bob 的登录
sudo usermod -L bob
# 修改 bob 的登录 Shell 为 zsh,需确保 zsh 已安装
sudo usermod -s /usr/bin/zsh bob
修改完用户信息后,受影响的进程(如当前登录会话)不会立即感知变更,通常需要用户重新登录才能使 Shell 或组权限生效。
3. userdel:删除用户
命令格式
userdel [选项] 用户名
常用选项
-r:同时删除用户的家目录及邮件池(/var/spool/mail/用户名)。不加该选项时,家目录会被保留,某些情况下可能导致 UID 重复冲突或空间浪费。-f:强制删除,即使该用户仍在登录状态也会强制踢出并删除。
注意:删除用户不会自动删除该用户拥有的文件(除非使用了 -r 且这些文件位于家目录下)。系统上其它位置可能仍残留属于该用户 UID 的文件,建议在删除前或删除后通过 find / -uid UID 查找清理。
实战示例
# 删除用户 carol,并一并删除其家目录
sudo userdel -r carol
4. 背后的文件与权限
这三个命令操作的底层文件主要有:
/etc/passwd:存储用户名、UID、GID、家目录、Shell 等基本信息,普通用户可读。/etc/shadow:存储加密后的密码及密码过期策略,仅 root 可读写。/etc/group:存储组名、GID 和组成员列表。
手动编辑这些文件虽然可行(使用 vipw 或 vigr 更安全),但强烈建议通过上述命令操作,因为它们会自动处理文件锁、格式校验和影子文件的对应关系,避免人为失误导致无法登录。
掌握 useradd、usermod、userdel 这一套组合,就能在命令行下高效、安全地完成用户账户的日常管理工作,无需任何图形界面。这也是 Linux 服务器运维的基本功之一。