Linux getfacl命令

getfacl 是 Linux 系统中用于显示文件或目录访问控制列表(ACL)的命令,它是 setfacl 的配套工具,用于查看详细的权限设置。

命令简介

getfacl 用于显示文件或目录的访问控制列表(Access Control List,ACL)信息。它可以显示传统UNIX权限和扩展的ACL权限,帮助管理员了解详细的权限配置。

主要功能包括:

  • 显示文件和目录的完整ACL信息
  • 显示默认ACL(影响新创建的文件)
  • 以多种格式输出ACL信息
  • 递归显示目录树的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条目
  • 空行分隔不同文件的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 显示帮助信息

命令示例

1. 基本用法:查看文件ACL

查看文件或目录的基本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::---

2. 查看默认ACL

查看目录的默认ACL(影响新建文件):

# 查看目录的默认ACL
getfacl -d /shared

# 同时查看访问ACL和默认ACL
getfacl -a -d /shared

# 仅查看默认ACL(简洁输出)
getfacl -d -c /shared

3. 递归查看目录ACL

递归查看目录及其子目录的ACL设置:

# 递归查看目录ACL
getfacl -R /shared

# 递归查看并忽略符号链接
getfacl -R -P /shared

# 递归查看,只显示有扩展ACL的文件
getfacl -R -s /shared

# 递归查看默认ACL
getfacl -R -d /shared

4. 简洁输出格式

使用简洁的输出格式,便于脚本处理:

# 不显示注释头
getfacl -c file.txt

# 表格格式输出
getfacl -t file.txt

# 显示有效权限
getfacl -e file.txt

# 不显示有效权限
getfacl -E file.txt

5. 备份和恢复ACL

使用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

6. 高级用法:分析和过滤

结合其他命令分析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输出

示例输出:

$ 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-- - 其他人有读权限

权限掩码(Mask)详解

权限掩码的作用:

权限掩码定义了除文件所有者和其他人之外的所有ACL条目的最大有效权限。这是ACL系统的一个重要概念:

  1. 掩码不影响文件所有者(user::)和其他人(other::)的权限
  2. 所有指定的用户(user:username:)和组(group:groupname:)权限都会被掩码过滤
  3. 当使用chmod修改传统组权限时,会自动更新掩码
  4. 掩码本身也是一个ACL条目,可以用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:权限审计和排查
# 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)
场景2:备份和迁移权限
# 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
场景3:权限问题诊断
# 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-

这表示:

  • 用户bob被授予了rwx权限
  • 但是权限掩码可能只有rw-
  • 因此bob的实际有效权限是rw-

使用 getfacl -e 可以强制显示所有条目的有效权限。

区分方法:

  1. 基本ACL:只包含所有者、所属组和其他人的权限(类似传统权限)
  2. 扩展ACL:包含额外的用户、组条目或默认ACL

使用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-)
  • 这是因为当文件有扩展ACL时,ls -l显示的组权限位置实际显示的是掩码值

与setfacl配合使用

最佳实践:修改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

相关命令

  • setfacl - 设置文件或目录的ACL
  • chmod - 修改文件传统权限
  • ls -l - 查看文件基本权限