setfacl 的配套工具,用于查看详细的权限设置。
getfacl 用于显示文件或目录的访问控制列表(Access Control List,ACL)信息。它可以显示传统UNIX权限和扩展的ACL权限,帮助管理员了解详细的权限配置。
主要功能包括:
setfacl使用的格式getfacl [选项] 文件...
getfacl [选项] -R 目录...
getfacl 的典型输出格式:
# file: filename # 文件名
# owner: username # 文件所有者
# group: groupname # 文件所属组
user::rwx # 所有者权限
user:username:rwx # 指定用户权限
group::rwx # 所属组权限
group:groupname:rwx # 指定组权限
mask::rwx # 有效权限掩码
other::r-- # 其他人权限
default:user::rwx # 默认ACL(仅目录)
输出中的特殊标记:
# effective: - 显示实际有效权限(受mask限制)default: - 表示默认ACL条目| 选项 | 说明 |
|---|---|
-a, --access |
仅显示访问ACL(默认行为) |
-d, --default |
仅显示默认ACL |
-c, --omit-header |
不显示注释头(#开头的行) |
-e, --all-effective |
显示所有有效权限 |
-E, --no-effective |
不显示有效权限 |
-s, --skip-base |
跳过仅包含基本ACL的文件 |
-R, --recursive |
递归显示子目录 |
-L, --logical |
逻辑遍历(跟随符号链接) |
-P, --physical |
物理遍历(不跟随符号链接) |
-t, --tabular |
使用表格输出格式 |
-p, --absolute-names |
不 strips leading '/' |
-n, --numeric |
显示数字的用户/组ID |
-v, --version |
显示版本信息 |
-h, --help |
显示帮助信息 |
查看文件或目录的基本ACL信息:
# 查看文件的ACL
getfacl file.txt
# 查看目录的ACL
getfacl /var/www
# 查看多个文件
getfacl file1.txt file2.txt
# 查看并显示数字ID
getfacl -n /etc/passwd
典型输出示例:
$ getfacl /shared/data
# file: shared/data
# owner: root
# group: developers
user::rwx
user:alice:rwx
user:bob:r-x
group::rwx
group:testers:r-x
mask::rwx
other::---
default:user::rwx
default:user:alice:rwx
default:group::rwx
default:mask::rwx
default:other::---
查看目录的默认ACL(影响新建文件):
# 查看目录的默认ACL
getfacl -d /shared
# 同时查看访问ACL和默认ACL
getfacl -a -d /shared
# 仅查看默认ACL(简洁输出)
getfacl -d -c /shared
递归查看目录及其子目录的ACL设置:
# 递归查看目录ACL
getfacl -R /shared
# 递归查看并忽略符号链接
getfacl -R -P /shared
# 递归查看,只显示有扩展ACL的文件
getfacl -R -s /shared
# 递归查看默认ACL
getfacl -R -d /shared
使用简洁的输出格式,便于脚本处理:
# 不显示注释头
getfacl -c file.txt
# 表格格式输出
getfacl -t file.txt
# 显示有效权限
getfacl -e file.txt
# 不显示有效权限
getfacl -E file.txt
使用getfacl备份ACL,然后使用setfacl恢复:
# 备份目录的ACL
getfacl -R /shared > acl_backup.txt
# 备份单个文件的ACL
getfacl important.txt > important_acl.txt
# 恢复ACL设置
setfacl --restore=acl_backup.txt
# 备份时忽略注释头
getfacl -c -R /shared > acl_data.txt
结合其他命令分析ACL信息:
# 查找所有有扩展ACL的文件
find /data -exec getfacl -s {} \; 2>/dev/null
# 统计有ACL的文件数量
getfacl -R -s /data | grep -c "^# file:"
# 查找特定用户的ACL权限
getfacl -R /shared | grep -A1 "user:alice"
# 显示所有目录的默认ACL
find /data -type d -exec getfacl -d {} \; 2>/dev/null
示例输出:
$ getfacl document.txt
# file: document.txt
# owner: alice
# group: developers
user::rw-
user:bob:rwx #effective:rw-
group::r--
group:testers:rwx #effective:rw-
mask::rw-
other::r--
解读:
user::rw- - 文件所有者(alice)有读写权限user:bob:rwx - 用户bob被授予rwx权限#effective:rw- - 由于mask限制,bob的实际有效权限是rw-group::r-- - 文件所属组(developers)有读权限group:testers:rwx - testers组被授予rwx权限mask::rw- - 有效权限掩码为rw-,限制所有用户和组(除所有者外)other::r-- - 其他人有读权限权限掩码的作用:
权限掩码定义了除文件所有者和其他人之外的所有ACL条目的最大有效权限。这是ACL系统的一个重要概念:
user::)和其他人(other::)的权限user:username:)和组(group:groupname:)权限都会被掩码过滤chmod修改传统组权限时,会自动更新掩码setfacl修改示例:
# 设置用户bob有rwx权限
setfacl -m u:bob:rwx file.txt
# 设置掩码为r-x(限制最大权限)
setfacl -m m::rx file.txt
# 此时bob的实际权限是r-x(rwx与r-x的交集)
getfacl file.txt | grep -A1 "user:bob"
# 1. 检查目录的完整权限配置
getfacl -R /sensitive_data > audit_report.txt
# 2. 查找有特殊权限的文件
getfacl -R /home | grep -B1 "user:.*:rwx" | grep "^# file:" | cut -d' ' -f2-
# 3. 检查默认ACL设置
find / -type d -exec getfacl -d {} \; 2>/dev/null | grep -v "^$" | less
# 4. 比较两个目录的ACL差异
diff <(getfacl -R /dir1) <(getfacl -R /dir2)
# 1. 完整备份文件系统的ACL
getfacl -Rp / > full_system_acls.txt
# 2. 备份特定用户的权限设置
getfacl -R /home/alice > alice_permissions.txt
# 3. 备份Web服务器的权限配置
getfacl -R /var/www > web_acls.txt
# 4. 创建可执行的恢复脚本
echo '#!/bin/bash' > restore_acls.sh
echo 'setfacl --restore=acls_backup.txt' >> restore_acls.sh
chmod +x restore_acls.sh
# 1. 检查为什么用户无法访问文件
getfacl problem_file.txt
# 2. 查看有效权限(考虑mask限制)
getfacl -e restricted_file.txt
# 3. 检查默认ACL是否影响新文件
getfacl -d parent_directory/
# 4. 跟踪权限继承链
getfacl file.txt
getfacl -d $(dirname file.txt)
#effective: 表示实际有效权限,它显示了受权限掩码(mask)限制后的实际权限。
例如:
user:bob:rwx #effective:rw-
这表示:
使用 getfacl -e 可以强制显示所有条目的有效权限。
区分方法:
使用ls -l可以快速判断:
# 有扩展ACL的文件
-rw-rw-r--+ 1 user group 0 Jan 10 10:00 file1.txt
# 只有基本ACL的文件
-rw-rw-r-- 1 user group 0 Jan 10 10:00 file2.txt
注意文件名后面的+号表示有扩展ACL。
这种情况通常是因为权限掩码的影响:
$ ls -l file.txt
-rw-rw-r--+ 1 alice developers 0 Jan 10 10:00 file.txt
$ getfacl file.txt
user::rw-
user:bob:rwx #effective:rw-
group::r--
mask::rw-
other::r--
解释:
ls -l显示的组权限rw-实际上是掩码的权限getfacl显示了真实的组权限(r--)和掩码(rw-)ls -l显示的组权限位置实际显示的是掩码值最佳实践:修改ACL前先检查
在修改ACL设置之前,总是先用getfacl检查当前配置:
# 1. 先检查当前ACL
getfacl target_file.txt
# 2. 备份当前设置
getfacl target_file.txt > backup.txt
# 3. 修改ACL
setfacl -m u:newuser:rwx target_file.txt
# 4. 验证修改
getfacl target_file.txt