[Ubuntu-zh] [Ubuntu-Zh] Linux目录树与inode/block权限的疑问

huntxu mhuntxu在gmail.com
星期一 十二月 17 07:13:23 UTC 2012


On Mon, 17 Dec 2012 10:39:44 +0800, CHUN ZHANG <mail at zhang-chun.org> wrote:

> 最近备考需要系统的复习下Linux,在复习到inode/block/权限等概念的时候,遇到了如下疑问:
> 已知:
> # 对于目录这种特殊文件来说,权限的意义是:
> r:读取目录结构,就是可以获取目录下的文件名/子目录名等数据,即可以用ls列出来。
> w:更改目录结构,可以在目录下新增、删除文件、修改文件名、子目录名等。
> x:可以进入目录成为当前目录。
> #  
> 目录的结构数据存在block里,inode里只存放属性、权限以及存放数据的block号。结合上面的权限,可知:
> r:可以读取目录的block里的数据,自然就可以获取目录的结构列表。
> w:可以修改目录block里的数据,自然就可以更改目录的结构。
> x:我目前的理解貌似跟block没啥关系。
>
> 但我的疑问就来了,为啥我把一个dir的权限设置的只剩下x,还能读取目录里一个文件的内容?
> i at laptop:/tmp/study$ ls -li ./ ./dir/
> ./:
> total 4
> 659970 drwxr-xr-x 2 i i 4096 Dec 17 10:14 dir
>
> ./dir/:
> total 4
> 659971 -rw-r--r-- 1 i i 6 Dec 17 10:14 file
> i at laptop:/tmp/study$ cat dir/file
> 12345
> i at laptop:/tmp/study$ chmod a=x dir/
> i at laptop:/tmp/study$ ls -li ./ ./dir/
> ./:
> total 4
> 659970 d--x--x--x 2 i i 4096 Dec 17 10:14 dir
> ls: cannot open directory ./dir/: Permission denied
> i at laptop:/tmp/study$ cat dir/file
> 12345
>
> 按理说dir的r权限去掉了,根据目录树读取的顺序,先用inode到inode表里取出了dir的权限,发现没有r,就没法去block里读数据了啊。
> 更奇怪的是,我把x也去掉,才不能读文件:
> i at laptop:/tmp/study$ chmod a= dir/
> i at laptop:/tmp/study$ ls -li ./ ./dir/
> ./:
> total 4
> 659970 d--------- 2 i i 4096 Dec 17 10:14 dir
> ls: cannot open directory ./dir/: Permission denied
> i at laptop:/tmp/study$ cat dir/file
> cat: dir/file: Permission denied
>
> 真是百思不得其解,这个x不是只控制dir能否成为当前目录的吗?跟读取里面的文件有啥关系呢?

這麽理解是有偏差的,r 位控制的是讀權限,對應的系統調用是 read(),  
opendir(), readdir(),而通常所說的
x 位控制 dir 能否成為工作目錄的原因是 chdir() 調用需要對應 dir 有 x 權限。

除此之外,x 權限還控制另外一個系統調用 stat(),stat() 用以獲取文件 inode  
中的信息(open/delete 之前),
并且 stat() 需要文件所在的路徑上所有目錄都有 x 權限,通常叫做 search  
permission,就和 man chmod 中的
說法一致。

所以你要打開一個文件,或者刪除一個文件,必須要求它所在的目錄有 x 權限。
而目錄的 r  
權限,只在你需要列出目錄內容的時候才需要,與能否讀取該目錄下的文件無關。

-- 
regards,
hunt


关于邮件列表 ubuntu-zh 的更多信息