假设我想授予用户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
,然后您将陷入无限循环。)
不言而喻,如果您将其作为脚本,则目录路径和同事的姓名应该是参数。