目录文件的访问权限

[b]本文转自:http://edsionte.com/techblog/archives/2284

目录的访问权限[/b]在linux当中,文件分为多种类型。比如普通文件,目录文件和符号链接文件等。我们通常所说的“文件”则默认为普通文件,也就是指文本文件和二进制文件(关于文件的分类描述,可参看这里)。
每一类文件还有相应的访问权限。对于一个文件而言,所谓的访问权限是指文件访问者是否对该文件具有读、写或执行的权利。另外,linux是一个多用户的操作系统,它将用户分为三种:用户(u,即文件所有者),用户所在组(g),其他用户(o)。因此,对于不同身份的用户,也就应当对一个文件有不同的访问权限。所以,每个文件有9个访问权限。
对于目录文件的权限,他和普通文件稍有不同;
读:可以读取该目录,从中获得该目录中所有文件名,但不能读取到每个文件的状态;
执行:可以对该目录进行搜索,也就是通过该目录可以搜索其内的特定文件名;
写:可以在该目录下新建或删除文件,但是首先必须对该目录拥有执行权限。如果该目录没有执行权限就不能对该目录下的文件进行搜索,新建或删除文件也就无从谈起;
测试对于目录的访问权限,从文字描述的角度并不能理解的很清楚。因此,通过不断的测试才能理解这些访问权限对目录的作用效果。我们假设在edsionte主目录下有一个dirtest目录,其基本信息如下:

edsionte@edsionte-desktop:~$ ls -ld dirtest/
drwxr-xr-x 4 edsionte edsionte 4096 2011-01-17 11:06 dirtest/
edsionte@edsionte-desktop:~$ ls -l dirtest/
总用量 16
drwxr-xr-x 3 edsionte edsionte 4096 2011-01-15 16:10 cdev
-rw-r--r-- 1 edsionte edsionte  975 2010-10-17 22:06 pms.c
drwxr-xr-x 2 edsionte edsionte 4096 2011-01-13 20:49 shell
-rw-r--r-- 1 edsionte edsionte   19 2011-01-13 21:08 test.c

接下来的测试都是以edsionte用户身份对这个目录进行各种命令测试的,具体如下:1.通过ls dirtest命令,可参看该目录下的文件名。因为这个目录具有读权限;

edsionte@edsionte-desktop:~$ ls dirtest/
2	cdev  pms.c  shell  test.c

2.先使得dirtest没有执行,再执行ls命令。可以看到,虽然可以读到每个文件名,但是每个文件的属性确无法获得;

edsionte@edsionte-desktop:~$ chmod a-x dirtest/
edsionte@edsionte-desktop:~$ ls dirtest/ -l
ls: 无法访问dirtest/shell: 权限不够
ls: 无法访问dirtest/test.c: 权限不够
ls: 无法访问dirtest/pms.c: 权限不够
ls: 无法访问dirtest/cdev: 权限不够
总用量 0
d????????? ? ? ? ?                ? cdev
-????????? ? ? ? ?                ? pms.c
d????????? ? ? ? ?                ? shell
-????????? ? ? ? ?                ? test.c

3.由于没有执行权限,无法搜索判断dirtest目录下是否已存在newfile.c文件,因此无法完成touch命令,即便该目录具有写权限;

edsionte@edsionte-desktop:~$ ls -ld dirtest/
drw-r--r-- 4 edsionte edsionte 4096 2011-01-17 11:06 dirtest/
edsionte@edsionte-desktop:~$ touch dirtest/newfile.c
touch: 无法创建"dirtest/newfile.c": 权限不够

对于目录文件,也是如此:

edsionte@edsionte-desktop:~$ chmod a-x dirtest/
edsionte@edsionte-desktop:~$ mkdir ./dirtest/newdir
mkdir: 无法创建目录"./dirtest/newdir": 权限不够

4.对该目录加上执行权限后,2和3中所遇到的问题都可以解决:

