批量设置acl需三步:先确认并启用文件系统acl支持,再用setfacl -r -m为现有内容补权限,最后用setfacl -d -m设置默认acl以确保新文件自动继承。

在 Linux 系统中,用 setfacl -R 递归批量修改 ACL 规则,关键不是简单加 -R 就完事,而是要明确目标:是给现有文件补权限,还是让新文件自动继承,或者两者兼顾。操作前务必确认文件系统已启用 ACL 支持。
确认并确保 ACL 已启用
执行以下命令检查当前挂载点是否启用了 acl:
mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep acl
若无输出,说明未启用。可临时启用(重启失效):
sudo mount -o remount,acl /mount/point
永久生效需编辑 /etc/fstab,在对应分区的挂载选项中加入 acl(如 defaults,acl),再执行 sudo mount -o remount /mount/point。
递归添加或修改 ACL 权限(针对已有内容)
使用 -R 和 -m 组合,为目录下所有现存子项统一设置 ACL:
- 给组 devteam 对 /srv/app 及其全部子文件、子目录赋予读写执行权限:
sudo setfacl -R -m g:devteam:rwx /srv/app - 给用户 alice 添加只读权限:
sudo setfacl -R -m u:alice:r-- /srv/app - 同时设置多个规则(用逗号分隔):
sudo setfacl -R -m u:alice:rx,g:devteam:rwx /srv/app
注意:-R 会遍历所有层级,但不会影响符号链接本身(默认跳过链接目标);如需跟踪链接目录,加 -L;如需完全跳过所有链接,加 -P。
设置默认 ACL(控制新建内容自动继承)
仅靠 -R -m 无法让未来创建的文件/子目录自动获得权限。必须用 -d 设置默认规则:
- 使新创建的文件和子目录默认继承组 devteam 的 rwx 权限:
sudo setfacl -d -m g:devteam:rwx /srv/app - 默认规则只作用于目录,且需配合目录自身权限(如 chmod 770 /srv/app)才能生效
- 验证是否设置成功:
getfacl /srv/app | grep "default:" 应看到类似 default:group:devteam:rwx
清理冗余与固化基线(推荐用于批量运维)
长期运行后 ACL 条目可能杂乱,建议先清空再重设,确保策略清晰可维护:
- 清除所有扩展 ACL(保留基础 u/g/o 权限):
sudo setfacl -R -b /srv/app - 重新设置默认规则和现有内容 ACL:
sudo setfacl -d -m g:devteam:rwx /srv/app
sudo setfacl -R -m g:devteam:rwx /srv/app - 可将上述步骤封装为脚本,配合定时任务或部署流程定期校验
执行后用 ls -ld /srv/app 查看权限末尾是否出现 +,表示 ACL 已生效;用 getfacl -R /srv/app | head -20 快速抽查几处确认一致性。











