3. ACL 命令入门:getfacl 与 setfacl 详解
好,咱们进入实操环节。前面聊了那么多 ACL 的概念和原理,说白了都是为了这一刻——敲命令。我个人习惯是,学一个新工具,先看怎么查,再看怎么改。所以咱们先讲 getfacl,再讲 setfacl。
3.1 getfacl:查看文件 ACL 的利器
getfacl 这个名字很直白——get file ACL。它的作用就是把你文件或目录上挂着的 ACL 规则,一条条列出来给你看。
基本用法就一行:
getfacl /path/to/file
我在项目中遇到过不少新手,上来就用 ls -l 看权限,发现有个 + 号,然后就懵了。其实这时候你只需要敲一下 getfacl,所有隐藏的规则就全现形了。
举个例子,咱们创建一个测试文件:
touch test.txt
getfacl test.txt
输出大概长这样:
# file: test.txt
# owner: alice
# group: devops
user::rw-
group::r--
other::r--
嗯,这里要注意。前面带 # 的行是注释信息,不是真正的 ACL 规则。它们告诉你这个文件的属主、属组。下面三行才是标准的 POSIX 权限,对应 rw-r--r--。
那如果文件上挂了额外的 ACL 规则呢?比如我们给用户 bob 单独授权:
setfacl -m u:bob:rwx test.txt
getfacl test.txt
输出变成:
# file: test.txt
# owner: alice
# group: devops
user::rw-
user:bob:rwx
group::r--
mask::rwx
other::r--
看到了吗?多了一行 user:bob:rwx,这就是我们给 bob 单独加的权限。还多了一行 mask::rwx,这个 mask 是什么?别急,下一章我会专门讲它,你先记住它是个“上限阀门”就行。
核心要点: getfacl 输出的每一行,格式都是 标签:主体:权限。标签有 user、group、mask、other 四种。主体可以是用户名、组名,也可以是空的(表示属主或属组)。
3.2 setfacl:设置 ACL 规则
setfacl 才是真正动手改权限的命令。它的语法稍微复杂一点,但核心就几个参数。
先看最常用的 -m 参数,表示修改(modify)现有规则:
setfacl -m u:bob:rwx test.txt
setfacl -m g:devops:rx test.txt
第一行给用户 bob 设置 rwx 权限,第二行给 devops 组设置 rx 权限。格式很统一:u:用户名:权限 或 g:组名:权限。
那如果要移除某条规则呢?用 -x 参数:
setfacl -x u:bob test.txt
这条命令会把 bob 的 ACL 条目删掉。注意,这里不需要写权限位,只写主体就行。
还有一种情况——你想把整个 ACL 规则全部清掉,恢复到传统权限。用 -b 参数:
setfacl -b test.txt
我曾经在线上环境遇到过一个问题:某个运维脚本跑完后,文件权限变得乱七八糟,所有 ACL 规则都堆在上面。排查了半天,最后发现是脚本里用了 setfacl -m 但没加 --mask 控制。嗯,从那以后我养成了一个习惯——批量操作前先用 getfacl 看一眼当前状态。
我的小技巧: 如果你不确定当前 ACL 规则是什么,先 getfacl 再 setfacl。别凭记忆敲,你想想看,权限这东西敲错了,轻则服务挂掉,重则数据泄露。
3.3 常用参数速查表
我把 setfacl 最常用的几个参数整理了一下,你直接收藏就行:
| 参数 | 含义 | 示例 |
|---|---|---|
-m |
修改或添加 ACL 规则 | setfacl -m u:bob:rwx file |
-x |
移除指定主体的 ACL 规则 | setfacl -x u:bob file |
-b |
移除所有扩展 ACL 规则 | setfacl -b file |
-R |
递归应用到目录下所有文件 | setfacl -R -m u:bob:rx dir/ |
-d |
设置默认 ACL(仅对目录有效) | setfacl -d -m u:bob:rx dir/ |
--mask |
重新计算 mask 值 | setfacl --mask file |
警告: -R 参数很强大,但也危险。我曾经见过有人对整个 /etc 目录递归执行 setfacl -R -m o::---,结果所有系统服务都起不来了。用 -R 之前,务必确认路径范围。
3.4 查看文件 ACL 的几种姿势
除了 getfacl,还有没有其他方式能看出文件挂了 ACL?有,但都不如 getfacl 直观。
第一种,ls -l。如果权限位后面有个 + 号,就说明这个文件有扩展 ACL:
$ ls -l test.txt
-rw-rwxr--+ 1 alice devops 0 Mar 15 10:00 test.txt
看到那个 + 了吗?它就是 ACL 的“信号灯”。但 ls -l 只能告诉你“有”,不能告诉你“有什么”。
第二种,stat 命令。它能显示更详细的 inode 信息,包括 ACL 相关的标记:
$ stat test.txt
File: test.txt
Size: 0 Blocks: 0 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1234567 Links: 1
Access: (0775/-rwxrwxr-x+) Uid: ( 1000/ alice) Gid: ( 1000/ devops)
注意看 Access 那行,权限位后面也有个 +。但同样,它不告诉你具体规则。
所以我的建议是:ls -l 用来快速扫描,看到 + 号就敲 getfacl 看详情。这才是高效的工作流。
3.5 本章知识体系
下面这张图帮你把本章的核心逻辑串起来:
这张图把本章的知识点串起来了。左边是查看体系,右边是设置体系。你想想看,实际工作中是不是这样?先发现问题,再定位原因,最后动手解决。ACL 的操作流程也是一样的逻辑。