Linux系统文件权限隐藏的细节深入分析[2]
文章作者 100test 发表时间 2007:05:02 14:45:59
来源 100Test.Com百考试题网
实验2, 目录文件: /test(r-x), 普通文件: /test/file(rw-), 当前目录:/test
linux是一个安全的操作系统,她是以文件为基础而设计的,其文件权限是比较复杂的,可以用stat命令以及lsattr命令来显示某个文件的详细信息:
$ echo "abc" >file $ cat file abc
/test的权限虽然是只读,但我们改写的是file的内容, 它的权限是可写,当然没有问题。
linux是一个安全的操作系统,她是以文件为基础而设计的,其文件权限是比较复杂的,可以用stat命令以及lsattr命令来显示某个文件的详细信息:
$ mv file file2
mv: cannot move file to file2 : permission denied
$ rm -f file rm: cannot remove file : permission denied
我们已经知道, 这两条指令其实与file的权限无关, 而是在改写/test的内容, 当然操作失败。通过前面几个操作,我们应该要分清楚指令真正的操作对象是谁,这样才能对文件权限作出正确的设定。
实验3, 目录文件: /test(rwx), 普通文件: /test/file(r--), 目录文件: /test/dir(r-x), 普通文件: /test/dir/file(rw-), 当前目录:/test
linux是一个安全的操作系统,她是以文件为基础而设计的,其文件权限是比较复杂的,可以用stat命令以及lsattr命令来显示某个文件的详细信息:
$ mv file file2 $ mv dir dir2 $ ls dir2 file2
很顺利, 因为/test/file与/test/dir的父目录/test的权限给的太宽松了,是rwx。
linux是一个安全的操作系统,她是以文件为基础而设计的,其文件权限是比较复杂的,可以用stat命令以及lsattr命令来显示某个文件的详细信息:
$ rm -f file2
$ rm -rf dir2
rm: cannot remove dir2/file : permission denied
$ ls -r .: dir2 ./dir2: file
到这里, 我们已经丝毫不奇怪普通文件/test/file2被删除, 但具有同等地位的目录文件/test/dir2却安然无恙。当执行rm -rf dir2时, 由于存在普通文件/test/dir2/file, 系统便尝试先删除它, 也就相当于修改目录文件/test/dir2的内容, 但它的权限是只读, 不能进行修改,也就相当于不能删除/test/dir2/file, 又由于/test/dir2与/test/dir2/file有依存关系, /test/dir2也就自然会被保留下来。
回顾上一个操作(mv dir dir2),为什么目录文件/test/dir却可以被更名呢?由于更名操作并不涉及到自身的内容被修改,修改的只是父目录的内容,而进行删除操作时,父目录的内容固然要被修改,但也同时也要修改自身的内容(因为要删除该目录下的文件),这就不被允许了。如果/test/dir2的权限是可写, 或者目录下没有子文件, 那么它的下场就和/test/file2一样, 被删除。
通过前面的几个操作,可以看到,文件有这么几个关键状态:被读、被改写、被改名、被删除、被执行。然而系统只区分三种权限,即读、写、执行(rwx)。那么改名与删除这两个操作是否系统就置之不理了呢?不是的,系统将这两个操作归入被操作文件的上一级目录来管理。那么又是以何种方式来管理的呢?答案是目录将其下的所有文件看作是它的内容。这样,当用户更名或删除某个文件时,执行的是对上一级目录的写操作,属于rwx三种权限之一的w操作,并没有逃出系统的管理范围。
我们的大脑总是活跃的, 能想象出各种各样的事情, 能把许多简单的东西组合成很复杂东西, 上面几个实验不正是这样吗, 象这样的实验我们还可以设计出许多, 但做的越多, 脑子似乎越乱(我已经有一点了), 你能记的住这么多吗? ok, 我们也许能将它想的简单一些, 只需注意两个方面, 一是要清楚目录的内容是什么;二是要明白文件权限中的w(write)的真正含义。仔细想想, 不是吗?
补充:
在实验1中, 如果用vim对file进行编辑, 并且强制保存(w!), 是可以成功的。这并不是说vim就可以绕开系统的安全机制,而是vim耍了一个小小的把戏,它是先删除这个文件,而后又生成一个同名的新文件。但有一个情况例外,就是当这个文件有另外一个硬链接文件存在时,vim会拒绝强制保存,仔细想想,当进行删除操作后,文件还存在,并没有被真正删除,而这时再新建一个文件,虽然同名,但已经不是原来的那个文件了!笔者曾对此事也颇为疑惑,为了求证,仔细阅读了vim6.2的源代码,才找到答案。有兴趣的读者也可看一看,具体内容在src/fileio.c中。