acl权限与umask在新建文件时协同作用:umask先过滤初始权限(目录777/文件666取反后与),default acl再叠加生效,最终受mask逻辑与限制。

ACL 权限与 umask 在新建文件时不是“冲突”,而是分阶段、有先后顺序的协同作用:umask 先过滤初始权限,ACL 默认规则再叠加生效,最终受 mask 限制。理解这个链条,才能准确预判新文件的真实权限。
umask 是第一道过滤器
新建文件时,内核先根据文件类型赋予一个“基础权限”(目录默认 777,普通文件默认 666),然后立即用当前用户的 umask 做“取反后与”运算,得到实际的初始权限位:
- 例如 umask=002 → ~002 = 775(目录)或 664(文件)→ 初始权限为 drwxrwxr-x 或 -rw-rw-r--
- umask 不是“或”,也不是直接减法;它是屏蔽位,会永久移除对应权限位,后续 ACL 无法恢复被 umask 过滤掉的部分
- 如果用户 umask 是 007,即使你设了 default ACL u:alice:rwx,新文件对 group 和 other 也只剩 rwx & ~007 = rwxrwx---,但 others 实际是 ---,alice 的 ACL 条目依然存在,只是没机会体现
默认 ACL 是第二道增强层
在 umask 处理完之后,系统检查父目录是否设置了 default ACL。若有,则把其中匹配的 user:、group: 条目叠加到刚生成的初始权限上(不是覆盖,是补足):
- 比如父目录 default ACL 含 u:alice:rwX,umask 后初始权限是 -rw-rw-r--,那么新文件会额外获得 alice:rw-(X 对普通文件不生效)
- 注意:default ACL 不改变 umask 的结果,只在其基础上追加权限;它不能绕过 umask 把被屏蔽的位“变回来”
- 若 umask 过严(如 077),导致 group/others 全无权限,而 default ACL 又只给了特定用户,那新文件可能只有 owner + ACL 用户能访问,其他人完全不可见
mask 是最终生效的硬性上限
ACL 条目写的是“想给什么”,但真正能用多少,由 mask 决定。新建文件的 mask 值通常继承自父目录的 default mask,或由系统自动计算:
- mask::rwx 表示所有命名 ACL 条目(user:、group:、named group)最大只能达到 rwx
- mask::r-- 表示哪怕你写了 u:alice:rwx,alice 实际也只有 r-(读)
- setfacl -d -m 设置 default ACL 时,系统一般会自动重算并更新父目录的 default mask;但若之后手动 chmod 改了目录权限,mask 可能滞后,需用 setfacl --recompute-mask 主动刷新
验证真实权限的三步法
别只看 getfacl 输出的 default 条目,要动手验证:
- 切换到目标用户(su - alice),在目标目录下 touch testfile && mkdir testdir
- 执行 getfacl testfile 和 getfacl testdir,确认 user:alice: 行存在且权限符合预期
- 重点看输出里的 mask:: 行——它和 user:alice: 行做逻辑与,就是 alice 实际能用的权限











