是否有任何 UNIX 系统允许将文件移动到目录,并使用 +rw -x 权限重命名目录中的文件?

是否有任何 UNIX 系统允许将文件移动到目录,并使用 +rw -x 权限重命名目录中的文件?

我试图更好地了解 UNIX/LINUX 文件系统的工作原理。

Linux 上的文件系统

与索引节点相比,目录结构包含有关文件的有限信息。它只保存文件的索引节点号、名称和名称长度。

info '(coreutils) File permissions'
  1. 读取文件的权限。对于目录,这意味着列出目录内容的权限。
  2. 写入(更改)文件的权限。对于目录,这意味着在目录中创建和删除文件的权限。
  3. 执行文件的权限(将其作为程序运行)。对于目录,这意味着访问目录中文件的权限。

现在readwrite权限意味着读取和写入目录,这就是为什么没有x ls只给出名称。x给出access files这样一个人可以读取索引节点:文件权限等和数据 - 因此可以在预先知道名称的情况下访问文件。

但为什么系统(确切地说是 Linux Mint 20,尽管据我回忆,现在许多 UNIX 的行为方式相同 - 但并非所有操作系统):

ls -lad 1
drw-rw-rw- 2 alex alex 60 Oct  5 10:55 1
mv ./test ./1
mv: cannot stat './1/test': Permission denied
mv 1/2 1/3
mv: failed to access '1/3': Permission denied

mv一个文件到文件夹,并+rw -x生成permission denied? - 我已写入目录,系统可以将硬链接写入文件以及目录名称,并r允许检查具有该名称的文件是否已存在(重命名mv产生类似结果的文件)。用例是您可以将文件拖放到目录中,但稍后无法访问/更改它。有什么原因它不能那样工作吗?任何 UNIX 系统允许这样做吗?

添加:

根据评论: man 'rename(2)'

ERRORS EACCES 包含oldpath或newpath的目录被拒绝写权限,或者oldpath或newpath的路径前缀之一的目录被拒绝搜索权限,或者oldpath是目录且不允许写权限(需要更新.. 入口)。 (另请参见 path_resolution(7)。)

那么问题就变成了:为什么 rename 系统调用需要 newpath 前缀最后一部分的搜索权限?我知道这样更容易检查是否存在和是否允许更换,但在我看来,它可以在没有搜索权限的情况下编写,但可以通过读取权限来检查名称是否存在。

答案1

为了将文件移动到目录中,您需要能够枚举目录内容,即 X 权限。

来自维基百科:执行权限授予执行文件的能力。当为目录设置时,执行权限被解释为搜索权限:如果文件名称已知,则它授予访问文件内容和元信息的能力,但不会列出目录内的文件,除非还设置了读取。

更多信息请点击这里:https://www.hackinglinuxexpose.com/articles/20030424.html

来自man renameat2(系统调用mv使用):

       EACCES Write permission is denied for the directory containing
              oldpath or newpath, or, search permission is denied for
              one of the directories in the path prefix of oldpath or
              newpath, or oldpath is a directory and does not allow
              write permission (needed to update the ..  entry).  (See
              also path_resolution(7).)

Linux 下至少需要执行权限,并且由于 Linux 很大程度上符合 POSIX,我相信所有其他 Unix 都以相同的方式工作。

我想说这有点违反直觉,但事实就是如此。

是否有任何 UNIX 系统允许将文件移动到目录,并使用 +rw -x 权限重命名目录中的文件?

我不知道有这样的 Unix,但我只使用过 MacOS、Linux、FreeBSD。

相关内容