![如何在目录及其所有父目录上设置facl?](https://linux22.com/image/220672/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%9B%AE%E5%BD%95%E5%8F%8A%E5%85%B6%E6%89%80%E6%9C%89%E7%88%B6%E7%9B%AE%E5%BD%95%E4%B8%8A%E8%AE%BE%E7%BD%AEfacl%EF%BC%9F.png)
假设我们有以下目录结构
a
b1
c1
c2
b2
c3
c4
我想使用 setfacl 为用户提供对 c1 的直接访问,我可以做类似的事情
setfacl -m u:frank:rX a/b1/c1
然而,这并没有让他自动访问 a 和 b1。
-R 选项确实解决了这个问题,因为它将 ACL 应用于 c1 的子级(如果有)。
答案1
您必须指定要应用 ACL 的目录列表,这对于所有可以修改文件元数据(如chown
、chmod
、chattr
、 )的命令都是相同的setfattr
,touch
无论它们是否具有递归操作模式......在这里,您还需要确保所有路径组件都不是符号链接。
所以:
setfacl -m u:frank:rX a a/b1 a/b1/c1
或者在支持类似 csh 的大括号扩展的 shell 中:
setfacl -m u:frank:rX a{,/b1{,/c1}}
如果您的 shell 是zsh
,您可以定义一个函数,例如:
upward() until [[ $argv[-1] = . ]] { "$@"; argv[-1]=$argv[-1]:h; }
然后:
$ upward echo setfacl -m u:frank:rX a/b1/c1
setfacl -m u:frank:rX a/b1/c1
setfacl -m u:frank:rX a/b1
setfacl -m u:frank:rX a
(删除echo
实际运行setfacl
)。
或者你可以定义一个:
ancestry() until [[ $REPLY = . ]] { reply+=($REPLY); REPLY=$REPLY:h; }
用作 glob 限定符的函数:
$ echo setfacl -m u:frank:rX a/b1/c1(+ancestry)
setfacl -m u:frank:rX a a/b1 a/b1/c1
或者对于d
第 eptho
顺序:
$ echo setfacl -m u:frank:rX a/b1/c1(od+ancestry)
setfacl -m u:frank:rX a/b1/c1 a/b1 a
无论如何,请注意,一旦您授予frank
对 的搜索访问权限,如果该目录访问权限不受限制(因为上面的访问权限受到限制),a
则可能会开放他的访问权限。a/b2