linux acl可在不改动属主和主组前提下为特定用户或组单独授权,需确认文件系统挂载时启用acl选项,通过setfacl -d -m设置默认acl实现新文件自动继承,并配合umask与mask确保权限准确落地。

Linux ACL 能在不改动文件属主和主组的前提下,为特定用户或组单独授权,解决多用户协作中“既要安全又要灵活”的核心矛盾。关键不是堆砌权限,而是让新文件自动继承、权限不被 umask 或 mask 意外截断。
确认并启用文件系统 ACL 支持
ACL 功能依赖挂载选项,不是内核开关。即使系统默认支持,也要验证实际挂载状态:
- 运行 mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep acl,输出含 acl 才算真正启用
- 若无输出,临时启用:比如对 /shared 目录执行 sudo mount -o remount,acl /shared
- 永久生效需编辑 /etc/fstab,在对应分区的 options 字段追加 acl(如 defaults,acl),再执行 sudo mount -o remount /shared
设置目录默认 ACL 实现自动继承
默认 ACL 是协作目录的基石,它只影响新建文件/子目录,不改变已有内容:
- 命令格式:setfacl -d -m u:用户名:权限,g:组名:权限 /path/to/dir
- 权限建议用 rwx 或 rwX(大写 X:仅对目录和已有执行位的文件加 x)
- 例如:setfacl -d -m u:alice:rwX,g:devteam:rwx /shared/project
- 执行后用 getfacl /shared/project 查看,确认输出中有以 default: 开头的条目
配合 umask 与 mask 确保权限落地
默认 ACL 设了 ≠ 新文件真有权限,中间还有两道关卡:
- umask:它会过滤掉新建文件的权限位。协作目录建议统一设为 002(文件 664,目录 775),可在 /etc/profile 或用户 ~/.bashrc 中添加 umask 002
- mask:它是所有命名用户/组权限的“天花板”。setfacl -m 通常自动更新 mask,但若手动改过或 chmod 过,可用 setfacl --recompute-mask /path 重算
- 用 ls -l 查看时,权限末尾出现 +(如 drwxrwxr-x+)说明存在 ACL;getfacl 输出中的 mask:: 行就是当前生效上限
验证与清理要点
配置后必须动手验证,避免“看起来设了,其实没效”:
- 切换到目标用户(如 su - alice),在目录下创建测试文件:touch test.txt && mkdir testdir
- 分别运行 getfacl test.txt 和 getfacl testdir,检查是否出现对应用户的 user:alice: 条目,且 testdir 还带 default: 块
- 若未生效,按顺序排查:父目录是否有 default 条目 → 文件系统是否真启用了 acl → 当前用户 umask 是否太严 → mask 是否被压低
- 清空默认 ACL:setfacl -k /path(-k 清默认条目)或 setfacl -b /path(-b 清全部扩展 ACL)











