日期:2014-05-16  浏览次数:20673 次

你不知道的Linux/Unix下目录权限的含义

节选自我的博文 Linux/Unix的精巧约定两例:目录权限和文本行数。

如有谬误敬请指正。

目录的执行权限

普通文件有执行权限、执行操作,很容易理解,目录执行权限是个啥?

?写道
目录的执行权限 是 下面操作的前提:

1. 该目录下的文件(包含子目录)的读、写、执行操作(即目录下文件的全部操作)
2. 该目录本身的写操作
? ? 注: 要对目录进行写操作,要同时有该目录的写权限 和 该目录的执行权限。
? ? 详见《Unix环境高级编程》第四章第5节“文件访问权限”;中文版第二版在第76页。
? ? 多谢kiminotes同学半夜还和我一起验证和确认这个问题,并给我找出了上面资料。

关于上面提到的目录的读、写操作的说明在下一节给出。


上面条款1实际上包含有递归说明:
1. 目录的执行权限前提要有父目录的执行权限;
2. 父目录的执行权限的前提是要有父目录的父目录的执行权限;
3. ……

?

举个例子来讲解一下,比如要读文件/home/foo/readme.txt:
1. 要读readme.txt,前提要可以执行父目录foo
2. 要执行foo目录,前提要可以执行父目录home
3. 要执行home目录,前提要可以执行父目录/(即root目录)
4. root目录没有父目录了(或者说,root目录的父目录是自己),递归终止。

?

上面分析的结果是,要读文件/home/foo/readme.txt需要:
1. readme.txt的读权限
2. foo目录的执行权限
3. home目录的执行权限
4. /目录的执行权限


通过上面分析可以看出,目录的执行权限是对其下子文件进行操作的前提。

?

所以只要对自己的Home目录的权限改成700,就可以拒绝他人查看自己Home下的文件的内容、在目录下新建或是删除文件。
# 但是可以list出Home下有哪些文件,如果他有Home目录的读权限,见下一节的说明

$ chmod 700 .
$ ls -ld .
drwx----- 9 foo foo 4.0K 2012-11-20 00:11 ./

注: ls的-d表示list文件是目录时,不去list目录下文件,而是list目录本身。

目录读、写操作

普通文件(非目录)的读、写操作很容易理解。目录的读、写操作说明如下:

?写道
目录读操作 = 可以list出目录下有哪些文件
写操作 = 可以在该目录下新建和删除这个目录下的文件(包含新建和删除子目录)
? ? ? 注:要对目录进行写操作,前提要同时有该目录的写权限 和 该目录的执行权限。

?
所以,为了删除一个现有的文件,必须对包含该文件的目录具有写权限和执行权限;对该文件本身不需要有读、写权限。

讨论

目录这些权限的约定,让整个目录(包含下面所有的子文件)的控制变得简单,简单调整这个目录上的执行权限就可以了;信息集中,方便维护。

想想Windows的约定吧,是不是想到那个“应用到所有子目录和文件”的选项,要把所有的子目录都设置一遍。