← 返回 Linux 从零到实战 目录
ACL 与进阶权限控制 封面
🖼️ 本章封面 · 由 NVIDIA AI 生成

3.3 ACL 与进阶权限控制

ACL 与进阶权限控制 概念图
🎨 核心概念可视化 · AI 生成
1. 为什么需要 ACL?

在传统的 Linux 权限模型(UGO - User, Group, Others)中,一个文件只能有一个所有者和一个所属组。这在简单的场景下足够,但在复杂的协作环境中会遇到瓶颈。

场景示例: 你有一个项目文件夹 /projects/alpha,需要: - 用户 alice (所有者) 有完全权限 rwx。 - 组 devs 有读写权限 rw-。 - 用户 bob (不在 devs 组中) 仅需要读权限 r--。 - 其他所有人没有任何权限 ---

使用传统权限无法实现(因为 bob 既不是所有者,也不在 devs 组中,他会被归类到 others),此时就需要 ACL (Access Control Lists,访问控制列表)


2. 核心概念

2.1 Access ACL vs Default ACL

2.2 关键组成部分

2.3 Mask (掩码) 的作用

mask 是 ACL 中最容易被忽视但最关键的部分。它像一个“天花板”,限制了所有命名用户、命名组以及所属组的实际有效权限。 - 如果 user:bob 拥有 rwx,但 maskr--,那么 bob 的有效权限仅为 r--。 - chmod 修改组权限时,实际上是在修改 mask


3. 实操指南

3.1 查看权限:getfacl

# 查看文件详细 ACL
getfacl file.txt

# 递归查看目录及其下所有文件的 ACL
getfacl -R /path/to/dir

3.2 设置权限:setfacl

3.2.1 修改 (Modify) -m

3.2.2 删除 (Remove) -x

3.2.3 设置默认 ACL (Default) -d

让以后在该目录下创建的文件自动继承权限:

# 让新创建的文件默认给 bob 读权限
setfacl -d -m u:bob:r-- /shared_folder

4. ACL 与传统权限的对应关系

ACL 条目 对应传统权限位 备注
user:: u (User) 所有者权限
mask g (Group) 若存在 ACL,ls -l 看到的组权限实际上是 mask
group:: g (Group) 所属组权限 (受 mask 限制)
other:: o (Others) 其他人权限

注意:当你为文件设置了 ACL 后,执行 ls -l 会在权限位的末尾看到一个 + 号,例如 -rw-rwxr--+,这提示该文件使用了 ACL。


5. 避坑指南

  1. 权限覆盖setfacl -m 是增量修改,而 --set--set-file 会替换掉整个 ACL。
  2. Mask 陷阱:当你使用 chmod g+w 时,如果文件有 ACL,Linux 会自动更新 mask 以允许写入,这可能会无意中提升了其他命名用户的权限。
  3. 文件系统支持:现代主流文件系统 (ext4, XFS, Btrfs) 默认都开启了 ACL。如果 setfacl 报错,请检查 /etc/fstab 中是否包含 acl 挂载选项(虽然在 Ubuntu 22.04+ 中通常不再需要显式指定)。

6. 参考

发布于 2026-07-13 14:48 · 由 Hermes Agent 自动生成