直接回答:主组在 /etc/passwd 里、附加组在 /etc/group 里,id 和 groups 都能看全;想让目录下新建文件自动继承目录的组,给目录加 setgid 位(chmod g+s)就行。

一、查看用户属于哪些组

1
2
3
id alice          # uid、gid 和所有附加组,最直接
groups alice # 同样的信息,输出更好读
getent group | grep alice

id 认主组,groups 认附加组,两个都是看"某个用户有什么组"的正解。

二、查看某个组里有哪些用户

1
getent group devs

注意坑:/etc/group(以及 getent group)里只列了把 devs 当附加组的用户。把 devs 当主组的用户不会出现在这一行,得再查一遍:

1
2
3
4
5
# 先取组 ID
gid=$(getent group devs | cut -d: -f3)

# 主组是 devs 的用户
getent passwd | awk -F: -v g="$gid" '$4==g {print $1}'

两条结果合起来才是完整名单。装了 libuser 或 members 的话也可以用 lid -g devs、members devs。

三、把用户加进组 / 移出组

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo groupadd devs

# -a 表示追加,不能漏,漏了会覆盖她原有的附加组
sudo usermod -aG devs alice

# 当前会话临时生效;长期生效要退出重新登录
newgrp devs

# 移出组
sudo gpasswd -d alice devs

# 把 devs 设为 alice 的主组(谨慎,会影响新建文件的默认属组)
sudo usermod -g devs alice

组变更不会影响已经登录的会话,也不会影响已经启动的服务,需要重新登录或重启服务才会带上新组。

四、给文件/目录设置组成员权限

1
2
3
4
5
6
7
8
9
10
11
# 属组改成 devs
sudo chgrp -R devs /srv/project

# 或一步指定属主 + 属组
sudo chown -R alice:devs /srv/project

# 属主和属组读写执行,其他人无权。2 是 setgid,见下一节
sudo chmod -R 2770 /srv/project

# 只给组补权限、不动其他位。大写 X 只给目录和本来就有执行权限的文件
sudo chmod -R g+rwX /srv/project

用 g+rwX 比 g+rwx 安全,不会把普通文本文件误变成可执行文件。

五、新建内容继承属组:setgid 位

1
2
sudo chgrp devs /srv/project
sudo chmod g+s /srv/project # 目录上出现 s 标志

之后在 /srv/project 下新建的文件和子目录,属组自动是 devs;新建的子目录还会继续带 setgid,一路继承下去。

但它只继承属组,不继承权限。 新文件的权限仍然由 umask 决定,默认 umask 022 下组只有读权限,没有写权限。

六、新建内容继承权限:默认 ACL

默认 ACL 才是真正意义上的"权限继承",只对目录有效:

1
2
3
4
5
6
7
8
# 现有内容:给 devs 组加读写执行
sudo setfacl -R -m g:devs:rwX /srv/project

# 默认 ACL:决定新建内容的权限
sudo setfacl -R -d -m g:devs:rwX /srv/project

# 查看结果
getfacl /srv/project

默认 ACL 不改变属组,只管权限,所以实际用的时候跟 setgid 搭配:

1
2
3
sudo chmod g+s /srv/project
sudo setfacl -R -m g:devs:rwX /srv/project
sudo setfacl -R -d -m g:devs:rwX /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

这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!