为什么需要对目录具有写入和执行权限才能删除文件?

为什么需要对目录具有写入和执行权限才能删除文件?

很容易意识到文件的权限与删除该文件的能力无关。修改目录列表的能力由目录的权限控制。

然而,多年来我一直相信写权限的目的是允许修改目录的执行权限是“搜索”-列出文件或更改目录。

今天我发现rm一个目录中的文件除非两个都写入和执行位被设置。事实上,如果没有执行集,写入几乎毫无用处。

$ tree foo/
foo/
└── file_to_delete

0 directories, 1 file
$ chmod -x foo
$ ls -ld foo
drw-rw-r-- 2 ire_and_curses users 4096 Sep 18 22:08 foo/
$ rm foo/file_to_delete 
rm: cannot remove ‘foo/file_to_delete’: Permission denied
$ chmod +x foo/
$ rm foo/file_to_delete 
$ tree foo/
foo/

0 directories, 0 files
$

我觉得这种行为非常令人惊讶。对于目录,需要执行才能使写入在实践中有用的原因是什么?

答案1

如果没有执行位,则无法stat()对目录中的文件运行 a,这意味着您无法确定这些文件的 inode 信息。要删除文件,您必须知道stat().

对此的演示:

$ ls -ld test
drw------- 2 alienth alienth 4096 Sep 18 23:45 test

$ stat test/file
stat: cannot stat ‘test/file’: Permission denied

$ strace -e newfstatat rm test/file
newfstatat(AT_FDCWD, "test/file", 0x1a3f368, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied)
newfstatat(AT_FDCWD, "test/file", 0x7fff13d4f4f0, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied)
rm: cannot remove ‘test/file’: Permission denied
+++ exited with 1 +++

您还可以通过一个简单的ls -l.该目录的元数据信息对于您的用户来说可能是可读和可写的,但如果不执行,您将无法确定目录中文件的详细信息。

$ ls -l test
ls: cannot access test/file: Permission denied
total 0
-????????? ? ? ? ?            ? file

相关内容