为什么我无法列出具有读取权限的目录?

为什么我无法列出具有读取权限的目录?

我在其中创建了一个目录d和一个文件。f然后我只授予自己对该目录的读取权限。我明白这应该意味着我可以列出文件(例如这里),但我不能。

will@wrmpb /p/t/permissions> ls -al
total 0
drwxr-xr-x   3 will  wheel  102  4 Oct 08:30 .
drwxrwxrwt  16 root  wheel  544  4 Oct 08:30 ..
dr--------   3 will  wheel  102  4 Oct 08:42 d
will@wrmpb /p/t/permissions> ls d
will@wrmpb /p/t/permissions>

如果我更改写入和执行的权限,我就可以看到该文件。

will@wrmpb /p/t/permissions> chmod 500 d
will@wrmpb /p/t/permissions> ls d
f
will@wrmpb /p/t/permissions> 

为什么是这样?我正在使用 MacOS。

编辑:参考@ccorn的答案,我正在使用fish并type ls给出以下内容:

will@wrmpb /p/t/permissions> type ls
ls is a function with definition
function ls --description 'List contents of directory'
    command ls -G $argv
end

答案1

一些准备工作,只是为了确保ls不会尝试过多的事情:

$ unalias ls 2>/dev/null
$ unset -f ls
$ unset CLICOLOR

目录权限演示r

$ ls -ld d
dr--------  3 ccorn  ccorn  102  4 Okt 14:35 d
$ ls d
f
$ ls -l d
ls: f: Permission denied
$ ls -F d
ls: f: Permission denied

在传统的 Unix 文件系统中,目录只是(名称、索引节点号)对的列表。索引节点号是一个整数,用作文件系统索引节点表的索引,其余文件元数据都存储在该索引节点表中。

目录的权限r允许列表其名称,但不访问存储在 inode 表中的信息,即获取文件类型、文件长度、文件权限等,或打开文件。为此,您需要x目录的权限。

这就是为什么ls -l, ls -F,ls带有颜色编码的输出等未经许可会失败x,而仅仅ls成功。

x权限单独允许 inode 访问,也就是说,在该目录中给出显式名称,x允许查找其 inode 并访问该目录条目的元数据:

$ chmod 100 d
$ ls -l d/f
-rw-r--r--  1 ccorn  ccorn  0  4 Okt 14:35 d/f
$ ls d
ls: d: Permission denied

因此,要打开文件/a/b/c/f或列出其元数据,必须向目录//a/a/b/a/b/c授予x权限。

毫不奇怪,创建目录条目需要wx权限:

$ chmod 100 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 200 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 300 d
$ touch d/g
$

维基百科在一篇文章中有一个简短的概述文件系统权限

答案2

要读取目录,您还需要能够遍历该目录(x 位)。因此,至少需要 rx 才能使目​​录能够以任何方式访问它。

相关内容