setfacl 是 Linux 中用于设置文件访问控制列表(ACL)的命令。ACL 提供了比传统 Linux 权限(所有者/组/其他人)更灵活的权限管理机制。
基本语法
setfacl [选项] 规则 文件/目录
常用选项
| 选项 | 说明 |
|---|
-m | 修改或添加 ACL 规则 |
-x | 删除指定的 ACL 规则 |
-b | 删除所有扩展 ACL 规则 |
-k | 删除默认 ACL 规则 |
-R | 递归应用到目录及其内容 |
-d | 设置默认 ACL(仅对目录有效) |
--set | 完全替换当前 ACL |
规则格式
1. 针对用户
# 设置特定用户的权限
setfacl -m u:用户名:权限 文件
# 示例:给用户 alice 读写权限
setfacl -m u:alice:rw file.txt
2. 针对组
# 设置特定组的权限
setfacl -m g:组名:权限 文件
# 示例:给组 developers 读执行权限
setfacl -m g:developers:rx project/
3. 针对其他人
# 设置其他人的权限
setfacl -m o:权限 文件
4. 权限表示
常用示例
1. 为用户设置权限
# 给特定用户添加读写权限
setfacl -m u:john:rw document.txt
# 给用户 bob 设置读权限
setfacl -m u:bob:r document.txt
2. 为组设置权限
# 给组添加读执行权限
setfacl -m g:staff:rx /shared_folder
# 给多个组设置权限
setfacl -m g:admin:rwx,g:users:rx script.sh
3. 递归设置目录 ACL
# 递归给目录及其内容设置权限
setfacl -R-m u:tom:rwx /home/tom/projects/
# 递归给目录设置默认 ACL
setfacl -R-d-m u:tom:rwx /home/tom/projects/
4. 删除 ACL 规则
# 删除特定用户的 ACL
setfacl -x u:john document.txt
# 删除特定组的 ACL
setfacl -x g:staff document.txt
# 删除所有 ACL(恢复到传统权限)
setfacl -b document.txt
5. 设置默认 ACL(目录)
# 设置目录的默认 ACL,新文件将继承这些权限
setfacl -d-m u:john:rw shared_directory/
setfacl -d-m g:staff:rx shared_directory/
查看 ACL
使用 getfacl 命令查看已设置的 ACL:
getfacl 文件/目录
实用场景示例
场景1:共享 Web 目录
# 允许 www-data 组读写,开发者组只读
sudo setfacl -R-m g:www-data:rwx /var/www/html/
sudo setfacl -R-m g:developers:rx /var/www/html/
sudo setfacl -R-d-m g:www-data:rwx /var/www/html/
场景2:协作项目目录
# 团队成员有读写权限,新文件自动继承组权限
mkdir /projects/team_project
setfacl -m g:team:rwx /projects/team_project
setfacl -d-m g:team:rwx /projects/team_project
setfacl -m mask::rwx /projects/team_project
场景3:备份用户访问
# 允许备份用户读取所有配置文件
setfacl -R-m u:backup:r /etc/
setfacl -m u:backup:rx /etc/ # 目录需要执行权限才能进入
注意事项
文件系统需要支持 ACL(通常 ext4、xfs 等都支持)
使用 mount 命令检查是否启用了 ACL(通常默认启用)
ACL 规则遵循顺序:用户、组、其他人
修改文件权限(chmod)可能影响 ACL mask 值
备份和恢复 ACL:getfacl file > acl.txt 和 setfacl --restore=acl.txt
实用技巧
# 备份所有 ACL
getfacl -R /path/to/dir > backup.acl
# 恢复 ACL
setfacl --restore=backup.acl
# 复制 ACL 从一个文件到另一个
getfacl source | setfacl --set-file=- target
# 查看 ACL 对进程有效权限的影响
getfacl -e file.txt