Linux ACL 访问控制列表完整使用指南
本文档面向 Linux 服务器运维人员,讲解 ACL 扩展权限的安装、配置、查看与清除。 适用系统: Debian 12 / Ubuntu 20.04+ / CentOS 7+ 适用平台: 云服务器 / 本地虚拟机
目录
- ACL 是什么
- 安装 ACL
- 核心命令速览
- setfacl 参数详解
- 权限设置格式
- 常用操作示例
- 完整实战:创建部署用户
- 清除 ACL 恢复默认(重点)
- 配合 SSH 使用
- 注意事项
- 常见问题
- 一键设置脚本
- 命令速查表
1. ACL 是什么
传统 Linux 权限只能按三类控制:所有者、所属组、其他人。
ACL(Access Control List)可以精确到单个用户或单个组,实现更细粒度的权限管理,且不影响原有权限体系。
没有设置过 ACL 的文件,本质上和传统权限文件一样,只是 getfacl 会把基本权限也展示出来。
2. 安装 ACL
Debian / Ubuntu
sudo apt update
sudo apt install -y aclCentOS / RHEL / Rocky
sudo yum install -y acl
# 或sudo dnf install -y acl验证安装
getfacl --version3. 核心命令速览
| 命令 | 全称 | 作用 |
|---|---|---|
setfacl | Set File Access Control List | 设置 ACL 权限 |
getfacl | Get File Access Control List | 查看 ACL 权限 |
4. setfacl 参数详解
| 参数 | 含义 | 说明 |
|---|---|---|
-m | 修改 / 添加 | 修改或添加一条 ACL 规则 |
-x | 删除 | 删除指定用户/组的 ACL 规则 |
-b | 清空所有 ACL | 删除所有 ACL 条目,只保留基本权限 |
-k | 删除默认 ACL | 只删除 default 规则,保留当前规则 |
-R | 递归 | 对目录及所有子内容生效 |
-d | 默认 ACL | 新创建的文件/目录自动继承 |
-b 和 -k 的区别后面会详细讲,这是很多人混淆的地方。
5. 权限设置格式
u:用户名:权限 # 给用户设置权限g:组名:权限 # 给组设置权限o::权限 # 给其他用户设置权限m::权限 # 设置有效权限掩码权限值:r (读)、w (写)、x (执行)、- (无权限)
6. 常用操作示例
6.1 给用户添加权限
# 给用户 blogdeploy 添加 /opt/blog 目录的读写执行权限sudo setfacl -m u:blogdeploy:rwx /opt/blog
# 给多个用户分别添加权限sudo setfacl -m u:alice:rwx /opt/blog
sudo setfacl -m u:bob:rx /opt/blog6.2 递归设置权限
# 递归给 blogdeploy 授权(当前已有文件/目录)sudo setfacl -R -m u:blogdeploy:rwx /opt/blog6.3 设置默认 ACL(新文件自动继承)
# 默认 ACL:以后在 /opt/blog 下创建的新文件/目录自动继承权限sudo setfacl -R -d -m u:blogdeploy:rwx /opt/blog6.4 同时设置当前权限和默认权限(推荐做法)
# 第一步:递归授权已有内容sudo setfacl -R -m u:blogdeploy:rwx /opt/blog
# 第二步:设置默认 ACL,新文件自动继承sudo setfacl -R -d -m u:blogdeploy:rwx /opt/blog6.5 查看 ACL 权限
# 查看单个文件/目录的 ACLgetfacl /opt/blog输出示例:
# file: opt/blog# owner: root# group: rootuser::rwxuser:blogdeploy:rwx ← 自定义用户权限group::r-xmask::rwxother::r-xdefault:user::rwxdefault:user:blogdeploy:rwx ← 默认继承权限default:group::r-xdefault:mask::rwxdefault:other::r-x6.6 删除单个用户的 ACL
# 删除 blogdeploy 的 ACL 权限sudo setfacl -x u:blogdeploy /opt/blog
# 递归删除sudo setfacl -R -x u:blogdeploy /opt/blog7. 完整实战:创建部署用户
场景:创建 blogdeploy 用户,只能操作 /opt/1panel/www/sites/blog 目录。
# 1. 创建用户sudo useradd -m -s /bin/bash blogdeploy
# 2. 设置密码sudo passwd blogdeploy
# 3. 确保 ACL 已安装sudo apt install -y acl
# 4. 设置 ACL 权限(递归 + 默认继承)sudo setfacl -R -m u:blogdeploy:rwx /opt/1panel/www/sites/blog
sudo setfacl -R -d -m u:blogdeploy:rwx /opt/1panel/www/sites/blog
# 5. 验证getfacl /opt/1panel/www/sites/blog
# 6. 测试登录su - blogdeploy
cd /opt/1panel/www/sites/blog
touch test.txt
rm test.txt8. 清除 ACL 恢复默认(重点)
这是最容易搞混的部分,分三种情况讲清楚。
8.1 ACL 的默认状态是什么?
没有设置过 ACL 的文件,getfacl 输出长这样:
# owner: root# group: rootuser::rw-group::r--other::r--这就是 ACL 的默认状态 —— 和传统 ls -l 看到的基本权限完全一致,没有任何额外的 user:xxx 或 default: 条目。
8.2 彻底删除所有 ACL 条目(恢复初始状态)
# 删除所有 ACL 条目,只保留基本权限sudo setfacl -b /opt/blog
# 递归删除整个目录树的所有 ACLsudo setfacl -R -b /opt/blog-b 会删除所有自定义 ACL 条目(包括 user:xxx 和 default:),但保留文件原有的 user::、group::、other:: 基本权限。
执行后文件就回到了”从未设置过 ACL”的状态。
8.3 只删除默认 ACL,保留当前权限
# 只删除 default 规则,不影响已设置的当前权限sudo setfacl -k /opt/blog
# 递归删除sudo setfacl -R -k /opt/blog适用于:你已经给目录设好了当前权限,但不想让新文件自动继承,只想取消”默认继承”功能。
8.4 彻底归零:ACL + 基本权限全部重置
如果你想把文件权限彻底恢复到”刚创建”的状态(比如 644 或 755):
# 第一步:删除所有 ACLsudo setfacl -R -b /opt/blog
# 第二步:用 chmod 重置基本权限sudo chmod -R 755 /opt/blog
# 第三步:改回正确的所有者和组sudo chown -R root:root /opt/blog以上三步是不可逆的,执行前请确认你真的想清空所有权限设置。
8.5 三种清除方式对比
| 命令 | 作用 | 使用场景 |
|---|---|---|
setfacl -x u:用户名 路径 | 删除某个用户的 ACL | 只移除特定用户权限 |
setfacl -k 路径 | 删除默认 ACL | 取消新文件自动继承 |
setfacl -b 路径 | 删除所有 ACL 条目 | 恢复默认状态,最常用 |
setfacl -b + chmod | ACL + 基本权限全重置 | 彻底归零,从头开始 |
9. 配合 SSH 使用
允许密码登录:
sudo nano /etc/ssh/sshd_config确保配置项:
PasswordAuthentication yes重启 SSH:
sudo systemctl restart sshDebian/Ubuntu 上 SSH 服务名是 ssh,不是 sshd。systemctl restart sshd 在某些系统上可能不生效。
Windows 连接测试:
ssh blogdeploy@服务器IP10. 注意事项
| 注意点 | 说明 |
|---|---|
| 备份目录也要授权 | 如果备份到 blog-backup,也要给 blogdeploy 授权 |
chmod 可能影响 ACL | chmod 会修改 ACL 的 mask,可能影响有效权限。建议用 setfacl 管理权限 |
| 文件系统支持 | ext4、xfs、btrfs 都支持 ACL,fat32 不支持 |
| 挂载选项 | 确保挂载时启用了 ACL:mount | grep acl |
11. 常见问题
Q1: setfacl 提示 “Operation not supported”
# 检查文件系统是否启用 ACLmount | grep " / "
# 如果没有 acl,编辑 /etc/fstab 添加 acl 选项,然后重新挂载Q2: 用户能看到其他目录吗?
ACL 只控制特定目录的权限。用户仍然可以 cd 到 /etc,但只能看有权限的文件。
如需严格限制,考虑 chroot 或容器方案。
Q3: 如何查看某个用户有哪些 ACL 权限?
# 查看所有带 ACL 的文件getfacl -R /opt/1panel/www/sites/blog | grep "user:blogdeploy"12. 一键设置脚本
#!/bin/bashUSERNAME="blogdeploy"TARGET_DIR="/opt/1panel/www/sites/blog"
echo "=== 创建用户并设置 ACL ==="
# 创建用户if ! id "$USERNAME" &>/dev/null; then sudo useradd -m -s /bin/bash "$USERNAME" echo "✅ 用户 $USERNAME 已创建"else echo "⚠️ 用户已存在"fi
# 设置密码echo "🔑 设置密码:"sudo passwd "$USERNAME"
# 安装 ACLsudo apt install -y acl 2>/dev/null || sudo yum install -y acl 2>/dev/null
# 设置权限sudo setfacl -R -m u:"$USERNAME":rwx "$TARGET_DIR"
sudo setfacl -R -d -m u:"$USERNAME":rwx "$TARGET_DIR"
# 验证echo ""echo "=== ACL 权限 ==="getfacl "$TARGET_DIR" | grep -E "(user:|default:)"
echo ""echo "✅ 完成!"13. 命令速查表
| 操作 | 命令 |
|---|---|
| 给用户授权 | setfacl -m u:用户名:rwx 路径 |
| 递归授权 | setfacl -R -m u:用户名:rwx 路径 |
| 默认继承 | setfacl -d -m u:用户名:rwx 路径 |
| 查看权限 | getfacl 路径 |
| 删除单个用户权限 | setfacl -x u:用户名 路径 |
| 删除所有 ACL(恢复默认) | setfacl -b 路径 |
| 递归删除所有 ACL | setfacl -R -b 路径 |
| 删除默认 ACL | setfacl -k 路径 |
文档版本: 2026-08-12 适用系统: Debian 12 / Ubuntu 20.04+ / CentOS 7+ 适用平台: 云服务器 / 本地虚拟机
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













