Linux ACL 是对传统 ugo 权限的精细化补充而非替代,用于为非属主、非属组的特定用户或组单独赋权,解决如临时授权、跨组精细管控等 ugo 无法应对的问题,依赖 mask 限制实际权限并以+号标识启用状态。

Linux 的 ACL 不是用来取代传统 ugo 权限的,而是叠加在它之上的精细化补充。当你需要给某个非属主、非属组的用户单独赋权,又不想动文件归属或放宽“其他人”权限时,ACL 就是唯一稳妥的解法。
ACL 解决什么问题
传统权限只有三类主体:所有者(u)、所属组(g)、其他人(o)。一旦出现以下情况,ugo 就捉襟见肘:
- 让运维人员只读日志,但不让他属于 log 组,也不希望其他人都能读
- 临时给审计员开放某目录查看权限,又不能把他加进业务组
- 同一目录下,不同子目录需对不同团队开放不同权限,但所有文件都属于同一个主组
启用和确认 ACL 支持
ACL 功能依赖文件系统挂载选项,不是内核开关。即使系统默认支持,也要验证实际挂载状态:
- 运行 mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep acl,输出含 acl 才算真正启用
- 若无输出,可临时启用:sudo mount -o remount,acl /path
- 永久生效需编辑 /etc/fstab,在对应分区 options 字段追加 acl(如 defaults,acl),再执行 sudo mount -o remount /path
设置与继承 ACL 规则
核心命令是 setfacl,常用组合如下:
- 给单个用户读写权限:setfacl -m u:alice:rwX /shared/report(X 表示仅对目录和已有执行位的文件加 x)
- 为组授权:setfacl -m g:devteam:rwx /var/www
- 设置默认 ACL(新建项自动继承):setfacl -d -m u:bob:rx,g:admins:rwx /project
- 递归应用到现有内容:setfacl -R -m u:charlie:r /docs
执行后用 ls -l 查看,权限末尾出现 +(如 drwxr-xr-x+)即表示已启用 ACL;用 getfacl /path 可看到完整规则,含 default: 行说明默认规则已生效。
关键细节:mask 与 umask 的影响
ACL 权限不会直接生效,中间有两道控制:
- mask 是命名用户/组权限的“天花板”。例如设置了 user:alice:rwx,但 mask::r-x,那 alice 实际只有 rx 权限。通常无需手动干预,但若用 chmod 修改过权限,可用 setfacl --recompute-mask /path 重算
- umask 控制新建文件的初始权限。协作目录建议统一设为 002(目录 775,文件 664),可在 /etc/profile 或用户 ~/.bashrc 中添加 umask 002


















