getfacl 和 setfacl 是 linux 中处理 acl 的核心命令,用于精细化控制用户或组对文件/目录的读、写、执行权限;支持访问 acl 与默认 acl,需注意 mask 限制、文件系统挂载选项及权限继承规则。

getfacl 和 setfacl 是 Linux 中处理 ACL(访问控制列表)的核心命令,当传统 rwx 权限无法满足精细化授权需求时,它们能精准控制特定用户或组对文件/目录的读、写、执行权限,尤其适用于多角色协作、共享目录隔离、临时权限分配等场景。
理解 ACL 的基本结构与查看方式
ACL 分为两类条目:访问 ACL(实际生效的权限规则)和默认 ACL(仅对目录有效,用于新创建文件自动继承)。使用 getfacl 文件名 可完整展示所有权限信息,包括 owner、group、other 三类基础项,以及 user:xxx 和 group:yyy 等扩展条目。注意输出中 mask 行——它限制了所有命名用户/组权限的“上限”,即使 setfacl 给某用户加了 rwx,若 mask 不含 w,该用户仍无法写入。
用 setfacl 实现常见精细授权
setfacl 命令通过 -m(修改)、-x(删除)、-b(清空)等选项灵活操作 ACL:
- 给用户 alice 对 /shared/report.txt 添加只读权限:setfacl -m u:alice:r /shared/report.txt
- 为开发组 devgroup 授予 /var/www/html/ 目录及其未来新建内容的读写执行权:setfacl -Rm g:devgroup:rwX /var/www/html/ && setfacl -m d:g:devgroup:rwX /var/www/html/(注意大写 X:仅对目录或已有执行位的文件添加 x)
- 移除用户 bob 的自定义权限:setfacl -x u:bob /path/to/file
- 彻底清除所有扩展 ACL(保留基础权限):setfacl -b /path/to/file_or_dir
实战中必须注意的关键细节
ACL 并非万能,其行为受底层文件系统和挂载选项约束:
- 目标分区需启用 acl 挂载选项(如 ext4 默认支持,但某些 NFS 或旧系统可能禁用,可通过 mount | grep "acl" 确认)
- 设置默认 ACL 仅对目录有效,且只影响后续新建项,不影响已有子项——需配合 -R 手动递归设置
- 当 group 权限与命名 group 权限冲突时,Linux 按“用户匹配优先于组匹配”原则判断;若用户同时属多个组,任一匹配的 group 条目即可触发对应权限
- 使用 cp、mv 等命令复制文件时,ACL 默认不继承,需加 -a(归档模式)或 --preserve=mode,ownership,timestamps,context,links,xattr,all 显式保留
排查与验证 ACL 生效状态
权限未按预期工作?先用 getfacl 确认规则是否存在,再检查 mask 是否过窄。可借助 namei -l /path/to/file 查看路径各层权限及是否被父目录 deny。若涉及 Samba 或 FTP 服务,还需确认服务配置是否透传 ACL(如 Samba 需启用 vfs objects = acl_xattr)。简单测试法:切换到目标用户,用 touch testfile 或 cat targetfile 验证实际操作能力,比单纯看 getfacl 输出更可靠。










