$ sudo useradd -m -s /bin/bash devops
$ sudo passwd devops
$ id devops
$ sudo usermod -aG wheel devops # 注意那个 a
$ sudo usermod -L devops # 锁定
$ sudo userdel -r testuser # -r 连家目录删
用户信息存在哪
- /etc/passwd
- 所有用户的基本信息,任何人都能读。名字里有 passwd 但不存密码——历史遗留的叫法。
- /etc/shadow
- 加密后的密码放这,还有密码过期策略。只有 root 能读——这是安全设计。
- /etc/group
- 组的信息,以及每个组里有哪些成员。
$ tail -1 /etc/passwd
devops:x:1000:1000::/home/devops:/bin/bash
① ② ③ ④ ⑤ ⑥ ⑦
① 用户名 ② x 表示密码在 shadow 里 ③ UID ④ 主组 GID
⑤ 备注 ⑥ 家目录 ⑦ 登录用的 shell
如果 shell 写的是 /sbin/nologin,说明这个账号不允许登录——系统里大部分账号(nginx、mysql 这些)都是这样,它们只是用来跑服务的身份,不是给人用的。
grep nologin /etc/passwd | wc -l 数一下,你会发现这种账号占了绝大多数。
useradd
$ sudo useradd -m -s /bin/bash devops
↑ ↑
-m 建家目录 -s 指定 shell
$ sudo passwd devops # 建完必须设密码,否则登录不了
$ id devops # 确认建好了
$ ls -ld /home/devops # 确认家目录在,权限是 700
Rocky / RHEL 上 useradd 默认就会建家目录,所以 -m 加不加都行。但 Debian/Ubuntu 上默认不建——养成一直带 -m 的习惯,换系统不会踩坑。
usermod -aG
把用户加进一个组,用 usermod -G。但必须带上 a:
- -aG wheel
- append,追加。原有的组都保留,再加一个 wheel。✅ 永远用这个。
- -G wheel
- 覆盖。用户原来所在的所有附加组会被清空,只剩 wheel。
# 某用户原本在 docker、wheel、developers 三个组里
$ id alice
uid=1001(alice) groups=1001(alice),10(wheel),995(docker),1050(developers)
# 你想给他加个新组,手滑漏了 a
$ sudo usermod -G newgroup alice
$ id alice
uid=1001(alice) groups=1001(alice),1060(newgroup)
↑ wheel 没了(不能 sudo 了)、docker 没了(用不了容器了)
而且系统不会给你任何警告
id 用户名 先跑一遍,把输出复制到记事本里。万一改错了,照着原样用 -aG 加回去。
这个习惯和 Day 02 的「改配置前先备份」是同一个道理。
锁定和删除
$ sudo usermod -L devops # 锁定,密码前加个 ! 让它失效
$ sudo usermod -U devops # 解锁
$ sudo userdel devops # 删账号,家目录留着
$ sudo userdel -r devops # 连家目录一起删
员工离职,应该先锁定而不是直接删。因为:
① 他可能有定时任务还在跑;② 系统里可能有文件属主是他,删了用户之后那些文件会变成孤儿(只显示 UID 数字);③ 审计需要保留痕迹。
确认没有依赖了,再删。
密码策略
$ sudo chage -l devops # 看密码过期策略
$ sudo chage -M 90 devops # 密码最长 90 天必须改
$ sudo passwd -e devops # 强制下次登录必须改密码
企业环境(尤其等保合规)经常要求密码定期更换,这几条能直接派上用场。
今天的面试点
「先 usermod -L 锁定,不直接删。因为可能还有定时任务在跑,或者有文件属主是他——删了之后那些文件会变成没主的 UID 数字。确认没有依赖了再 userdel -r。」
「加进 wheel 组:usermod -aG wheel 用户名。」
然后主动补一句:「那个 a 一定要带,是 append 的意思。不加的话会把用户原有的附加组全清掉,我见过因为这个把人踢出 docker 组的。」——这句话说明你踩过坑或者知道坑在哪。
今天的练习
- 建一个用户:
sudo useradd -m -s /bin/bash test01,然后sudo passwd test01设密码 tail -3 /etc/passwd,把最后一行的七个字段对着上面的图认一遍sudo tail -3 /etc/shadow,看看密码是怎么存的(一串加密后的乱码)grep nologin /etc/passwd | wc -l,数数系统里有多少不能登录的服务账号- 重点:
id test01记下结果 →sudo usermod -aG wheel test01→ 再id对比,确认原有的组还在 - 锁定再解锁:
sudo usermod -L test01,sudo grep test01 /etc/shadow看密码前面多了个!,然后-U解锁 - 练完清理:
sudo userdel -r test01
Day 09 讲 sudo:为什么不直接用 root,以及那个改错了会让所有人失去 sudo 权限的文件该怎么安全地编辑。