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

tom*_*h13 5 unix file-permissions

以下是机器上给出的权限:

drwxrwxrwx   4 root     root         512 May 16 09:32 STC_10
drwxrw-rw-   4 root     root         512 May  5 11:22 STC_11
Run Code Online (Sandbox Code Playgroud)

现在问题来了:

cd STC_11
-bash: cd: STC_11: Permission denied
Run Code Online (Sandbox Code Playgroud)

但是这个有效:

-bash-4.0$ cd STC_10
-bash-4.0$ ls
Codemgr_wsdata  src
Run Code Online (Sandbox Code Playgroud)

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

ls对命令STC_11会工作。

sar*_*old 12

对于下面的演示,我创建了几个目录:

$ 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/
Run Code Online (Sandbox Code Playgroud)

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

$ ls read_only/
ls: cannot access read_only/cant_open: Permission denied
cant_open
Run Code Online (Sandbox Code Playgroud)

但是只读访问不允许您遍历目录:

$ cat read_only/cant_open 
cat: read_only/cant_open: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

$ ls exec_only/
ls: cannot open directory exec_only/: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

$ cat exec_only/cant_find
bar
Run Code Online (Sandbox Code Playgroud)

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

$ ls r_e
normal
$ cat r_e/normal 
baz
Run Code Online (Sandbox Code Playgroud)

虽然它最初是混乱到有权限列出目录中的文件,但不能够他们的事,那也混淆具有权限才能的事情与文件,但无法一一列举,这是一部分Unix 将简单机制用于聪明事物的传统:仅这两个元素就可以轻松实现基于能力的安全性。如果我在目录中放置几千个文件,但只想让一些人阅读为他们准备的文件,我可以很容易地选择不可猜测的文件名,并在人们给我钱来阅读文件时给出文件名。:)

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