允许用户遍历给定目录的路径

允许用户遍历给定目录的路径

假设我想授予用户colleague对某个目录的读取权限/rather/long/path/to/the/directory,但不一定是对其父目录的读取权限。

例如如下解释这里那里,我首先需要确保colleague可以遍历路径。使用setfacl

setfacl -m u:colleague:x /rather
setfacl -m u:colleague:x /rather/long
setfacl -m u:colleague:x /rather/long/path
setfacl -m u:colleague:x /rather/long/path/to
setfacl -m u:colleague:x /rather/long/path/to/the
setfacl -m u:colleague:xr /rather/long/path/to/the/directory

对于深层嵌套的路径来说,这相当繁琐。有没有更优雅的方法来做到这一点?

PS 更难的是,作为普通用户,我可能没有权限更改路径中顶级目录的权限(例如/home)。如果可能的话,解决方案应该忽略这些目录(假设colleague可以遍历它们),或者更好的是,检查是否colleague允许遍历它们,如果不允许,则给出错误消息。

答案1

简单而愚蠢的答案是:

你可以缩短通过将第一个命令组合起来,稍微改变一下命令序列n其中 –1 个:

设置facl -mu:同事:x /相当 /相当/长 /相当/长/路径 /相当/长/路径/到 /相当/长/路径/到/
设置facl -mu:同事:xr /相当长/到/目录的路径

一个“明显”的警告:

即使您拥有目标(叶)目录,您也需要对路径中的每个目录具有执行(遍历)访问权限。如果有任何您无权访问且不属于您的目录,那么您就倒霉了。(您需要假设一个允许root您自己访问的身份(即目录的所有者),或者说服有权这样做的人。这超出了这个问题的范围。)

但是,如果你拥有中间目录但无权访问(例如,有人已经做了chmod 0),你需要给自己访问权限从上到下

答案:(TL;DR)

我提出上述观点是因为它是从下往上起作用的:

leaf="/相当/长/路径/到/目录"
分支=“$叶子”
while branch="$(dirname "$branch")"
     设置facl -mu:同事:x“$branch”|| 中断
     如果 [ “$branch” = / ]
     然后
         休息
完毕
设置facl -mu:同事:xr "$leaf"

setfacl您也可以选择通过添加来隐藏 中的任何错误消息2> /dev/null。如果您遇到一种病态情况,即您拥有/rather/long/rather/long/path/to,但没有/rather/long/path(但其权限是开放的),请删除|| break后面的setfacl,因为您需要在 上获取错误后继续爬树setfacl … /rather/long/path。否则,如果您不是root,您可以删除if [ "$branch" = / ]测试,因为当您到达无法运行的目录级别时,循环将终止setfacl。(但这不是一个好主意;如果您将其保存为脚本,有一天您将以脚本的形式运行它root,然后您将陷入无限循环。)

不言而喻,如果您将其作为脚本,则目录路径和同事的姓名应该是参数。

相关内容