edsionte@edsionte-desktop:~$ chmod a+x dirtest/
edsionte@edsionte-desktop:~$ touch dirtest/newfile.c
edsionte@edsionte-desktop:~$ ls -l dirtest/
总用量 16
drwxr-xr-x 3 edsionte edsionte 4096 2011-01-15 16:10 cdev
-rw-r--r-- 1 edsionte edsionte    0 2011-01-17 11:36 newfile.c
-rw-r--r-- 1 edsionte edsionte  975 2010-10-17 22:06 pms.c
drwxr-xr-x 2 edsionte edsionte 4096 2011-01-13 20:49 shell
-rw-r--r-- 1 edsionte edsionte   19 2011-01-13 21:08 test.c

5.继续使得dirtest没有执行权限,由于不能读取dirtest下的目录cdev,也就更不能读取cdev目录下的文件,即便cdev具有可读可执行权限;

edsionte@edsionte-desktop:~$ ls -ld dirtest/cdev/
2	drwxr-xr-x 3 edsionte edsionte 4096 2011-01-15 16:10 dirtest/cdev/
3	edsionte@edsionte-desktop:~$ chmod a-x dirtest/
4	edsionte@edsionte-desktop:~$ ls -ld dirtest/cdev/
5	ls: 无法访问dirtest/cdev/: 权限不够
6	edsionte@edsionte-desktop:~$ ls -l dirtest/cdev/
7	ls: 无法访问dirtest/cdev/: 权限不够

6.如果dirtest有执行权限却没有写权限,则不能创建新文件。这一点很好理解;

edsionte@edsionte-desktop:~$ ls -ld dirtest/
dr-xr-xr-x 4 edsionte edsionte 4096 2011-01-17 11:36 dirtest/
edsionte@edsionte-desktop:~$ mkdir ./dirtest/newdir
mkdir: 无法创建目录"./dirtest/newdir": 权限不够

7.如果dirtest有写权限却没有执行权限,则不能在该目录下删除文件;

edsionte@edsionte-desktop:~$ chmod a-x dirtest/
edsionte@edsionte-desktop:~$ ls -ld dirtest/
drw-rw-rw- 4 edsionte edsionte 4096 2011-01-17 11:36 dirtest/
edsionte@edsionte-desktop:~$ rm ./dirtest/newfile.c
rm: 无法删除"./dirtest/newfile.c": 权限不够

8.如果dirtest目录有可写权限没有可执行权限,虽然可以打开该目录下的文件test.c,但是对其修改后不能保存;

edsionte@edsionte-desktop:~$ ls dirtest/
cdev  newfile.c  pms.c  shell  test.c
edsionte@edsionte-desktop:~$ chmod a-x dirtest/
edsionte@edsionte-desktop:~$ vim ./dirtest/test.c

9.如果要修改dirtest目录下的文件test.c,对于dirtest目录而言,必须具备执行权限;而该目录的写权限则与test.c的修改无关;通过上面的测试,我们可以得出下面的结论:
1.对一个目录进行读操作,即指读该目录下的文件名;
2.对一个目录的“写”包括在该目录下删除、新建文件;更重要的是,只有该目录有可执行权限时,写操作才可以进行,否则,不能获取该目录下除文件名之外的任何文件状态信息;
3.如果在一次文件操作中,只要涉及到对目录的搜索,则该目录必须具备执行权限,否则写权限就无法进行;
一个目录的执行权限可以用下面的比喻来解释。一个目录就好像是一道门,该目录中的文件就是你想要的珍宝。并且,该门之后可能还会有其他门的存在。目录的可执行权限相当于打开这把门的钥匙,只有持有这把钥匙,你才能打开这扇目录之门。打开门后,你可能会拿走一些宝石(删除文件),或者放入一些宝石(新建文件)等。否则,你只能隔门相望门后的宝石了(只能读取文件名)。