目录的访问权限
在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/ 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/ drwxr-xr-x 3 edsionte edsionte 4096 2011-01-15 16:10 dirtest/cdev/ edsionte@edsionte-desktop:~$ chmod a-x dirtest/ edsionte@edsionte-desktop:~$ ls -ld dirtest/cdev/ ls: 无法访问dirtest/cdev/: 权限不够 edsionte@edsionte-desktop:~$ ls -l dirtest/cdev/ 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.如果在一次文件操作中,只要涉及到对目录的搜索,则该目录必须具备执行权限,否则写权限就无法进行;
一个目录的执行权限可以用下面的比喻来解释。一个目录就好像是一道门,该目录中的文件就是你想要的珍宝。并且,该门之后可能还会有其他门的存在。目录的可执行权限相当于打开这把门的钥匙,只有持有这把钥匙,你才能打开这扇目录之门。打开门后,你可能会拿走一些宝石(删除文件),或者放入一些宝石(新建文件)等。否则,你只能隔门相望门后的宝石了(只能读取文件名)。