Unix 上的文件系统权限

Unix 上的文件系统权限

如果我有一个文件夹被指定为不可读。它下面的所有文件夹是否也都不可读?例如,我的共享主机主帐户目录无法供其他帐户访问,那么,该主帐户目录下所有 0777 文件夹和文件是否也都不可访问?

答案1

目录有两种不同的读取权限。您拥有标准读取权限,就像您对文件一样。这会阻止您对目录执行 opendir()/readdir()。这基本上会阻止您在目录中执行 ls。如果您知道子目录的名称,您仍然可以访问子目录。您还拥有执行权限,对于目录,这会阻止您访问其中的文件。您无法将目录更改为您没有执行权限的目录,也无法访问其下的任何内容,但您仍然可以读取内容。

# mkdir -p read/subdirectory
# mkdir -p execute/subdirectory
# chmod o-x execute/
# chmod o-r read
# logout
% ls -ld read/ execute/
drwxr-xr-- 3 root root 4096 2009-10-20 14:43 execute/
drwxr-x--x 3 root root 4096 2009-10-20 14:43 read/
% ls read
ls: cannot open directory read: Permission denied
% ls execute
ls: cannot access execute/subdirectory: Permission denied
subdirectory
% cd read/subdirectory
% cd -
% cd execute/subdirectory
bash: cd: execute/subdirectory: Permission denied

您会注意到显示ls execute错误和子目录。原因是 ls 被允许读取执行目录并发现子目录,但 ls 将统计子目录并在那里获得拒绝权限。

答案2

答案是“是”。例如,如果 /foo 为模式-r-x------,则除所有者之外,任何人都无法读取或更改 /foo,因此该目录下的所有内容对于其他所有人来说都是无法访问的,无论权限如何。

答案3

这取决于实现方式,但在大多数现代 unix 中,阻止访问父文件夹也会阻止访问子文件夹,无论它们各自的权限如何。

user@host:/$ sudo chmod 700 test
user@host:/$ sudo ls -ld test/test
drwxr-xr-x 2 root root 4096 2009-10-20 15:29 test/test
user@host:/$ ls -ld test/test
ls: cannot access test/test: Permission denied

如果您希望授予子文件夹的访问权限,您可以在父文件夹上设置执行位。

user@host:/$ sudo chmod 711 test
user@host:/$ ls -l test
ls: cannot open directory /test: Permission denied
user@host:/$ ls -ld test/test
drwxr-xr-x 2 root root 4096 2009-10-20 15:29 test/test

如您所见,这会阻止列出父文件夹,但允许访问子文件夹和文件。

答案4

读取父目录不可读的目录:

[kbrandt@kb: ~/scrap/perm] ls -ld foo                                                                                         
d--x------ 4 kbrandt kbrandt 4096 2009-10-20 08:45 foo
[kbrandt@kb: ~/scrap/perm] ls -ld foo/bar                                                                                     
drwxrwxr-x 3 kbrandt kbrandt 4096 2009-10-20 08:55 foo/bar
[kbrandt@kb: ~/scrap/perm] ls foo                                                                                           
ls: cannot open directory foo: Permission denied
[kbrandt@kb: ~/scrap/perm] ls foo/bar                                                                                       
baz  foo

但是目录权限并不是你所想的那样(从你的帖子中我收集到的信息来看):

执行(搜索)——进入目录
写入——创建和删除该目录中的文件
读取——列出目录中的文件

执行(搜索)确实要求所有父级都具有执行集,这与读取和写入不同。

这是一个说明为什么理解目录权限很重要的例子:
即使 root 拥有某个文件,并且其他用户都没有该文件的写权限本身,如果另一个用户可以写入和搜索该目录,则该用户就可以删除该文件(假设这是最后剩下的硬链接)。

相关内容