我用的是FC9, 碰到一个目录权限问题:
[test@XYZ hello]$ pwd
/home/test/hello
[test@XYZ hello]$ ls -l
total 4
-rw-rw-r-- 1 test test 13 2009-10-30 02:41 test.txt
[test@XYZ hello]$ ls -ld .
drwxrwxr-x 2 test test 4096 2009-10-30 02:41 .
[test@XYZ hello]$
这个是test用户家目录下的一个文件和其所在目录的权限, /home/test的权限位是drwx------
我用xyz用户直接访问该文件, 显示“Permission denied”
[xyz@XYZ ~]$ cat /home/test/hello/test.txt
cat: /home/test/hello/test.txt: Permission denied
为什么, 权限会有继承么??
或者, 可以从文件系统的角度来解释下为什么? 比如说 , 读一个文件的时候, 文件系统是怎么定位到这个文件的
PS, 我执行chmod og+rx /home/test后, 用xyz用户执行cat /home/test/hello/test.txt 就木问题
解答: 今天偶尔在《APUE》中译第二版的第四章(P76)发现这段解释:
我们用名字(路径)打开任何一类文件时, 对该路径中包含的每一个目录, 包括它可能隐含的当前工作目录都应该具有执行权限x。 这就是为什么对于目录其执行权限位常被称为搜索位的原因。
例如, 为了打开文件/usr/include/stdio.h, 需要对目录/、/usr和/usr/include具有执行权限, 然后, 需要对该文件本身的适当权限, 这取决于以何种模式打开它(只读、读-写等)
注意, 对于目录的读权限和执行权限的意义(相比其他文件)是不同的。 读权限允许我们读目录, 获得在该目录中所有文件名的列表。 当一个目录是我们要访问文件的路径名的一个组成部分时, 对该目录的执行权限使我们可以通过该目录(也就是搜索该目录, 寻找一个特定的文件名)。 引用隐含目录的另一个例子是, 如果PATH环境变量指定了一个我们不具有执行权限的目录, 那么shell绝不会在该目录下找到任何可执行文件。
进程每次打开,创建或者删除一个文件时, 内核就进行文件访问权限测试, 而这种测试可能涉及文件的所有者(st_uid和st_gid),进程的有效id(有效用户id和有效组id)以及进程的附加组id(如果支持的话)。 两个所有者id是文件的性质, 而两个有效id和附加组id则是进程的性质。
2010-03-02更新: 发现软连接连到某个目录/文件(ls发现对所有用户都是可读写执行的), 但是如果真实路径中有任何一个目录当前用户没有相应权限, 还是会显示“permission denied“, 即软连接不能改变文件/目录对当前用户的权限限制。
阅读(812) | 评论(0) | 转发(0) |