直接回答:主组在 /etc/passwd 里、附加组在 /etc/group 里,id 和 groups 都能看全;想让目录下新建文件自动继承目录的组,给目录加 setgid 位(chmod g+s)就行。
一、查看用户属于哪些组
1 | id alice # uid、gid 和所有附加组,最直接 |
id 认主组,groups 认附加组,两个都是看"某个用户有什么组"的正解。
二、查看某个组里有哪些用户
1 | getent group devs |
注意坑:/etc/group(以及 getent group)里只列了把 devs 当附加组的用户。把 devs 当主组的用户不会出现在这一行,得再查一遍:
1 | 先取组 ID |
两条结果合起来才是完整名单。装了 libuser 或 members 的话也可以用 lid -g devs、members devs。
三、把用户加进组 / 移出组
1 | sudo groupadd devs |
组变更不会影响已经登录的会话,也不会影响已经启动的服务,需要重新登录或重启服务才会带上新组。
四、给文件/目录设置组成员权限
1 | 属组改成 devs |
用 g+rwX 比 g+rwx 安全,不会把普通文本文件误变成可执行文件。
五、新建内容继承属组:setgid 位
1 | sudo chgrp devs /srv/project |
之后在 /srv/project 下新建的文件和子目录,属组自动是 devs;新建的子目录还会继续带 setgid,一路继承下去。
但它只继承属组,不继承权限。 新文件的权限仍然由 umask 决定,默认 umask 022 下组只有读权限,没有写权限。
六、新建内容继承权限:默认 ACL
默认 ACL 才是真正意义上的"权限继承",只对目录有效:
1 | 现有内容:给 devs 组加读写执行 |
默认 ACL 不改变属组,只管权限,所以实际用的时候跟 setgid 搭配:
1 | sudo chmod g+s /srv/project |
这样新文件属组是 devs,组权限也是继承来的,等于一次性解决"组内共享目录"的需求。
七、umask 与继承的关系
- 新建文件的基础权限是 666,目录是 777,再被 umask 削掉一部分。
- 默认
umask 022:新建文件 644、目录 755,组只有读(目录是读+进入)。 - 想让组默认有写权限,可以设
umask 002:用户级写进~/.bashrc,系统级写进/etc/profile或/etc/profile.d/。 - 默认 ACL 存在时,会覆盖 umask 对相应位的影响,两者不用同时纠结。
八、常见坑
setfacl属于acl包,没有的话sudo apt install acl;ext4 默认支持 ACL,可用mount | grep acl确认。- 权限继承只在创建时生效,已经存在的文件要
-R手动刷一遍。 - 目录的
x位代表"能否进入/遍历",组没有x时,即使有r也读不到里面的文件。 - setgid 加在文件上含义不同(以属组身份执行),基本用不到,只加在目录上。
chgrp、chown、chmod默认只有 root 能执行,普通用户操作会报Operation not permitted。
参考
- 属主/属组/chmod 基础写法见同目录
linux修改文件所有者和文件所在组.md - 用户增删见同目录
新增一个用户.md - ACL 细节可查
man acl、man setfacl
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。