Linux ACL权限管理
Linux 的 ACL(Access Control List,访问控制列表)是个超级好用的工具,能让你更灵活地控制文件和目录的权限。相比传统的用户、组、其他三类权限,ACL 允许你给特定的用户或组设置单独的权限,特别适合多人协作或复杂权限管理的场景。
1. 什么是 ACL?
ACL 是一种扩展权限机制,允许你为文件或目录设置更细粒度的访问控制。传统的 Linux 权限(读 r、写 w、执行 x)只支持 owner、group 和 others 三类,而 ACL 可以让你给任意用户或组分配特定的权限。比如,你可以让某个用户只能读某个文件,而另一个用户可以读写,完全不依赖传统的组机制。
ACL 特别适合:
- 项目需要多个用户或组以不同权限访问同一个文件或目录。
- 你不想频繁改动文件所属的组或用户。
- 需要比传统权限更复杂的控制。
2. 检查系统是否支持 ACL
不是所有 Linux 系统默认都启用 ACL,得先确认一下你的文件系统和内核是否支持。常用的文件系统(如 ext4、xfs、btrfs)一般都支持 ACL,但得确保挂载时启用了 ACL 选项。
检查文件系统挂载选项:
mount | grep acl
如果输出里看到类似 /dev/sda1 on / type ext4 (rw,acl,...)
,说明 ACL 已启用。如果没看到 acl
,可能需要手动启用。
启用 ACL(以 ext4 为例,假设挂载点是 /
):
sudo mount -o remount,acl /
要永久启用,编辑 /etc/fstab
,在对应文件系统的挂载选项里加上 acl
,比如:
UUID=your-uuid / ext4 defaults,acl 0 1
确认 ACL 工具已安装(setfacl 和 getfacl 命令):
getfacl --version
如果没装,Debian/Ubuntu 系统可以用:
sudo apt install acl
CentOS/RHEL 系统用:
sudo yum install acl
3. 查看文件的 ACL 权限
用 getfacl
命令可以查看文件或目录的 ACL 权限。假设有个文件叫 test.txt
,运行:
getfacl test.txt
输出可能长这样:
# file: test.txt
# owner: alice
# group: users
user::rw-
user:bob:r-x
group::r--
mask::r-x
other::r--
解释一下:
# file
:文件名。# owner
和# group
:文件所属用户和组。user::rw-
:文件拥有者的权限(读写)。user:bob:r-x
:用户 bob 的 ACL 权限(读和执行)。group::r--
:所属组的权限(只读)。mask::r-x
:ACL 掩码,限制 ACL 权限的最大范围。other::r--
:其他用户的权限(只读)。
如果文件没设置 ACL,输出只会显示传统权限。
4. 设置 ACL 权限
用 setfacl
命令来设置 ACL。基本语法是:
setfacl -m [权限类型]:[对象]:[权限] 文件名
-m
:表示修改或添加 ACL。- 权限类型:
u
(用户)、g
(组)、o
(其他)、m
(掩码)。 - 对象:用户名或组名(如果是用户或组)。
- 权限:
r
(读)、w
(写)、x
(执行),可以组合。
4.1 给特定用户设置权限
给用户 bob
设置对 test.txt
的读写权限:
setfacl -m u:bob:rw test.txt
检查结果:
getfacl test.txt
输出会多一行 user:bob:rw-
。
4.2 给特定组设置权限
给组 developers
设置对 project/
目录的读和执行权限:
setfacl -m g:developers:rx project/
4.3 设置掩码(mask)
掩码是 ACL 的“最大权限限制”,会影响除 owner 和 other 外的所有 ACL 权限。比如,掩码是 r--
,即使你给某个用户设置了 rwx
,实际生效的权限只有 r--
。
设置掩码:
setfacl -m m:r project/
查看效果:
getfacl project/
掩码一般不用手动改,setfacl
会根据你设置的权限自动调整。
5. 递归设置 ACL
如果想给目录及其下所有文件和子目录设置 ACL,用 -R
选项。比如,给 project/
及其内容设置 bob
的读写权限:
setfacl -R -m u:bob:rw project/
6. 默认 ACL(新文件自动继承)
目录可以设置默认 ACL(default ACL),让新创建的文件或子目录自动继承指定的 ACL。默认 ACL 不会影响现有文件。
设置默认 ACL:
setfacl -m d:u:bob:rw project/
检查默认 ACL:
getfacl project/
输出会包含类似 default:user:bob:rw-
的行。
现在,在 project/
里新建文件或目录,都会自动带上 bob
的 rw
权限。
7. 删除 ACL 权限
7.1 删除特定 ACL
删除用户 bob
的 ACL:
setfacl -x u:bob test.txt
-x
表示删除指定的 ACL 条目。
7.2 删除所有 ACL
删除文件的所有 ACL,恢复到传统权限:
setfacl -b test.txt
-b
会清除所有 ACL 条目(包括默认 ACL)。
7.3 删除默认 ACL
只删除目录的默认 ACL:
setfacl -k project/
8. ACL 和传统权限的交互
ACL 和传统权限(chmod 设置的权限)会互相影响:
- 传统权限的
group
权限会被 ACL 的掩码(mask)覆盖。 - 如果你用
chmod
改权限,可能会影响 ACL 的掩码。
比如,文件当前掩码是 rwx
,你运行:
chmod g=r test.txt
这会把掩码改成 r--
,导致组和用户的 ACL 权限被限制到只读。
查看文件是否有 ACL:
ls -l test.txt
如果有 ACL,输出会显示一个 +
号,比如:
-rw-r-xr--+ 1 alice users 0 Aug 12 12:00 test.txt
9. 备份和恢复 ACL
ACL 信息不会被常规备份工具(如 cp
或 tar
)自动保存,得用专门的工具。
备份 ACL:
getfacl -R project/ > acl_backup.txt
恢复 ACL:
setfacl --restore=acl_backup.txt
10. 常见问题和注意事项
- 文件系统支持:确保文件系统支持 ACL(ext4、xfs 等都行,fat32 不行)。
- 挂载选项:ACL 需要在挂载时启用,否则
setfacl
会报错。 - 掩码的影响:总是注意掩码对权限的限制。
- 工具支持:有些老工具(比如
ls
)可能不完整显示 ACL,得用getfacl
。 - 权限冲突:ACL 和传统权限冲突时,掩码会起决定作用。