Linux ACL默认权限和掩码是权限生效的关键机制:默认ACL仅对新文件/目录生效且仅目录可设;掩码是所有非属主、非other条目的权限上限,chmod会自动重算mask。

Linux ACL 默认权限和掩码不是可选配置,而是决定权限是否真正生效的关键机制。很多权限“设了却没用”,问题往往出在默认规则未配或掩码被忽略。
默认ACL只对新文件/目录生效
在目录上设置 default ACL(用 -d -m),是为了让后续创建的文件和子目录自动继承权限。它不会改变已有内容的权限。
- 正确写法:
setfacl -d -m u:deploy:rwx /data/shared - 效果:之后在
/data/shared下新建的文件,属主 deploy 自动获得 rwx;新建目录还会继承 default 规则本身 - 注意:普通文件不支持 default ACL,只有目录可以设;若目录已存在但没设 default,老文件不会“突然获得”新规则
掩码(mask)是实际权限的天花板
ACL 中的 mask 控制所有非属主、非other条目的最大有效权限。哪怕你给用户设了 rwx,只要 mask 是 r-x,实际就只能读和执行。
- 查看时,
getfacl输出中mask::r-x这一行就是当前限制 - 修改 mask 的常用方式:
setfacl -m m::rwx /path(显式提升上限) - 更稳妥的做法:执行
setfacl -R -m u:jenkins:rwx /path后,再运行setfacl -R -m m::rwx /path,确保 mask 跟得上新增权限 - 特别提醒:chmod 修改组权限会自动重算 mask,比如
chmod 775 dir可能把 mask 改成 rwx,而chmod 755 dir会压低到 r-x
默认ACL + 掩码组合配置示例
想让一个共享目录既支持团队协作,又保障新文件自动有合理权限,推荐这样操作:
- 先设好基础权限:
chmod 2770 /srv/project(SGID 确保新建文件属组一致) - 添加默认 ACL:
setfacl -d -m u:dev:rwx,g:qa:rx /srv/project - 同步更新 mask:
setfacl -m m::rwx /srv/project(否则 dev 和 qa 的权限可能被截断) - 验证:
getfacl /srv/project应同时看到default:user:dev:rwx和mask::rwx
常见失效场景与检查点
权限看似设了却不生效?优先排查这三项:
- 目标是不是目录?
-d参数只对目录有效,对文件使用会静默失败 - 是否漏掉
mask?用getfacl看输出里有没有#effective:字样——有就说明某条权限被 mask 削弱了 - 新建测试文件验证 default:在目录里
touch test.txt,再getfacl test.txt,确认其 ACL 是否含预期的 default 条目

















