本文要点
- 用户(user)与组(group) 是把"人/进程"和"权限"绑定在一起的机制;理解
/etc/passwd、/etc/shadow、/etc/group三个配置文件,几乎所有命令都是在"改这几个文件"; - 新增一个用户走
groupadd→useradd→passwd三步,改用户用usermod,删除用户用userdel -r(连带清理家目录); - 授权通过"用户 → 主组/附加组 → 权限"的链条下发,
sudo是提权的最后一道门,规则写在/etc/sudoers,用sudo -l查看自己有哪些权限; - 结尾整理了新手最常踩的坑(UID 与 GID 两套计数器、密码策略
chage、删除用户是否清理残留),所有命令均在 Ubuntu 24.04 上真实执行验证。
为什么需要用户与组
Linux 是一个多用户操作系统,一台服务器上往往跑着多个服务、被多个工程师登录操作。如果所有人都是 root,任何一条手滑的命令(比如 rm -rf 敲错目录)都可能直接毁掉整个系统,而且出了问题根本分不清是谁干的。用户(user) 和 组(group) 就是把"人/进程"和"权限"绑在一起的机制:
- 每个用户有独立的身份(UID)、家目录、登录 Shell,以及它能执行什么命令的边界;
- 组把一批用户归拢起来,方便统一授权——比如「运维组可以重启服务」「开发组只能看日志」。
这是一篇从零开始的用户与组管理指南:先讲清三个核心配置文件,再逐个过一遍 groupadd / useradd / passwd / usermod / sudo / userdel 的真实用法,最后是常见坑。所有命令都在 Ubuntu 24.04 上真实执行过。
用户与组的信息存在哪里
Linux 用三个文本文件记录用户与组的全部信息,理解了它们,几乎所有命令都是在"改这几个文件"。
/etc/passwd:用户帐号表
每个用户一行,用冒号分成 7 段:
bob:x:1000:1001::/home/bob:/bin/bash| 字段 | 含义 |
|---|---|
bob | 用户名 |
x | 密码占位符(真正的密码在 /etc/shadow 里) |
1000 | 用户 ID(UID) |
1001 | 主组 ID(GID) |
| (空) | 备注信息,如姓名/电话 |
/home/bob | 家目录 |
/bin/bash | 登录 Shell |
一个小细节:上面这行里 UID 是 1000、GID 却是 1001,因为演示时先groupadd创建了组,组的 GID 从 1000 开始分配,随后useradd建的用户的 UID 才落到 1000,主组则拿走了下一个编号。UID 与 GID 是两套独立计数器,不要想当然地认为它们必须相等。
/etc/shadow:密码与有效期
/etc/passwd 是所有人可读的,所以密码绝不能放里面,而是放进权限为 600、属组为 shadow 的 /etc/shadow:
ls -l /etc/passwd /etc/shadow-rw-r--r-- 1 root root 1920 Aug 6 21:14 /etc/passwd
-rw-r----- 1 root shadow 993 Aug 7 08:34 /etc/shadowshadow 每行存密码哈希、最后修改时间、最短/最长有效期、过期警告天数等。密码策略相关的 chage 命令改的就是这里的字段。
/etc/group:用户组表
每行 4 段,重点是最后一段记录"这个组的成员(除主组外)":
webops:x:1000:bob| 字段 | 含义 |
|---|---|
webops | 组名 |
x | 组密码占位符(基本用不到) |
1000 | 组 ID(GID) |
bob | 附加成员列表(逗号分隔) |
所谓"主组"和"附加组":每个用户必须有一个主组(写入 /etc/passwd 的 GID),用户创建的文件默认属于主组;而附加组成员关系记在 /etc/group 里,用于授予额外的访问权限。
创建用户与组
创建组:groupadd
groupadd webops创建后可用 getent group webops 或 cat /etc/group 查看。改组名用 groupmod -n 新名 旧名,删组用 groupdel(组里还有用户作为主组时不能删)。
创建用户:useradd
useradd 是 Linux 下标准的添加用户命令,常用参数:
| 参数 | 作用 |
|---|---|
-m | 同时创建家目录 |
-s /bin/bash | 指定登录 Shell(默认是 /bin/sh,交互体验差) |
-G 组名 | 把用户加入附加组 |
-d 路径 | 指定家目录路径 |
-u 1001 | 手动指定 UID |
-e 日期 | 指定帐号过期日期 |
创建一个用户 bob,自动建家目录,并把它加入刚才的 webops 组:
groupadd webops
useradd -m -s /bin/bash -G webops bob
id bob
getent passwd bob
getent group webops实测输出如下:

