3、创建与管理用户:useradd、usermod、userdel 命令详解与实战
用户管理,说白了就是管好「谁可以进系统、能干什么」。
我刚开始做运维那会儿,觉得这玩意儿简单——不就是加个人、删个人嘛。直到有一次线上环境,我手滑删了一个系统账户,导致某个服务起不来,被老大骂了半小时。嗯,从那以后,我再也不敢小看这三个命令了。
3.1 用户管理的核心逻辑
Linux 里每个用户都有一个 UID(用户 ID)。系统认 UID 不认名字。你加个用户,系统干三件事:
- 在
/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