修改用户主组必须用 -g 而非 -g:-g 设置 primary group(决定新建文件默认属组,对应 /etc/passwd 第4字段),-g 仅管理 supplementary groups;变更后需重新登录才生效,当前会话组信息不会刷新。

修改用户主组必须用 -g,不是 -G
很多人误以为 usermod -G 能改主组,其实它只管附加组。主组(primary group)是用户创建文件时默认归属的组,由 /etc/passwd 中第4字段决定,必须用 -g 显式指定。
执行前确认目标组已存在:getent group 组名;不存在就先 sudo groupadd 组名。
-
sudo usermod -g docker john—— 把用户john的主组设为docker - 主组变更后,该用户新建的文件属组会自动变成
docker,但已有文件权限不受影响 - 如果目标组当前已有其他用户,
usermod -g不会影响那些用户的主组设置
id 和 groups 输出不一致?那是主组和附加组的区别
id 用户名 显示的是完整组关系:第一行 uid/gid 中的 gid 就是主组 ID,后面 groups=... 列出的是所有组(含主组 + 所有附加组);而 groups 用户名 只输出组名列表,且把主组放在最前面。
例如:id john 返回 uid=1001(john) gid=993(docker) groups=993(docker),10(wheel),说明主组是 docker,附加组是 wheel;groups john 输出 docker wheel。
- 主组变更后,
id的gid字段会立刻更新,但当前 shell 会话中$GROUPS环境变量不会刷新 - 验证是否生效,必须新开终端或
su - john切换会话 -
newgrp可临时切换主组,但仅对当前 shell 有效,且需目标组在/etc/group中有密码(通常不用)
修改主组后,用户已登录会话里的权限行为不变
Linux 不在运行时动态重载用户组信息。用户登录后,内核凭初始认证时读取的组数据(来自 /etc/passwd 和 /etc/group)生成凭证(credentials),后续不会重新拉取。
- 即使你刚执行了
sudo usermod -g newgroup user,该用户当前终端里touch test.txt创建的文件仍属旧主组 - 必须退出所有会话(包括 SSH、图形界面、screen/tmux 会话),再重新登录才生效
- systemd 用户服务(如
dbus、gnome-keyring)也不会自动感知变更,重启 session bus 也没用,只能重登
批量修改主组要小心 /etc/passwd 的 gid 冲突
直接编辑 /etc/passwd 改第4字段(gid)虽可行,但风险高:若填错数字,导致 gid 不存在或与系统关键组冲突(如 gid 0 是 root),可能使用户无法登录或权限异常。
- 优先用
usermod -g,它会校验组存在性并原子更新 - 批量操作时,先用
getent group 组名 | cut -d: -f3获取目标 gid,再传给usermod -g - 切勿手动修改
/etc/shadow或/etc/gshadow,它们与主组无关
主组变更真正生效的临界点,永远是下一次登录——不是命令执行完,也不是 id 显示变了,而是你关掉当前 terminal、输密码重新进来的那一刻。











