我在其中创建了一个目录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
权限。
毫不奇怪,创建目录条目需要w
和x
权限:
$ 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 才能使目录能够以任何方式访问它。