为什么我们需要执行权限才能在 Unix 中更改目录?

为什么我们需要执行权限才能在 Unix 中更改目录?

以下是机器上授予的权限:

drwxrwxrwx   4 root     root         512 May 16 09:32 STC_10
drwxrw-rw-   4 root     root         512 May  5 11:22 STC_11

现在问题是:

cd STC_11
-bash: cd: STC_11: Permission denied

但这个有效:

-bash-4.0$ cd STC_10
-bash-4.0$ ls
Codemgr_wsdata  src

为什么我们需要执行权限才能访问该目录STC_11?读写权限不够吗?

命令ls即可STC_11起作用。

答案1

为了以下演示,我创建了几个目录:

$ mkdir read_only
$ mkdir exec_only
$ mkdir r_e
$ touch read_only/cant_open
$ echo foo > read_only/cant_open 
$ echo bar > exec_only/cant_find
$ echo baz > r_e/normal
$ chmod 400 read_only/
$ chmod 100 exec_only/
$ chmod 500 r_e/

读取权限足以列出目录的内容ls(1)找不到细节有关文件的信息,但它可以告诉您文件的名称。

$ ls read_only/
ls: cannot access read_only/cant_open: Permission denied
cant_open

但只读访问权限不允许你横穿目录:

$ cat read_only/cant_open 
cat: read_only/cant_open: Permission denied

执行权限足以遍历目录(包括cd),但不能列出内容:

$ ls exec_only/
ls: cannot open directory exec_only/: Permission denied

即使无法获取目录中的文件列表,您仍然可以遍历该目录:

$ cat exec_only/cant_find
bar

读取和执行权限均按预期工作:

$ ls r_e
normal
$ cat r_e/normal 
baz

虽然一开始你会感到困惑,因为你有权限列出目录中的文件,但却不能任何与它们有关的事情,而且获得许可也令人困惑用文件来做事,但不能列出它们,这是 Unix 传统的一部分,用简单的机制来做聪明的事情:仅这两个元素就很容易实现基于能力的安全。如果我要在目录中放置几千个文件,但只想一些人们阅读为他们准备的文件,我可以轻松选择不可猜测的文件名,并在人们给我钱阅读文件时提供文件名。:)

或者,也许你有十几个客户,你希望他们都能访问为他们准备的文件目录。如果你将所有客户信息放在一个只有执行权限的目录中,他们就永远无法确定你的其他客户,除非他们已经知道另一个人是客户。

答案2

根据定义,目录的“x”权限具有特殊含义 - 它意味着您有权“cd”进入其中。

答案3

权限x不仅仅意味着“执行”。这取决于它应用在哪里。对于文件,它授予执行文件的权限。对于目录,它授予更改目录的权限。我认为这与文件系统的结构没有太大关系。

相关内容