3、创建与管理用户:useradd、usermod、userdel 命令详解与实战

用户管理,说白了就是管好「谁可以进系统、能干什么」。

我刚开始做运维那会儿,觉得这玩意儿简单——不就是加个人、删个人嘛。直到有一次线上环境,我手滑删了一个系统账户,导致某个服务起不来,被老大骂了半小时。嗯,从那以后,我再也不敢小看这三个命令了。

3.1 用户管理的核心逻辑

Linux 里每个用户都有一个 UID(用户 ID)。系统认 UID 不认名字。你加个用户,系统干三件事:

  • /etc/passwd 里写一行记录
  • /etc/shadow 里存密码信息
  • /home 下建一个家目录(可选)

我画了一张图,帮你理清这三个命令的关系:

useradd usermod userdel 创建用户 修改用户 删除用户 核心操作对象 /etc/passwd /etc/shadow /home/用户名

3.2 useradd:创建用户

这是最常用的命令。但很多人只会用默认参数,结果踩坑。

基本用法

# 最简单的创建
useradd zhangsan

# 创建时指定家目录和 shell
useradd -d /home/zhangsan -m -s /bin/bash zhangsan

-d 指定家目录路径,-m 表示如果目录不存在就创建,-s 指定登录 shell。

我的习惯:每次创建用户,我都会加上 -m -s /bin/bash。不加 -m 的话,用户没有家目录,很多程序会报错。不加 -s 的话,默认可能是 /bin/sh,功能受限。

指定 UID 和组

# 指定 UID
useradd -u 1050 zhangsan

# 创建时加入附加组
useradd -G wheel,docker zhangsan

为什么要指定 UID?我遇到过这种情况:两台服务器做 NFS 共享,A 服务器的用户 UID 是 1001,B 服务器上同一个人 UID 是 1002。结果文件权限全乱了。所以,多机环境里,UID 一定要统一规划。

设置密码

# 创建用户后必须设置密码
passwd zhangsan

注意:useradd 本身不设密码。新用户默认是锁定状态,必须用 passwd 激活。

我曾经踩过的坑:有一次我批量创建了 20 个用户,忘了设密码。第二天业务方说「用户登不进去」,我查了半天才发现密码没设。后来我写了个脚本,创建完自动调用 passwd

3.3 usermod:修改用户

用户创建完了,想改点东西?用 usermod

常用修改场景

# 修改用户名
usermod -l newname oldname

# 修改家目录
usermod -d /new/home -m zhangsan

# 修改 UID
usermod -u 1055 zhangsan

# 锁定/解锁用户
usermod -L zhangsan   # 锁定
usermod -U zhangsan   # 解锁

-m 配合 -d 使用时,会把旧家目录的内容搬到新目录。不加 -m 的话,目录路径变了但文件没动,用户登录后看到的还是空目录。

修改用户组

# 修改主组
usermod -g developers zhangsan

# 追加附加组(保留原有附加组)
usermod -aG docker zhangsan
重点:-a 必须和 -G 一起用。如果只写 -G docker,会把用户从其他附加组里踢出去。我见过有人因为这个操作,把用户从 sudo 组里踢了,结果用户连 sudo 都用不了。

3.4 userdel:删除用户

删除用户看似简单,但处理不好会留一堆垃圾。

基本删除

# 只删除用户,保留家目录和邮件
userdel zhangsan

# 连家目录和邮件一起删
userdel -r zhangsan

我建议:除非你确定不再需要这个人的任何数据,否则先用不带 -r 的方式删。等确认没问题了,再手动清理家目录。

删除正在登录的用户

# 强制删除(即使该用户还在登录)
userdel -f zhangsan
我曾经踩过的坑:有一次我强制删了一个正在跑着进程的用户。结果那个进程变成了「孤儿进程」,PPID 变成了 1(init 进程)。后来排查问题时,根本不知道这个进程是谁启动的。所以,删用户前,先 kill 掉他的所有进程。

3.5 实战:完整用户生命周期管理

下面是一个完整的例子,从创建到删除,走一遍流程。

# 1. 创建用户
useradd -m -s /bin/bash -u 1050 -G wheel devops

# 2. 设置密码
echo "Passw0rd!" | passwd --stdin devops

# 3. 查看用户信息
id devops
# 输出: uid=1050(devops) gid=1050(devops) groups=1050(devops),10(wheel)

# 4. 修改用户(追加 docker 组)
usermod -aG docker devops

# 5. 锁定用户(临时禁用)
usermod -L devops

# 6. 解锁用户
usermod -U devops

# 7. 删除用户(保留数据)
userdel devops

# 8. 手动清理家目录(确认无用后)
rm -rf /home/devops

3.6 常用参数速查表

命令 参数 说明 我的建议
useradd -m 创建家目录 每次都加
-s 指定 shell 用 /bin/bash
-u 指定 UID 多机环境必用
-G 附加组 按需添加
usermod -aG 追加附加组 别漏了 -a
-L/-U 锁定/解锁 临时禁用用这个
-d -m 搬家目录 两个一起用
userdel -r 删家目录 确认后再用
-f 强制删除 慎用

3.7 避坑指南

最后,分享几个我亲身经历的教训:

  • UID 冲突:我曾经在两个系统里分别创建用户,结果 UID 重复了。NFS 共享时文件所有者显示成另一个人。后来我建了个 UID 分配表,每个系统统一规划。
  • 家目录权限:有次我手动创建了家目录,忘了设权限。用户登录后报错「无法创建 .bash_history」。后来我养成习惯,创建用户一定用 -m,让系统自动处理权限。
  • 删除前检查:删用户前,先跑 ps -u 用户名 看看有没有他的进程。有的话先 kill 掉,再删。

嗯,这三个命令看着简单,但用好了能省很多事。你想想看,一个规范的用户管理体系,能帮你避免多少权限混乱的问题?


公众号:蓝海资料掘金营,微信deep3321