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 将简单机制用于聪明事物的传统:仅这两个元素就可以轻松实现基于能力的安全性。如果我在目录中放置几千个文件,但只想让一些人阅读为他们准备的文件,我可以很容易地选择不可猜测的文件名,并在人们给我钱来阅读文件时给出文件名。:)
或者,也许您有十几个客户端,并且您希望他们都可以访问为他们准备的文件目录。如果您将所有客户端信息放在一个只有执行访问权限的目录中,他们将永远无法确定您的其他客户端,除非他们已经知道另一个人是客户端。