摘自鸟哥, http://linux.vbird.org/linux_basic/0210filepermission.php
一般的档案(Regular File)用来存放资料, 那么目录主要是储存啥? 目录主要的内容在记录档名清单, 档名与目录有强烈的连接. 所以如果是针对目录时, r, w, x 对目录是什么意义呢?
r (read contents in directory)
表示具有读取目录结构清单的权限, 所以当你具有读取一个目录的权限时, 表示你可以查询该目录下的档名资料. 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来.
w (modify contents of directory)
這個可寫入的權限對目錄來說,是很了不起的! 因為他表示你具有異動該目錄結構清單的權限,也就是底下這些權限:
- 建立新的檔案與目錄;
- 刪除已經存在的檔案與目錄(不論該檔案的權限為何!)
- 將已存在的檔案或目錄進行更名;
- 搬移該目錄內的檔案、目錄位置。
總之,目錄的w權限就與該目錄底下的檔名異動有關就對了啦!
x (access directory)
咦!目錄的執行權限有啥用途啊?目錄只是記錄檔名而已,總不能拿來執行吧?沒錯!目錄不可以被執行,目錄的x代表的是使用者能否進入該目錄成為工作目錄的用途! 所謂的工作目錄(work directory)就是你目前所在的目錄啦!舉例來說,當你登入Linux時, 你所在的家目錄就是你當下的工作目錄。而變換目錄的指令是『cd』(change directory)囉!
鸟哥讲解的非常好, 但是我在实际操作的时候碰到了一个问题, 这个问题鸟哥没有覆盖到, 我一开始不太明白, 但是略加思考, 我明白了. 一并记在这里, 算是我的学习心得.
这里我以 cifer 的身份创建了一个目录 test, 里面有一个文件 test3, 如下:
$ ls -lF | grep test
$ drw-r--r-- 2 cifer cifer 4096 Apr 3 22:25 test/
可以看到, 我取消了 test 目录的 x 权限, 然后执行 ls -lF test, 结果是...
$ ls -lF test
ls: cannot access test/test3: Permission denied
total 0
-????????? ? ? ? ? ? test3
这是什么情况? 不能访问 test/test3, 为什么又打印出了 test3 这个文件? 不要被迷惑了哦, 之所以能够打印出 test3 是因为我对 test 目录还具有 r 权限. 然而只要没有 x 权限, 就是无法访问 test3 的, 所以, 您看, test3 的属性都是无法读出来的.
而那句提示 "ls: cannot access test/test3: Permission denied" 我觉得是 ls 程序的"多事"了, ls 本来就是只需要对 test 的 r 权限输出 test 的内容(也就是文件列表), 但是 ls 好像还多管闲事的去检查了下 test 目录 x 权限并以此提示用户目录下的文件不能被访问. 这是不是有点多事?
什么? 你说因为我输的是 ls -lF 而不是 ls, 加上了 -l 参数, 就明摆了让 ls 去读取 test3 的属性, 结果 ls 发现访问不了 test3, 自然就出这条错误提示了. 这怎么能说 ls 多事呢?
好吧, 既然你不服, 那我就再贴一个 ls 不带任何参数的吧:
$ ls test
ls: cannot access test/test3: Permission denied
test3
看见没? 照样有错误提示的嘛!
当然, 我对 ls 的机制也不太了解, 也许即使 ls 不带任何参数, 也会有默认的参数会涉及到访问 test3 的行为. 如果是那样的话, 那我就收回我说的 ls 多管闲事的话.
PS, 在鸟哥的教程文章里, 在与我同样的条件下, 他使用 ls -l 的时候不会有那个错误提示, 看来不同的发行版 ls 是不一样的, 我的是 Debian7, 鸟哥那个还是 CentOS 5.
PS2, 我刚才试了下, 在 CentOS 6.5 中, 也是有那个错误提示的.