Linux权限继承需通过setfacl设置default ACL实现,仅对目录有效,控制新建文件/子目录的默认权限,受mask和umask限制,不作用于已有项或硬链接、符号链接。

Linux 中的权限继承不是默认行为,需要借助 setfacl 的默认 ACL(default ACL)机制来实现。普通文件或目录创建时不会自动继承父目录的访问控制列表,只有设置了 default ACL 后,新创建的子项才会按规则继承权限。
default ACL 是权限继承的核心
default ACL 只对目录有效,它不改变当前目录自身的访问权限,而是为该目录下未来新建的文件和子目录“预设”ACL 规则。新文件继承 default ACL 中的用户/组条目(不含 mask 和 other),新目录则同时继承 default ACL 和自己的 default ACL(可递归设置)。
- 设置 default ACL:
setfacl -d -m u:alice:rwx /shared,此后在/shared下新建的目录/文件都会默认赋予 alice 读写执行权限(具体生效取决于 mask) - 查看 default ACL:
getfacl /shared,输出中以default:开头的行即为 default 条目 - default ACL 不影响已有文件,只作用于后续新建项
mask 控制实际生效的权限上限
ACL 中的 mask 并非独立权限位,而是所有非 owner、non-group 类条目(如 named user、named group、default 条目)的实际权限“天花板”。即使你给某用户设置了 rwx,默认也可能因 mask 为 r-x 而只生效 r-x。
- 设置 mask:
setfacl -m m::rwx /shared,显式提升 mask 以确保其他 ACL 条目完整生效 - 当用
setfacl -m增加新用户权限时,setfacl通常会自动调整 mask;但手动修改 mask 或使用-n参数时需格外注意 - 文件的 mask 默认由其 group 权限推导,目录同理,但 default ACL 的 mask 需单独管理
递归设置 + default ACL 实现深层继承
仅对顶层目录设 default ACL 不足以覆盖多层嵌套。要让整个子树新建内容都继承统一策略,需结合递归(-R)与 default(-d):
- 一次性设置当前及所有现有子目录的 default ACL:
setfacl -R -d -m g:devs:rwX /project(注意大写 X:对目录执行 x,对文件仅当原有权限含 x 时才加 x) - 若还需同步更新现有文件/目录的访问 ACL(非 default),再补一条:
setfacl -R -m g:devs:rwX /project - 建议先用
--test参数试运行,避免误操作:setfacl -R --test -d -m u:audit:r-x /logs
常见陷阱与绕过限制的方法
ACL 继承有天然边界:硬链接不继承、符号链接不触发 ACL 检查、某些 NFS/CIFS 挂载可能忽略 default ACL。此外,umask 仍起作用——它会进一步过滤掉 default ACL 授予的权限。
- umask 为 002 时,新文件默认权限是 664,即使 default ACL 给了 rwx,实际文件也最多获得 rw-(因为 umask 屏蔽了 w 给 group/others)
- 想让新文件默认可执行?只能靠脚本或 inotify 监控 + 自动 chmod,ACL 本身无法绕过 umask
- 删除 default ACL:
setfacl -k /dir(清空 default 条目)或setfacl -x d:u:alice /dir(移除特定 default 用户)










