核心思路是用setfacl为该用户单独设置无写权限的acl条目:setfacl -m u:username:rx /path/to/dir可移除其写权但保留读和执行;若需彻底禁止则设为---;该操作不改动属主和传统权限,仅精确拦截该用户。

用 setfacl 临时冻结某用户对目录的写入权限,核心思路是**针对该用户单独设置拒绝写权限(-w)的 ACL 条目**,且不改动目录本身的属主(chown)和默认权限(chmod)。这属于“访问控制列表层面的精确拦截”,不影响其他用户或组的正常访问。
1. 为特定用户添加写入拒绝 ACL(关键操作)
Linux 的 ACL 支持“拒绝”语义(需文件系统支持,如 ext4/xfs 默认支持),但注意:标准 POSIX ACL 本身不直接支持 deny 条目;实际中我们使用“覆盖式最小权限”策略——即显式移除该用户的写权限,同时保留读和执行(进入目录必需)。
正确做法是:用 setfacl -m 为该用户设置仅 r-x(或更严格)的权限:
-
setfacl -m u:username:rx /path/to/dir—— 移除该用户的写权,保留读+执行(可查看、cd 进入) - 若需完全禁止访问(包括读),则设为
---:setfacl -m u:username:--- /path/to/dir - 该操作只影响该用户在该目录上的 ACL 条目,不改变目录的 owner/group 或传统权限位
2. 确保目录启用 ACL 且继承机制可控
冻结效果要持久到子目录/文件,需配合默认 ACL(default ACL);但“临时冻结”通常只需作用于当前目录。若需向下继承:
- 先确认挂载选项含
acl:mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep acl - 如需新创建的子项也继承冻结状态,加 default 条目:
setfacl -d -m u:username:rx /path/to/dir - 注意:default ACL 不影响已有子项,只对后续新建文件/目录生效
3. 验证与快速恢复
操作后务必验证,避免误锁:
- 查看当前 ACL:
getfacl /path/to/dir,确认出现类似user:username:r-x行 - 切换至该用户测试:
sudo -u username touch /path/to/dir/testfile→ 应报Permission denied - 恢复写权限只需删除该用户 ACL 条目:
setfacl -x u:username /path/to/dir - 或一键清除所有自定义 ACL(保留基础 owner/group 权限):
setfacl -b /path/to/dir
4. 注意事项与常见误区
ACL 冻结不是万能开关,需避开几个典型坑:
- 用户若属于目录所属组,且组权限含
w,则仍可通过组身份写入 → 需同步检查并调整组 ACL 或目录组权限 - root 用户不受 ACL 限制,始终可写(这是设计使然,非 bug)
- 不要用
chmod o-w替代 —— 这会改掉“others”权限,影响所有非属主/属组用户,粒度太粗 - SELinux/AppArmor 等 MAC 系统可能叠加限制,ACL 生效需先确保无更高优先级策略冲突











