4. 创建与管理组:groupadd、groupmod、groupdel 命令详解与实战
聊到用户管理,就绕不开组的概念。说白了,组就是一群用户的集合。你想想看,如果公司有 100 个员工,要给每个人单独设置文件权限,那不得累死?有了组,把相同职责的人拉到一个组里,权限一配,完事。
我个人习惯,在搭建新服务器时,第一件事就是规划好用户和组的结构。别急着上手敲命令,先画个图,想清楚谁该在哪个组。嗯,这一步省了,后面全是坑。
核心思想:组是权限管理的容器。用户通过加入组,继承组的权限。管理组,就是在管理权限的边界。
4.1 groupadd:创建新组
groupadd 是用来创建新组的命令。语法很简单,但有几个参数我建议你记住。
groupadd [选项] 组名
常用选项:
| 选项 | 说明 | 实战场景 |
|---|---|---|
-g GID |
手动指定组的 GID | 需要统一 GID 范围时使用 |
-r |
创建系统组(GID < 1000) | 给系统服务创建专用组 |
-f |
如果组已存在,不报错直接退出 | 脚本中幂等操作 |
举个例子:
# 创建一个普通组
groupadd developers
# 指定 GID 创建组
groupadd -g 2000 ops
# 创建系统组
groupadd -r systemd-journal
我在项目中遇到过一个问题:有次部署监控系统,需要给 prometheus 用户创建一个专用组。我直接用 groupadd prometheus,结果系统自动分配了一个 1000+ 的 GID。后来和其他服务对接时,GID 对不上,排查了半天。从那以后,我养成了习惯——系统服务相关的组,一律用 -r 创建系统组,GID 控制在 1000 以内,干净利落。
小技巧:创建组之前,先用 cat /etc/group | grep 组名 检查一下组是否已存在。虽然 -f 可以避免报错,但提前确认更稳妥。
4.2 groupmod:修改组属性
组创建好了,有时候需要改名字或者改 GID。这时候 groupmod 就派上用场了。
groupmod [选项] 组名
常用选项:
| 选项 | 说明 | 注意点 |
|---|---|---|
-n 新组名 |
修改组名称 | 改完后,原来引用该组的权限配置会失效 |
-g 新GID |
修改组的 GID | 文件系统中的 GID 不会自动更新 |
实战示例:
# 修改组名
groupmod -n devops developers
# 修改 GID
groupmod -g 3000 ops
这里有个大坑,我曾经踩过。有一次我把一个组的 GID 从 2000 改成了 3000,结果这个组之前创建的所有文件,权限显示还是旧的 GID 2000。为什么呢?因为文件系统里存的是数字 GID,不是组名。你改了组,但文件不会跟着变。
避坑指南:修改组名或 GID 后,记得用 find / -gid 旧GID 扫描一下文件系统,把旧 GID 的文件找出来,用 chgrp 或 chown 更新掉。否则这些文件就成了「孤儿文件」,权限管理会出现漏洞。
另外,我个人建议:组名和 GID 一旦确定,尽量别改。你想想看,生产环境里可能有几十个服务、上百个脚本引用了这个组。改一次,牵一发动全身。真要改,提前发公告,挑个维护窗口期操作。
4.3 groupdel:删除组
删除组用 groupdel,语法最简单:
groupdel 组名
但要注意,如果这个组是某个用户的主组,你是删不掉的。系统会报错:
groupdel: cannot remove the primary group of user 'zhangsan'
这时候你得先把这个用户删掉,或者把用户的主组改成别的组,才能删除这个组。
我记得有一次,清理测试环境时,想删掉一个叫 temp_users 的组,结果一直报错。查了半天才发现,有个离职员工的账号还在,他的主组就是这个组。嗯,先处理用户,再删组,顺序不能乱。
安全操作流程:
- 先检查组内还有没有用户:
grep '组名' /etc/group - 如果有用户,先移走或删除用户
- 确认没有进程在使用该组:
ps -eo group | grep 组名 - 最后执行
groupdel 组名
4.4 实战:完整的组管理流程
光说不练假把式。我模拟一个真实场景:公司新来了一个运维团队,需要创建 ops 组,并配置好权限环境。
# 第一步:创建组,指定 GID 为 1500
groupadd -g 1500 ops
# 第二步:创建用户并加入组
useradd -m -G ops alice
useradd -m -G ops bob
# 第三步:验证组信息
cat /etc/group | grep ops
# 输出:ops:x:1500:alice,bob
# 第四步:创建共享目录,设置组权限
mkdir /data/ops
chown root:ops /data/ops
chmod 2770 /data/ops
# 2770 表示:设置 SGID 位,组内成员可以读写,其他人无权限
这个流程我用了很多年,基本没出过问题。核心就是:先组后用户,权限一次配到位。
4.5 知识体系图
下面这张图,帮你把本章的知识点串起来。看一眼就明白组管理的全貌。
这张图把三个命令和它们的核心参数、注意事项都串起来了。你保存下来,以后用的时候扫一眼就行。
4.6 避坑总结
最后,我把这些年踩过的坑总结一下,你遇到了直接对照排查:
- 改 GID 后文件权限异常——用
find / -gid 旧GID扫描修复 - 删组时提示主组冲突——先处理用户,再删组
- 创建系统组忘了加
-r——GID 跑到 1000+,和服务对接时出问题 - 组名改完后脚本报错——脚本里写死了旧组名,记得全局替换
组管理说白了就是三个命令,但用好了,权限管理就稳了一半。嗯,今天就聊到这儿,你动手试试看。