可直接用getfacl a | setfacl --restore=- b克隆acl权限,该方式自动处理访问acl、默认acl及mask值,避免手动-m出错;克隆目录时默认acl仅对新创建项生效,已有内容需额外递归恢复。

用 getfacl 配合管道符和 setfacl --restore,可以将 A 文件的 ACL 权限完整复制给 B 文件(包括访问 ACL 和默认 ACL,若存在),这是最可靠、最通用的做法。
核心命令:一行完成克隆
执行以下命令即可:
getfacl A | setfacl --restore=- B
其中 --restore=- 表示从标准输入(即管道传来的 getfacl 输出)读取 ACL 规则,并应用到文件 B 上。
为什么不能直接用 -m 或 -x?
直接用 setfacl -m 手动拼权限容易出错,原因包括:
- ACL 条目顺序不固定(如 user、group、mask、default 等混排),手动提取易遗漏
- 默认 ACL(
d:user:xxx:rwx)只对目录有效,且需单独处理;普通-m不会自动识别并设置默认项 - mask 值必须与实际权限匹配,手动设错会导致权限失效(例如给了 rwx 却没更新 mask,实际仍无写权)
- 空行、注释、#file 行等 getfacl 输出格式,
--restore能自动跳过或解析,而-m无法处理
克隆目录时要注意继承性
如果 A 是目录,且含默认 ACL(d: 开头的条目),那么克隆到 B 目录后:
- B 会获得相同的默认 ACL,新创建的子文件/子目录将自动继承这些权限
- 但 B 已有内容(子文件、子目录)不会自动获得 ACL —— 默认 ACL 只对未来新建项生效
- 如需同步已有内容,可额外加
-R递归应用访问 ACL:getfacl A | setfacl --restore=- B && setfacl -R --restore=- A B(注意:这需先备份 A 的完整 ACL,再分别恢复)
验证是否成功
执行完克隆后,建议立即验证:
-
getfacl A和getfacl B对比输出是否一致(忽略 #file、#owner 等路径/元信息行) - 检查 B 权限末尾是否有
+(如-rw-rw-r--+),有则说明 ACL 已生效 - 用目标用户实际测试读写操作,避免 mask 限制导致“看似赋权实则无效”











