当用户对父目录没有写权限时,为什么 chmod 对文件成功?

Ahm*_*med 4 permissions directory chmod files file-metadata

我试图了解 Linux 中的文件/目录权限。用户可以使用列出目录中的文件

cd test
ls -l 
Run Code Online (Sandbox Code Playgroud)

即使发出上述命令的用户对 test 目录中的任何文件没有读、写或执行权限,他仍然可以列出它们,因为他/她对 test 目录有读权限。

那么为什么在下面的场景中用户B可以更改他拥有的文件的权限但没有父目录的写权限?

用户 A,创建一个测试目录并让其他用户能够在其中写入:

mkdir test
chmod o+w test
Run Code Online (Sandbox Code Playgroud)

用户 B,在 test 文件夹中创建一个文件。

cd test
touch b.txt
Run Code Online (Sandbox Code Playgroud)

用户A从目录中删除其他人的写权限

chmod o-w test
Run Code Online (Sandbox Code Playgroud)

用户 B,可以成功更改权限,即使权限是目录的一部分,并且该用户对他拥有的文件的父目录没有写权限

chmod g-r b.txt
Run Code Online (Sandbox Code Playgroud)

为什么chmod没有失败,因为用户无法修改具有文件信息的目录 - 权限等?

Gil*_*il' 5

当您更改文件的元数据(权限、所有权、时间戳等)时,您不是在更改目录,而是在更改文件的 inode。这需要x目录的权限(访问文件)和文件的所有权(只有拥有文件的用户才能更改其权限)。

如果您记得文件可以在多个目录中具有硬链接,我认为这很直观。该目录包含一个将文件名映射到 inode 的表。如果一个文件在多个目录中以多个名称链接,那仍然是一个具有一组权限、所有权等的 inode,这表明文件的元数据在 inode 中,而不是在目录中。

创建、重命名、移动或删除文件涉及修改目录,因此需要对该目录的写权限。