在 Linux 系统里,文件权限管理是基础中的基础。我们都知道文件有 owner(所有者)、group(所属组)和 others(其他人)三种权限,但如果想给某个特定用户单独开权限,默认的权限体系就不够用了。这时候,ACL(Access Control Lists,访问控制列表) 就能派上大用场——它能让你给单个用户或组设置更精细的权限,不用修改文件的所有者或所属组。

什么是 ACL?

简单说,ACL 是 Linux 文件系统的一种扩展权限机制。默认的权限管理只能控制"所有者、所属组、其他人"三类对象,而 ACL 可以:

  • 某个特定用户单独设置权限(比如让用户 Bob 能修改文件,不管他是不是所属组成员)
  • 某个特定组单独设置权限(比如让 group_dev 组有读取权限,其他组没有)

打个比方:默认权限像一把大门钥匙,要么给主人,要么给家人,要么给访客;而 ACL 像一把把小钥匙,可以精准地分给指定的人,灵活性高多了。

第一步:确认系统支持 ACL

不是所有文件系统都默认开启 ACL,我们需要先检查当前文件系统是否支持。

检查 ACL 是否启用

mount 命令查看文件系统挂载信息,找关键词 acl

sudo mount

如果输出里有类似 (rw,acl) 的内容(比如 /dev/sda1 on / type ext4 (rw,acl)),说明已经启用 ACL。

手动启用 ACL(如果未启用)

如果没看到 acl,可以重新挂载文件系统并开启 ACL:

# 以根目录 / 为例,重新挂载并启用 ACL
sudo mount -o remount,acl /

开机自动启用 ACL

为了避免重启后失效,需要修改 /etc/fstab 文件(系统挂载配置):

  1. blkid 命令找到文件系统的 UUID(比如 /dev/sda1 的 UUID)
  2. 编辑 /etc/fstab,在对应行的挂载参数里加上 acl
    UUID=xxxx-xxxx-xxxx / ext4 defaults,acl 0 0
    
  3. 保存后执行 sudo mount -a 让配置生效

核心操作:用这两个命令管理 ACL

1. 查看文件的 ACL 权限:getfacl

想知道一个文件有没有设置 ACL,用 getfacl 命令:

getfacl tecadmin.txt

如果没有 ACL,输出和 ls -l 类似;如果有 ACL,会多出 user:用户名:权限group:组名:权限 的条目,比如:

# file: tecadmin.txt
# owner: root
# group: root
user::rw-          # 文件所有者的默认权限
user:Bob:rwx       # 给用户 Bob 单独设置的 rwx 权限
group::r--         # 所属组的默认权限
mask::rwx          # 权限掩码(限制最大权限)
other::r--         # 其他人的权限

2. 修改文件的 ACL 权限:setfacl

setfacl 是设置 ACL 的核心命令,格式如下:

setfacl -m 类型:对象:权限 文件名
  • -m:表示"修改"ACL(modify)
  • 类型:u 代表用户(user),g 代表组(group)
  • 对象:用户名或组名
  • 权限:和普通权限一样,r(读)、w(写)、x(执行)

实用示例:给用户 Bob 开全权限

比如想让用户 Bob 对 tecadmin.txt 有读、写、执行权限(rwx):

setfacl -m u:Bob:rwx tecadmin.txt

执行后用 getfacl tecadmin.txt 检查,会看到 user:Bob:rwx 的条目,说明生效了。

其他常用场景:

  • 给组 dev_team 设置只读权限:
    setfacl -m g:dev_team:r-- tecadmin.txt
    
  • 移除用户 Bob 的 ACL 权限:
    setfacl -x u:Bob tecadmin.txt  # -x 表示删除(remove)
    
  • 清空文件的所有 ACL 权限:
    setfacl -b tecadmin.txt  # -b 表示清除所有 ACL(backup)
    

为什么需要 ACL?举个例子就懂

假设你有一个文件 project.txt,默认权限是:

  • 所有者(你):rwx
  • 所属组(team):r--
  • 其他人:---

现在需要让同事 Alice(不属于 team 组)临时编辑这个文件,怎么办?

  • 用默认权限:要么把 Alice 加入 team 组(但可能给她太多其他文件的权限),要么修改其他人权限为 rw-(太危险)
  • 用 ACL:直接给 Alice 单独开 rw- 权限,不影响其他设置:
    setfacl -m u:Alice:rw- project.txt
    

这样既满足了需求,又保证了安全性——这就是 ACL 的价值。

注意事项

  1. 文件系统支持:ACL 主要在 ext3、ext4、xfs 等常见文件系统上支持,某些特殊文件系统可能不支持。
  2. 权限冲突:如果 ACL 权限和默认权限冲突,以 ACL 为准(比如默认组权限是 r--,但 ACL 给组设置了 rwx,则实际生效 rwx)。
  3. 备份与恢复:用 getfacl 可以导出 ACL 配置,方便迁移:
    getfacl tecadmin.txt > acl_backup.txt  # 导出
    setfacl --restore=acl_backup.txt       # 恢复
    

总结:ACL 什么时候用?

当你需要给特定用户/组设置权限,而不想修改文件的所有者或所属组时,就该用 ACL 了。记住两个核心命令:

  • getfacl 文件名:查看 ACL 权限
  • setfacl -m u:用户名:权限 文件名:给用户设置 ACL 权限

掌握 ACL 后,你对 Linux 文件权限的控制会更精准,系统管理也会更灵活。下次遇到复杂的权限需求,别再局限于 chmodchown 了,试试 ACL 吧!