Linux中的用户组,本质是“具有一样权限的用户集合”。

通过将用户归入不同组,管理员可实现:
- 批量授权:给一个组分配权限后,组内所有用户自动获得该权限(如给dev组授予/project目录的读写权限,组内所有开发人员均可访问);
- 简化管理:当新增用户时,只需将其加入对应组,无需重复配置权限(如新增开发人员,加入dev组即可获得开发所需权限);
- 权限隔离:不同组对应不同权限范围(如dev组负责开发目录,test组负责测试目录),避免用户越权访问。
每个Linux用户至少属于一个“主组”,最多可加入15个“附加组”,两者的作用与优先级不同:
- 主组(Primary Group):用户创建时默认生成的组,与用户名同名(如user1的主组默认是user1),用户创建文件时,文件的默认所属组即为用户的主组;
- 附加组(Supplementary Group):用户后续加入的组,用于获取额外权限(如user1加入dev组后,可获得dev组的共享目录访问权限)。
通过id 用户名命令可查看用户的组归属,例如查看user2的组信息:
id user2
输出类似“uid=1002(user2) gid=1002(user2) groups=1002(user2),1003(dev),1004(test)”,其中:
- gid=1002(user2):主组ID(GID)与主组名;
- groups=1002(user2),1003(dev),1004(test):主组+附加组列表(主组始终在第一位)。
组名与GID
每个用户组有两个核心标识,如同用户的“姓名”与“身份证号”:
- 组名(Group Name):用户可识别的名称(如dev、test),需符合命名规则(字母开头,可含数字、下划线,长度不超过32字符);
- 组ID(GID,Group ID):系统识别组的数字标识,与用户UID对应,具有唯一性:
- 系统组(如root、bin):GID一般为0-999(root组GID固定为0);
- 普通用户组(如dev、test):GID从1000开始(与普通用户UID起始范围一致)。
通过cat /etc/group命令可查看系统中所有用户组的信息,该文件每一行对应一个组,格式为“组名:密码占位符:GID:组内用户列表”,例如:
dev:x:1003:user2,user3
test:x:1004:user2
表明dev组(GID=1003)包含user2和user3,test组(GID=1004)包含user2。
groupadd
groupadd命令的核心功能是“创建新用户组”,并可通过选项自定义组的GID、是否为系统组等属性。默认情况下,groupadd会根据系统配置(/etc/login.defs)自动分配未使用的GID(普通组从1000开始,系统组从1-999开始),语法格式为:
groupadd [选项] 组名
注意:创建用户组需root权限,普通用户需通过sudo执行(如sudo groupadd dev)。
(1)默认创建:不指定选项的基础用法
若无需自定义GID或组类型,直接执行groupadd 组名即可创建普通用户组,系统会自动分配GID(从1000开始)。例如创建dev组:
groupadd dev
执行后,可通过以下两种方式验证创建结果:
- 查看/etc/group文件:cat /etc/group | grep dev,输出类似“dev:x:1003:”(1003为系统自动分配的GID,冒号后为空表明组内暂无用户);
- 查看组详细信息:getent group dev,输出与/etc/group一致,可快速确认组是否存在。
(2)-g:指定自定义GID
默认情况下,groupadd自动分配GID,但在实际管理中(如统一多台服务器的组配置),常需指定固定GID,避免GID不一致导致权限问题。使用-g选项(g即“gid”)可自定义GID,需确保指定的GID未被其他组占用。
例如创建test组,并指定GID为1004:
groupadd -g 1004 test
验证:cat /etc/group | grep test,输出“test:x:1004:”,表明GID已按指定值设置。若指定的GID已存在(如1003已被dev组占用),执行会报错“GID '1003' already exists”,需更换未占用的GID。
(3)-r:创建系统组
系统组(GID范围1-999)一般用于运行系统服务(如nginx、mysql服务对应的用户组),与普通组的区别在于GID范围不同,且默认不用于普通用户。使用-r选项(r即“system”)可创建系统组,系统会自动分配1-999范围内的未使用GID。
例如创建nginx系统组(用于运行nginx服务):
groupadd -r nginx
验证:cat /etc/group | grep nginx,输出类似“nginx:x:998:”(GID为998,属于1-999的系统组范围)。若需同时指定系统组的GID(如997),可组合-r与-g选项:
groupadd -r -g 997 mysql
执行后,mysql组为系统组,GID固定为997,适合服务用户组的标准化配置。
(4)-o:允许GID不唯一(特殊场景)
默认情况下,groupadd要求GID唯一(避免权限混淆),但在极少数特殊场景(如兼容旧系统的非标准配置),需创建GID重复的组,此时可使用-o选项(o即“non-unique”)允许GID不唯一。
例如已有dev组(GID=1003),需创建dev_backup组并复用GID=1003:
groupadd -o -g 1003 dev_backup
验证:cat /etc/group | grep -E “dev|dev_backup”,输出“dev:x:1003:”和“dev_backup:x:1003:”,表明两个组GID一样。注意:此选项会破坏GID的唯一性,可能导致权限判断混乱,非必要不提议使用,仅在特殊兼容场景下谨慎使用。
组管理的配套操作
groupadd仅负责创建组,实际管理中还需配合其他命令完成“添加用户到组”“修改组属性”“删除组”等操作,形成完整的组管理流程。
1. 将用户加入组
创建组后,需将用户加入组才能实现权限共享,主要通过usermod命令(之前讲解过的用户修改命令)完成:
- 加入主组:使用usermod -g 组名 用户名,将用户的主组改为指定组(原主组不变,但用户默认组变为新组);
- 加入附加组:使用usermod -G 组名 用户名(覆盖原有附加组)或usermod -aG 组名 用户名(追加新附加组,保留原有附加组)。
例如:
- 将user4的主组改为dev组:sudo usermod -g dev user4;
- 将user4追加到test附加组:sudo usermod -aG test user4; 验证:id user4,输出“uid=1004(user4) gid=1003(dev) groups=1003(dev),1004(test)”,表明用户已加入目标组。
2. 修改组属性
若需修改已创建组的属性(如组名、GID),需使用groupmod命令(类似用户管理中的usermod),核心选项与groupadd类似:
- 修改组名:groupmod -n 新组名 旧组名(如将dev_old改为dev_new:sudo groupmod -n dev_new dev_old);
- 修改GID:groupmod -g 新GID 组名(如将test组GID改为1005:sudo groupmod -g 1005 test); 验证:cat /etc/group | grep 新组名/新GID,确认属性修改成功。
3. 删除组
当组不再使用时,需用groupdel命令删除组,语法为groupdel 组名。注意:删除组前需确保组内无用户(若有用户,需先将用户移出组或删除用户),且组不是任何用户的主组。
例如删除dev_old组:
# 先确认组内无用户:cat /etc/group | grep dev_old(冒号后为空表明无用户)
sudo groupdel dev_old
验证:getent group dev_old无输出,表明组已删除。若组内有用户或为用户主组,执行会报错(如“groupdel: cannot remove the primary group of user 'user4'”),需先处理用户归属问题。
4. 查看用户组相关信息
日常管理中,需频繁查询组信息,除了cat /etc/group和id 用户名,还有以下实用命令:
- 查看当前用户所属组:groups(无需参数,输出当前登录用户的所有组);
- 查看指定用户所属组:groups 用户名(如groups user4,输出“user4 : dev test”);
- 查看组内所有用户:getent group 组名(如getent group dev,输出“dev:x:1003:user4,user5”,冒号后为组内用户列表)。
















暂无评论内容