图中三行输出对应了三层信息:
id bob:uid=1000(bob) gid=1001(bob) groups=1001(bob),1000(webops)——bob 的 UID 是 1000,主组是 1001,附加组里有webops(1000);getent passwd bob:显示/etc/passwd里那 7 段字段,Shell 已经是/bin/bash;getent group webops:最后一段bob表明 webops 的附加成员里有 bob。
注意这时的 bob 还不能登录——它还处于"无有效密码"状态,密码需要单独设置。
设置与查看密码
passwd 设置密码
passwd bob交互式输入两次密码即可。在脚本/远程场景下,可以用 chpasswd 批量设置:
echo "bob:DemoPass123!" | chpasswd查看密码状态:passwd -S
passwd -S bob输出形如 bob P 2026-08-10 0 99999 7 -1,含义依次是:用户名、状态码(P=已有可用密码,L=锁定,NP=无密码)、最后修改日期、最小有效期、最大有效期、警告天数、宽限天数。
密码有效期:chage
生产环境通常要求密码定期更换,用 chage 设置"密码每 90 天必须改一次":
chage -M 90 bob
chage -l bob
图中 passwd -S bob 显示 bob 处于 P(有密码)状态;chage -M 90 bob 把最大有效期设为 90 天后,chage -l bob 里 Password expires 变成 Nov 08, 2026(正好是今天 8 月 10 日加 90 天),Maximum number of days between password change 变为 90。常用参数:-m 最短天数、-M 最长天数、-W 过期前警告天数、-E 帐号过期日期。
修改用户:usermod
useradd 时参数没考虑全很常见,usermod 用来事后修改:
| 参数 | 作用 |
|---|---|
-aG 组名 | 追加到附加组(必须带 -a,否则会替换掉原有组) |
-s /bin/bash | 改登录 Shell |
-l 新名 | 改用户名 |
-L / -U | 锁定 / 解锁帐号 |
-e 日期 | 设置帐号过期 |
最常用的是 usermod -aG sudo bob 把用户加入 sudo 组——这是 Ubuntu 上给普通用户提权到管理员的标准做法(见下一节)。
sudo 权限体系
两种授予方式
Ubuntu 默认开箱即用的管理员机制是 sudo(superuser do):普通用户用 sudo 命令 以 root 身份执行单条命令,而不用长期切换到 root。
- 方式一:加入 sudo 组。Ubuntu 的
/etc/sudoers里默认有一行%sudo ALL=(ALL:ALL) ALL,意思就是"sudo 组的成员可以以任何用户身份执行任何命令"。所以一句usermod -aG sudo bob即可把 bob 变成管理员。 - 方式二:编辑 /etc/sudoers.d/ 下的规则文件。需要给某个用户"只授权个别命令"时,在
/etc/sudoers.d/里放一个小文件,比直接改/etc/sudoers更安全(更新系统时不易被覆盖)。
实测:加入 sudo 组 + 精确授权
usermod -aG sudo bob
id bob
printf 'bob ALL=(ALL) NOPASSWD:/usr/bin/apt\n' > /etc/sudoers.d/bob-ops
chmod 0440 /etc/sudoers.d/bob-ops
visudo -c
sudo -l -U bob
拆解图中输出:
id bob里出现了27(sudo),说明 bob 已进入 sudo 组;visudo -c是校验所有 sudo 规则语法的必做动作,三行parsed OK表示/etc/sudoers和/etc/sudoers.d/下所有文件都合法;sudo -l -U bob列出 bob 实际能执行什么:既有 sudo 组给的(ALL : ALL) ALL(全部命令),又有我们单独加的那条(ALL) NOPASSWD: /usr/bin/apt——即运行apt时不需要再输密码。规则可以累加。
关于那条自定义规则,补充三点:
bob ALL=(ALL) NOPASSWD:/usr/bin/apt- 语法是「用户 主机=(可以以谁的身份) 免密标记:命令」;
- 文件权限必须是 0440——第一次实测时我忘了
chmod 0440,visudo -c立刻报bad permissions, should be mode 0440。sudoers 目录下所有文件都必须 root 可读写、其他人只读; - 改完务必
visudo -c校验语法,一旦写坏,所有sudo都会失效。
查看某用户能执行什么
sudo -l -U bob # 查看 bob 的 sudo 权限
sudo -l # 查看当前用户的权限删除用户与组
userdel bob # 删除用户,保留家目录
userdel -r bob # 连家目录一起删
groupdel webops # 删除组userdel -r 会把家目录和邮件池一并清理,是清退离职人员时的标准做法。注意 userdel 前要确认该用户没有正在运行的进程,否则删了后进程仍以该 UID 运行。
常见坑
useradd忘了-m:默认不建家目录,用户登录后没有/home/bob。补救:usermod -m -d /home/bob bob。usermod -G不带-a:会把用户现有的附加组全部替换成新组,把用户踢出原有权限组。务必写成usermod -aG。- 新建用户无法登录:
useradd创建的用户默认无有效密码(shadow 里是!)。一定要先passwd bob或chpasswd。 - sudo 规则权限不对:
/etc/sudoers.d/下文件权限必须 0440,否则visudo -c报bad permissions。改 sudoers 一律用visudo,改完记得校验。 - 普通用户要进 sudo 组才轮不到"重启系统"权限:Ubuntu 上若用户不在 sudo 组、又没配置 sudoers 规则,
sudo会直接拒绝,报错明确说"用户不在 sudoers 中"。 - 删组前有成员:
groupdel某组时若还有用户以它为主组,会报cannot remove the primary group of user,需要先把这些用户的主组改到别处。
总结
用户与组是 Linux 权限体系的地基,和之前讲过的文件权限(chmod/ACL)、进程、日志共同构成服务器安全的最小闭环。上手路线:先理解 /etc/passwd、/etc/shadow、/etc/group 三张表,再用 useradd -m -s /bin/bash -G 建用户、passwd/chage 管密码、usermod -aG sudo 提权、visudo -c 校验规则,最后 userdel -r 清理。最核心的一句话:能用 sudo 单条提权就绝不用 root 长驻,配合用户分组,既安全又可审计。
评论 (0)
暂无评论,快来抢沙发吧!