-m用于增/改acl权限(支持指定权限位),-x仅删除整条acl条目(不接受权限位,只认u:name或g:name);chmod会重设mask导致acl部分权限失效;default acl生效需父目录有x权限且mask允许对应权限透出。

setfacl 命令加 -m 和 -x 参数的区别在哪
加权限用 -m,删权限用 -x,不是所有场景都能互换。比如给用户 alice 加读写权,得写 setfacl -m u:alice:rw file.txt;如果误用 -x u:alice,它会把 alice 的整条 ACL 条目干掉——哪怕她原本还有执行权,也一并消失。
常见错误现象:setfacl -x u:alice:rw file.txt 报错 “Invalid argument”,因为 -x 后不接受权限位,只接受 u:name 或 g:name 这种主体标识。
-
-m支持增/改:没这条就加,有就覆盖(比如u:alice:r→u:alice:rw) -
-x只删整条:不能指定删某几个权限,也不能删 mask(mask 得用-m m::覆盖) - 批量操作时,
-m可接多个规则,用逗号分隔:setfacl -m u:alice:r,g:devs:rx file.txt
为什么 chmod 后 ACL 权限突然失效了
因为 chmod 会重算并覆盖 mask 字段。ACL 实际生效的权限 = 用户/组权限 & mask。当你运行 chmod 600 file.txt,系统自动把 mask 设为 rw-,哪怕之前 ACL 给 bob 设了 rwx,现在他也只能读写——执行位被 mask 挡住了。
使用场景:运维脚本里混用 chmod 和 setfacl 是高频翻车点,尤其在部署阶段自动 chown/chmod 后发现 ACL 不生效。
- 查当前 mask:用
getfacl file.txt看输出里mask::那行 - 修复方法:手动重设 mask,比如
setfacl -m m::rwx file.txt - 更稳妥的做法:用
setfacl --set一次性重置全部 ACL(含 mask),避免残留旧 mask
default ACL 在子目录里不继承?检查父目录的 mask 和目录属性
default ACL 只对新创建的文件/子目录生效,但前提是父目录本身有执行权限(x),且 mask 允许对应权限透出。一个常见陷阱是:父目录权限是 drw-r--r--(缺 x),这时即使设了 setfacl -d -m g:team:rwx parent/,新建的子目录也不会带 default ACL。
性能影响:default ACL 不增加访问开销,但每次 mkdir 或 touch 时内核要复制 default 条目,对海量小文件创建有微乎其微的延迟,可忽略。
- 必须确保父目录有
x权限(对目录是“进入”能力,不是“执行”) - 检查父目录的 mask 是否包含你要继承的权限位,比如 default 设了
rwx,但 mask 是r-x,那新文件最多只有rw- - default ACL 不影响已有文件,只作用于后续创建项
getfacl 输出里出现 # file: 和 # owner: 是什么
那是 getfacl 的元信息行,不是 ACL 规则本身,也不参与权限计算。它们只是方便你确认当前看的是哪个路径、谁 owns 它——尤其在管道处理或脚本解析时容易误当成 ACL 条目。
容易踩的坑:写自动化脚本提取 ACL 规则时,直接用 grep ^user 或 awk '/^user/{print}' 会漏掉以 user: 开头但前面有空格的行(比如缩进后的条目),更稳的方式是过滤掉所有 ^# 和空行,再取非空首字段为 user:、group:、mask: 的行。
- 真正生效的 ACL 行一定以
user:、group:、mask:、other:开头(注意冒号) -
# file:行里的路径可能含空格或特殊字符,别直接拼进 shell 命令 - 脚本中建议用
getfacl --omit-header(较新版本支持)跳过这些注释行
事情说清了就结束










