很容易意识到文件的权限与删除该文件的能力无关。修改目录列表的能力由目录的权限控制。
然而,多年来我一直相信写权限的目的是允许修改目录的执行权限是“搜索”-列出文件或更改目录。
今天我发现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