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


14

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

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的答案,这与我使用鱼有关,并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

重复项无法回答问题。这意味着您可以做我无法证明的事情。@ccorn的答案是完美的。
wrgrs

哇,“鱼”这个东西是(最初)缺少信息的一个相当重要的部分。
斯蒂芬·基特

是的,您是对的,我应该添加它,但是如果您使用bash,似乎也会发生相同的事情alias ls='ls -G',我认为很多人都会这样做。
wrgrs 17-10-4

为我做。您在MacOS上吗?也许这里还有另一个问题。编辑:是的,我在Linux上得到了不同的行为。
wrgrs 17-10-4

Answers:


8

一些准备,只是为了确保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 -lls -Fls用颜色编码输出等故障也不会x允许,而只有ls成功。

x单独的权限就允许索引节点的访问,即在该目录中给定显式名称的情况下,它x允许查找其索引节点并访问该目录条目的元数据:

$ 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
$

Wikipedia在有关文件系统权限的文章中对此进行了简要概述。


惊人。/bin/ls d显示我的内容。谢谢!
wrgrs

好的,所以这是一个重新定义的问题(-G用于彩色输出,需要元数据,因此需要x烫发)。因此,我与unalias ls和的准备工作unset CLICOLOR。我应该添加unset -f ls删除所有这样的函数定义。编辑。
ccorn


4

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


2
不,你不会;即使该目录不是可执行文件,它ls仍应能够列出目录中的文件。
史蒂芬·基特

您可以关闭读取权限。然后,您将能够访问文件,但不能列出目录的内容。
库萨兰达

@Kusalananda-好点,确实我不时使用此功能。
Soruk

@Stephen Kitt-也许应该,但是实现方式不是。
Soruk

1
@Soruk,所以问题仍然存在:为什么不呢?
斯蒂芬·基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.