如何使路径世界可读?

如何使路径世界可读?

要使某些项目 X 可供世界读取,仅拥有正确的权限是不够的:通向它的绝对路径的每个组成部分也必须具有正确的权限。 (我的理解是,如果我错了,请纠正我,X本身必须设置其世界可读的(4)位,并且每个目录其路径中的组件必须设置其全局可执行 (1) 位。)最简单的方法是什么?

FWIW,我最好的猜测是:

function _mkwr {
    chmod o+x $1 || return 0
    parent=$( dirname $1 )
    if [[ $parent = $1 ]]; then return 0; fi
    _mkwr $parent
}

function mkwr {
    chmod o+Xr $1
    _mkwr $( dirname $1 )
}

答案1

你说对了一部分。在目录上,x权限表示使用该目录获取其引用的对象的权限。r需要有读目录的权限,即列出它所引用的对象的名称(注意,如果你的权限是可以r--列出名称,但不能访问对象;如果是的话,--x只要有权限就可以访问对象)您可以给出正确的名称,但不能列出它们)。该w权限意味着修改目录,即重命名引用的对象、删除引用或添加新的引用。同样,这完全独立于其他权限。

另一方面是有3组权限,分别是用户, 这团体, 和其他的(有时命名为乌戈)。用户位集用于文件的所有者,组用于属于文件组的用户。检查权限时,如果尝试访问的用户是文件的所有者,则应用用户权限。如果用户不是文件的所有者,但属于文件的组,则应用组权限。仅当前面的情况均不适用时,才会检查其他权限。

请注意,由于权限位是完全独立的,因此上述意味着可能存在所有者和组都无权访问的文件,但其他人具有完全权限。有点奇怪,但一致且简单。

答案2

您对权限的看法是正确的:每个目录组件都必须是世界可执行的,并且该项目本身必须是世界可读的(如果它是目录,则可能也是世界可执行的)。

另一个问题是,如果路径涉及符号链接,则需要使解析符号链接所需的每个中间目录也成为全局可执行文件。

如果您有一个无符号链接的路径,一个简单的循环就可以完成这项工作:

make_directory_world_accessible () {
  dir=$1
  case $dir in /*) :;; *) dir=$PWD/$dir;; esac
  while [ -n "$dir" ]; do
    chmod a+x "$dir"
    slashes=${dir##*[!/]}; dir=${dir%$slashes}; dir=${dir%/*}
  done
}

使用符号链接,您需要手动查找所有符号链接并递归每个目录组件。内核在内部执行此操作,但不公开进程。例如,给定一个符号链接/foo/bar -> one/two/three,您不仅需要 make/foo/one/foo/twopublic,还需要检查one和是否two是符号链接并相应地递归。

相关内容