4. 设置用户ACL:增、改、删,三板斧

好,咱们进入实操环节。前面讲了ACL是个什么东西,现在该动手了。这一章我带你过一遍用户ACL的增、改、删操作。说白了,就是怎么给一个用户开权限、改权限、收权限。

我个人习惯把这三步叫做「三板斧」。你把这几个命令练熟了,日常工作中80%的ACL场景都能搞定。

4.1 给用户添加ACL权限

先看添加。命令是 setfacl -m,-m 就是 modify 的意思。虽然叫modify,但第一次用的时候就是添加。

基本语法长这样:

setfacl -m u:用户名:权限 文件或目录

权限部分和普通Linux权限一样,用 rwx 表示。举个例子:

# 给用户 zhangsan 添加对 report.txt 的读写权限
setfacl -m u:zhangsan:rw report.txt

# 查看效果
getfacl report.txt

输出大概是这样:

# file: report.txt
# owner: root
# group: root
user::rw-
user:zhangsan:rw-
group::r--
mask::rw-
other::r--

看到没?多了一行 user:zhangsan:rw-。这就是ACL的威力——zhangsan 这个用户,既不是文件所有者,也不在文件所属组里,但照样能读写这个文件。

小技巧: 我习惯在添加完ACL后立刻用 getfacl 看一眼。确认无误再走下一步,避免手滑写错权限。

给目录添加ACL也类似:

setfacl -m u:zhangsan:rx /data/project

不过这里有个坑。你给目录加了ACL,目录里已有的文件并不会自动继承。想让新文件也继承?得加 -d 参数,这个后面章节会细讲。

4.2 修改用户ACL权限

修改和添加用的是同一个命令——setfacl -m。你没看错,就是同一个。系统会判断:如果这个用户还没有ACL条目,就新建;如果已经有了,就覆盖。

举个例子:

# zhangsan 原来只有 rw 权限,现在改成 rwx
setfacl -m u:zhangsan:rwx report.txt

再看一下:

getfacl report.txt
# file: report.txt
# owner: root
# group: root
user::rw-
user:zhangsan:rwx
group::r--
mask::rwx
other::r--

注意看,mask 也自动变成了 rwx。这个 mask 是什么?我简单解释一下——它是ACL的「上限阀门」。你给用户设了 rwx,但如果 mask 只有 r--,那用户实际能拿到的只有 r--。

避坑指南: 我曾经在项目里遇到过一个问题:给一个同事加了 rwx 权限,但他还是写不了文件。查了半天,发现是 mask 被卡住了。所以修改权限后,记得看一眼 mask 有没有跟着变。

修改权限时,我建议你遵循「最小权限原则」。给够用的就行,别一上来就 rwx。比如用户只需要读,就给 r--;需要读和写,就给 rw-。权限给大了,安全风险就上来了。

4.3 删除用户ACL权限

删除分两种:删单个用户的ACL,或者删整个文件的ACL。

4.3.1 删除指定用户的ACL

用 setfacl -x,-x 就是 remove 的意思。

# 删除 zhangsan 的 ACL 条目
setfacl -x u:zhangsan report.txt

执行完再看:

getfacl report.txt
# file: report.txt
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

zhangsan 那行没了。干净利落。

4.3.2 删除所有ACL条目

有时候你想把整个文件的ACL全部清掉,恢复到传统权限模式。用 -b 参数:

setfacl -b report.txt

这个 -b 是「全部移除」的意思。执行后,所有ACL条目都会被删除,只保留传统的 owner/group/other 权限。

重要提醒: setfacl -b 是「核弹级」操作。执行前一定确认清楚,是不是真的要把所有ACL都清掉。我见过有人手快,把整个项目目录的ACL全清了,结果一堆人访问不了,线上事故。

4.4 核心逻辑图:ACL增删改流程

下面这张图帮你理清整个流程。从判断用户是否存在,到执行命令,再到验证结果,一步不落。

用户ACL增删改操作流程 开始操作 判断操作类型:增 / 改 / 删 添加:setfacl -m 修改:setfacl -m 删除:setfacl -x / -b 执行命令,系统更新ACL条目 验证:getfacl 查看结果 结果是否符合预期? 是 → 完成 否 → 重新操作

4.5 常用命令速查表

我把这一章的命令整理成了一张表。你把它存下来,用的时候直接查。

操作 命令 示例 说明
添加/修改用户ACL setfacl -m u:用户名:权限 文件 setfacl -m u:zhangsan:rwx file 用户不存在则添加,存在则覆盖
删除指定用户ACL setfacl -x u:用户名 文件 setfacl -x u:zhangsan file 只删除该用户的ACL条目
删除所有ACL setfacl -b 文件 setfacl -b file 清空所有ACL,恢复传统权限
查看ACL getfacl 文件 getfacl file 查看当前所有ACL条目

4.6 避坑总结

最后,我把这一章容易踩的坑列出来。你记住这几个,能省不少排查时间。

  • mask 会限制权限:你给用户设了 rwx,但 mask 只有 r--,用户实际只能读。修改后记得用 getfacl 确认 mask。
  • 目录ACL不自动继承:给目录加ACL,已有文件不受影响。想让新文件继承,需要加 -d 参数。
  • 删除操作不可逆:setfacl -b 清掉所有ACL后,没法一键恢复。操作前最好备份一下 getfacl 的输出。
  • 权限别给太大:能用 r-- 就别给 rwx。权限越大,风险越大。