如何在目录及其所有父目录上设置facl?

如何在目录及其所有父目录上设置facl?

假设我们有以下目录结构


a
  b1
    c1
    c2
  b2
    c3
    c4

我想使用 setfacl 为用户提供对 c1 的直接访问,我可以做类似的事情

setfacl -m u:frank:rX a/b1/c1

然而,这并没有让他自动访问 a 和 b1。

-R 选项确实解决了这个问题,因为它将 ACL 应用于 c1 的子级(如果有)。

答案1

您必须指定要应用 ACL 的目录列表,这对于所有可以修改文件元数据(如chownchmodchattr、 )的命令都是相同的setfattrtouch无论它们是否具有递归操作模式......在这里,您还需要确保所有路径组件都不是符号链接。

所以:

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

相关内容