Linux 中的ACL(Access Control List,访问控制列表)是对传统 Unix 权限(rwx)的扩展,它可以让一个文件或目录同时针对多个用户或多个组设置不同的权限。
如果没有 ACL,一个文件只能设置:
文件所有者(Owner)
所属组(Group)
其他用户(Others)
而 ACL 可以额外指定:
指定某个用户(User)的权限
指定某个组(Group)的权限
默认权限(Default ACL)
一、为什么需要 ACL
假设有如下场景:
文件: report.txt Owner:root Group:dev 权限: -rw-r-----传统权限表示:
root rw- dev r-- others ---现在有三个用户:
alice bob tom要求:
alice 可以读写 bob 只能读 tom 没权限传统 Linux 权限:
chmod chown chgrp根本做不到。
只能:
Owner Group Others三级权限。
ACL 就能做到:
root rw- dev r-- alice rw- bob r-- tom ---二、ACL 工作原理
Linux 权限实际上变成了:
文件 Owner Group Others │ │ +--------------+ | ACL | |--------------| | user:alice | | user:bob | | group:test | +--------------+即:
传统权限 + ACL 扩展权限ACL 信息不会覆盖 chmod 权限,而是附加在 inode 的扩展属性(Extended Attributes,xattr)中。
因此:
ls -l看到:
-rw-r-----+最后那个:
+表示:
此文件拥有 ACL。
例如:
-rwxrwx---+说明:
ACL 存在三、ACL 分类
Linux ACL 分为:
Access ACL访问 ACL
用于:
文件 目录例如:
user:alice:rwx group:test:r-x另一种:
Default ACL默认 ACL
只能用于:
目录作用:
目录中新创建的文件自动继承 ACL。
例如:
dir/ default:user:alice:rwx以后:
touch dir/a.txt自动拥有:
user:alice:rwx四、查看 ACL
命令:
getfacl 文件名例如:
getfacl test.txt输出:
# file: test.txt # owner: root # group: root user::rw- user:alice:rwx group::r-- group:dev:r-- mask::rwx other::---逐项解释:
user::表示:
Owner 权限例如:
user::rw-就是:
root -> rw-user:alice:rwx表示:
alice -> rwxACL 新增权限。
group::表示:
文件所属组权限例如:
group::r--就是:
dev组 -> r--group:test:rwx表示:
test组成员拥有:
rwxmask::ACL 最重要的一项。
例如:
mask::rw-它表示:
ACL 最大权限。
ACL 中:
所有 group 以及所有 user(除 owner)都会受到 mask 限制。
例如:
user:alice:rwx mask::rw-最终:
alice 实际权限: rw-不是:
rwx因为:
x 被 mask 去掉other::就是:
Others 权限五、设置 ACL
命令:
setfacl格式:
setfacl -m 类型:对象:权限 文件例如:
-m表示:
modify给用户增加 ACL
例如:
setfacl -m u:alice:rwx file.txt查看:
getfacl file.txt输出:
user:alice:rwx给组增加 ACL
setfacl -m g:test:r-x file.txt得到:
group:test:r-x修改 ACL
再次执行:
setfacl -m u:alice:r--即可覆盖:
alice rwx ↓ r--六、删除 ACL
删除某用户:
setfacl -x u:alice file.txt删除某组:
setfacl -x g:test file.txt删除全部 ACL:
setfacl -b file.txt意思:
remove all ACL恢复普通权限。
七、默认 ACL(Default ACL)
假设:
/project所有新文件:
alice都应该有:
rwx设置:
setfacl -m d:u:alice:rwx /project查看:
getfacl /project得到:
default:user:alice:rwx以后:
touch /project/a.txt自动继承:
user:alice:rwx删除默认 ACL:
setfacl -x d:u:alice dir八、递归设置 ACL
目录:
project/所有文件:
alice:rwxsetfacl -R -m u:alice:rwx project递归:
-R默认 ACL:
setfacl -R -m d:u:alice:rwx project以后所有新文件继续继承。
九、Mask(ACL 掩码)详解
ACL 中最容易混淆的是mask。
例如:
user:alice:rwx mask::r-- other::---虽然:
alice=rwx实际上:
Effective r--查看:
getfacl可能显示:
user:alice:rwx #effective:r--为什么?
因为:
实际权限 = ACL权限 AND mask权限即:
rwx 111 AND r-- 100 = 100 = r--修改 mask:
setfacl -m m:rwx file或:
setfacl -m mask:rwx file十、ACL 与 chmod 的关系
很多人误认为:
chmod 不会影响 ACL实际上:
会影响 mask 和基础权限。
例如:
chmod g-w file可能导致:
mask同步变化。
因此:
ACL 配置后,最好再检查:
getfacl确认最终有效权限。
十一、ACL 与 umask 的关系
创建文件时:
最终权限 = 程序默认权限 AND ~umask如果目录设置了Default ACL:
先根据 Default ACL 生成 ACL。
再结合
umask调整基础权限。最终形成新文件的访问权限。
因此,Default ACL 与umask会共同影响新建文件的权限。
十二、ACL 文件备份与恢复
导出 ACL:
getfacl -R /project > acl.backup恢复 ACL:
setfacl --restore=acl.backup这对于迁移目录、灾难恢复或批量复制权限非常有用。
十三、ACL 实战示例
示例 1:多个用户访问同一文件
touch report.txt chmod 640 report.txt setfacl -m u:alice:rw report.txt setfacl -m u:bob:r report.txt getfacl report.txt效果:
| 用户 | 权限 |
|---|---|
| Owner | rw- |
| Group | r-- |
| alice | rw- |
| bob | r-- |
| Others | --- |
示例 2:项目目录共享
开发目录:
/project要求:
所有开发人员属于
dev组,可读写。测试人员
tester只读。新建文件自动继承权限。
配置:
mkdir /project chgrp dev /project chmod 2770 /project # SGID,确保新文件继承 dev 组 setfacl -m g:tester:r-x /project setfacl -m d:g:tester:r-x /project setfacl -m d:g:dev:rwx /project这样,新建文件会自动继承相应 ACL,减少后续维护工作。
十四、ACL 常用命令速查
| 功能 | 命令 |
|---|---|
| 查看 ACL | getfacl file |
| 增加用户 ACL | setfacl -m u:user:rwx file |
| 增加组 ACL | setfacl -m g:group:rwx file |
| 修改 Mask | setfacl -m m:rwx file |
| 删除用户 ACL | setfacl -x u:user file |
| 删除组 ACL | setfacl -x g:group file |
| 删除所有 ACL | setfacl -b file |
| 设置默认 ACL | setfacl -m d:u:user:rwx dir |
| 删除默认 ACL | setfacl -x d:u:user dir |
| 递归设置 ACL | setfacl -R -m u:user:rwx dir |
| 导出 ACL | getfacl -R dir > acl.backup |
| 恢复 ACL | setfacl --restore=acl.backup |
十五、最佳实践
优先使用传统权限模型(Owner、Group、Others),仅在无法满足需求时引入 ACL,以降低管理复杂度。
项目共享目录建议结合 SGID 与 Default ACL,既能保证新文件继承正确的组,也能自动继承 ACL。
配置 ACL 后始终使用
getfacl验证结果,特别关注mask和#effective字段,避免实际权限与预期不符。迁移或备份重要目录时同步备份 ACL,否则恢复后可能出现权限异常。
注意文件系统支持:现代的
ext4、XFS、Btrfs等通常支持 POSIX ACL,但在挂载参数或某些网络文件系统环境下仍需确认 ACL 是否启用。可以使用mount、tune2fs或创建测试 ACL 进行验证。