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

最近备考需要系统的复习下Linux,在复习到inode/block/权限等概念的时候,遇到了如下疑问:
已知:
# 对于目录这种特殊文件来说,权限的意义是:
r:读取目录结构,就是可以获取目录下的文件名/子目录名等数据,即可以用ls列出来。
w:更改目录结构,可以在目录下新增、删除文件、修改文件名、子目录名等。
x:可以进入目录成为当前目录。
# 目录的结构数据存在block里,inode里只存放属性、权限以及存放数据的block号。结合上面的权限,可知:
r:可以读取目录的block里的数据,自然就可以获取目录的结构列表。
w:可以修改目录block里的数据,自然就可以更改目录的结构。
x:我目前的理解貌似跟block没啥关系。

但我的疑问就来了,为啥我把一个dir的权限设置的只剩下x,还能读取目录里一个文件的内容?
i@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@laptop:/tmp/study$ cat dir/file
12345
i@laptop:/tmp/study$ chmod a=x dir/
i@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@laptop:/tmp/study$ cat dir/file
12345

按理说dir的r权限去掉了,根据目录树读取的顺序,先用inode到inode表里取出了dir的权限,发现没有r,就没法去block里读数据了啊。
更奇怪的是,我把x也去掉,才不能读文件:
i@laptop:/tmp/study$ chmod a= dir/
i@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@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 mailing list
ubuntu-zh@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-zh

回复