Linux ACL 访问控制列表完整使用指南

1929 字
10 分钟
Linux ACL 访问控制列表完整使用指南

本文档面向 Linux 服务器运维人员,讲解 ACL 扩展权限的安装、配置、查看与清除。 适用系统: Debian 12 / Ubuntu 20.04+ / CentOS 7+ 适用平台: 云服务器 / 本地虚拟机

目录#

  1. ACL 是什么
  2. 安装 ACL
  3. 核心命令速览
  4. setfacl 参数详解
  5. 权限设置格式
  6. 常用操作示例
  7. 完整实战:创建部署用户
  8. 清除 ACL 恢复默认(重点)
  9. 配合 SSH 使用
  10. 注意事项
  11. 常见问题
  12. 一键设置脚本
  13. 命令速查表

1. ACL 是什么#

传统 Linux 权限只能按三类控制:所有者、所属组、其他人。

ACL(Access Control List)可以精确到单个用户单个组,实现更细粒度的权限管理,且不影响原有权限体系。

提示

没有设置过 ACL 的文件,本质上和传统权限文件一样,只是 getfacl 会把基本权限也展示出来。


2. 安装 ACL#

Debian / Ubuntu#

Terminal window
sudo apt update
sudo apt install -y acl

CentOS / RHEL / Rocky#

Terminal window
sudo yum install -y acl
# 或
sudo dnf install -y acl

验证安装#

Terminal window
getfacl --version

3. 核心命令速览#

命令全称作用
setfaclSet File Access Control List设置 ACL 权限
getfaclGet 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 给用户添加权限#

Terminal window
# 给用户 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/blog

6.2 递归设置权限#

Terminal window
# 递归给 blogdeploy 授权(当前已有文件/目录)
sudo setfacl -R -m u:blogdeploy:rwx /opt/blog

6.3 设置默认 ACL(新文件自动继承)#

Terminal window
# 默认 ACL:以后在 /opt/blog 下创建的新文件/目录自动继承权限
sudo setfacl -R -d -m u:blogdeploy:rwx /opt/blog

6.4 同时设置当前权限和默认权限(推荐做法)#

Terminal window
# 第一步:递归授权已有内容
sudo setfacl -R -m u:blogdeploy:rwx /opt/blog
# 第二步:设置默认 ACL,新文件自动继承
sudo setfacl -R -d -m u:blogdeploy:rwx /opt/blog

6.5 查看 ACL 权限#

Terminal window
# 查看单个文件/目录的 ACL
getfacl /opt/blog

输出示例:

# file: opt/blog
# owner: root
# group: root
user::rwx
user:blogdeploy:rwx ← 自定义用户权限
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:blogdeploy:rwx ← 默认继承权限
default:group::r-x
default:mask::rwx
default:other::r-x

6.6 删除单个用户的 ACL#

Terminal window
# 删除 blogdeploy 的 ACL 权限
sudo setfacl -x u:blogdeploy /opt/blog
# 递归删除
sudo setfacl -R -x u:blogdeploy /opt/blog

7. 完整实战:创建部署用户#

场景:创建 blogdeploy 用户,只能操作 /opt/1panel/www/sites/blog 目录。

Terminal window
# 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.txt

8. 清除 ACL 恢复默认(重点)#

这是最容易搞混的部分,分三种情况讲清楚。

8.1 ACL 的默认状态是什么?#

没有设置过 ACL 的文件getfacl 输出长这样:

somefile.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

这就是 ACL 的默认状态 —— 和传统 ls -l 看到的基本权限完全一致,没有任何额外的 user:xxxdefault: 条目。

8.2 彻底删除所有 ACL 条目(恢复初始状态)#

Terminal window
# 删除所有 ACL 条目,只保留基本权限
sudo setfacl -b /opt/blog
# 递归删除整个目录树的所有 ACL
sudo setfacl -R -b /opt/blog
重要

-b 会删除所有自定义 ACL 条目(包括 user:xxxdefault:),但保留文件原有的 user::group::other:: 基本权限。 执行后文件就回到了”从未设置过 ACL”的状态。

8.3 只删除默认 ACL,保留当前权限#

Terminal window
# 只删除 default 规则,不影响已设置的当前权限
sudo setfacl -k /opt/blog
# 递归删除
sudo setfacl -R -k /opt/blog
提示

适用于:你已经给目录设好了当前权限,但不想让新文件自动继承,只想取消”默认继承”功能。

8.4 彻底归零:ACL + 基本权限全部重置#

如果你想把文件权限彻底恢复到”刚创建”的状态(比如 644755):

Terminal window
# 第一步:删除所有 ACL
sudo 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 + chmodACL + 基本权限全重置彻底归零,从头开始

9. 配合 SSH 使用#

允许密码登录:

Terminal window
sudo nano /etc/ssh/sshd_config

确保配置项:

PasswordAuthentication yes

重启 SSH:

Terminal window
sudo systemctl restart ssh
重要

Debian/Ubuntu 上 SSH 服务名是 ssh,不是 sshdsystemctl restart sshd 在某些系统上可能不生效。

Windows 连接测试:

Terminal window
ssh blogdeploy@服务器IP

10. 注意事项#

注意点说明
备份目录也要授权如果备份到 blog-backup,也要给 blogdeploy 授权
chmod 可能影响 ACLchmod 会修改 ACL 的 mask,可能影响有效权限。建议用 setfacl 管理权限
文件系统支持ext4、xfs、btrfs 都支持 ACL,fat32 不支持
挂载选项确保挂载时启用了 ACL:mount | grep acl

11. 常见问题#

Q1: setfacl 提示 “Operation not supported”#

Terminal window
# 检查文件系统是否启用 ACL
mount | grep " / "
# 如果没有 acl,编辑 /etc/fstab 添加 acl 选项,然后重新挂载

Q2: 用户能看到其他目录吗?#

ACL 只控制特定目录的权限。用户仍然可以 cd/etc,但只能看有权限的文件。

如需严格限制,考虑 chroot 或容器方案。

Q3: 如何查看某个用户有哪些 ACL 权限?#

Terminal window
# 查看所有带 ACL 的文件
getfacl -R /opt/1panel/www/sites/blog | grep "user:blogdeploy"

12. 一键设置脚本#

#!/bin/bash
USERNAME="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"
# 安装 ACL
sudo 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 路径
递归删除所有 ACLsetfacl -R -b 路径
删除默认 ACLsetfacl -k 路径

文档版本: 2026-08-12 适用系统: Debian 12 / Ubuntu 20.04+ / CentOS 7+ 适用平台: 云服务器 / 本地虚拟机

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Linux ACL 访问控制列表完整使用指南
https://blog.qtfyu.top/posts/linux-acl-complete-guide/
作者
倾听风雨
发布于
2026-08-12
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
倾听风雨
你好,我是倾听风雨,很高兴你能来到我的小家。
公告
欢迎来到我的博客!这是我的个人博客。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
最新动态
站点统计
文章
11
分类
5
标签
46
总字数
14,588
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.14.5
文章许可
CC BY-NC-SA 4.0
天气预报

文章目录