使用setfacl -R前须确认文件系统启用acl选项、mask权限未限制实际生效、默认ACL需单独设置、符号链接需明确-L或-P参数,否则权限可能不生效或误设。

直接用 setfacl -R 递归设置目录树 ACL 很常见,但容易出错——不是命令写错,而是忽略挂载选项、mask 限制、默认 ACL 逻辑或符号链接行为。关键不在“怎么敲”,而在“敲之前确认什么”和“敲之后是否真生效”。
必须先确认文件系统已启用 ACL 支持
如果挂载时没带 acl 选项,setfacl -R 看似成功,实际权限不会起作用:
- 运行
mount | grep " /path/to/dir "(把/path/to/dir换成你的目标挂载点),输出中必须含acl - 若缺失,临时启用:执行
sudo mount -o remount,acl /mount/point - 要永久生效,需编辑
/etc/fstab,在对应行的挂载选项里追加,acl,例如:/dev/sdb1 /data ext4 defaults,acl 0 2
递归设置时 mask 很可能锁住你的权限
ACL 中的 mask 是一道隐形闸门:所有非属主、非属组的用户/组条目,实际生效权限 = 条目权限 & mask 权限。执行 setfacl -Rm 后,mask 会自动重算为当前所有 ACL 条目中的最大权限(不含属主/属组)——这常导致你设的 rw 被降为 r。
- 查当前 mask:运行
getfacl /dir | grep "mask::" - 强制放开 mask:加
--mask参数,例如setfacl -Rm u:alice:rw --mask /dir
或显式设定:setfacl -Rm m::rwx /dir - 想跳过自动重算(需自己确保 mask 足够):加
-n参数:setfacl -Rn -m u:alice:rw /dir
默认 ACL(-d)和显式 ACL(-R)必须分开处理
给目录设 setfacl -d 只影响**未来新建**的文件/子目录;而 -R 只影响**当前已存在**的内容。两者不互替,常需组合使用:
- 让已有全部内容获得权限:
setfacl -Rm u:alice:rwx /shared - 让后续新建文件自动继承该权限:
setfacl -dm u:alice:rwx /shared - 若要一步到位(现有 + 默认),可分两步执行,不可合并为一条命令
- 注意:
setfacl -k /shared删除的是默认 ACL,不是当前 ACL;清空全部扩展权限用-b
符号链接的默认行为容易误操作
setfacl -R 默认不进入符号链接指向的目录,但会修改符号链接文件本身的 ACL —— 这通常不是你想要的。
- 比如
ln -s /real/data mylink,执行setfacl -Rm u:carol:r mylink实际改的是mylink这个链接文件的权限,而非/real/data下的内容 - 如需跟随链接进入目标目录,加
-L参数:setfacl -RLm u:carol:r mylink - 如需完全跳过所有符号链接(包括文件和目录),加
-P参数


















