ACL不直接支持“防删不防改”,因删除依赖父目录写权限而修改只需文件自身写权限;需设置父目录无alice写权限、文件本身有写权限,并可加sticky bit和default ACL保障。

ACL(Access Control List)本身不直接支持“防删不防改”这种语义——删除操作本质上依赖于父目录的写权限,而非文件自身的权限。真正实现该效果,关键在于合理分离文件与父目录的ACL控制,并配合 sticky bit 或更精细的权限建模。
理解“删”和“改”的权限来源不同
在 POSIX 文件系统中:
-
修改文件内容 只需要对文件本身有
w权限(或 ACL 中的write_data); -
删除文件 实际上是修改其所在目录的结构(移除目录项),因此取决于父目录是否赋予用户
w权限(或 ACL 中的delete_child)。
这意味着:即使某用户对文件有完全写权限,只要他没有父目录的写权限,就无法删除该文件。
配置步骤:父目录禁写 + 文件本体可写
以目录 /shared/docs/ 为例,希望用户 alice 能编辑其中文件但不能删除:
- 设置父目录
/shared/docs的 ACL,移除alice的w权限(即禁止delete_child):setfacl -m u:alice:-wx /shared/docs(注意:这里-wx表示显式拒绝写+执行,但更稳妥做法是只赋r-x) - 确保
alice对目标文件(如/shared/docs/report.txt)有写权限:setfacl -m u:alice:rw- /shared/docs/report.txt - (可选但推荐)在父目录设 sticky bit:
chmod +t /shared/docs—— 这能防止非属主用户删除他人创建的文件,进一步加固。
使用 default ACL 避免新文件权限丢失
若希望后续在该目录中新建的文件也自动继承对 alice 的读写权限(但不赋予其删目录的权力),需设置默认 ACL:
setfacl -d -m u:alice:rw- /shared/docs- 这样,
alice创建的新文件会自动获得rw-,但她仍无法删除——因为删除权限由父目录控制,而父目录 ACL 并未给她w。
注意:default ACL 不影响目录本身的权限,只作用于新创建的子项。
验证与常见陷阱
用 getfacl 检查实际生效的权限:
-
getfacl /shared/docs→ 确认alice没有w(或显示user:alice:r-x) -
getfacl /shared/docs/report.txt→ 确认含user:alice:rw-
常见问题:
- 用户仍能删除?→ 检查是否误给了父目录
w,或用户是目录属主/有 root 权限; - 无法保存修改?→ 检查文件本身 ACL 是否真有
w,且文件系统挂载时启用 ACL(如mount -o acl); - 编辑器提示“只读”?→ 某些编辑器(如 vim)会尝试删旧文件再写新文件,此时需改用追加模式或配置编辑器避免原子重写。

















