问题
我们常使用linux以下命令
cd 进入目录
ls 列出目录中的文件
或者直接打开目录中的文件
以上操作对于目录权限位的设置来说,是有一定迷惑性的,如表格所示
cd打开目录 | ls列出文件 | 操作目录内文件(读/写/执行) | |
r | No | No | No |
w | No | No | No |
x | Yes | No | Yes |
可以看见,当目录只有读取权限的时候,是无法用cd打开、ls列出或者操作目录内的文件的;
而事实上当目录具备读取权限时,实际上是可以读取到该目录信息,并且列出当前目录的文件的。
那么,为什么这里无法用cd进入目录呢?因为cd其实就是chdir,我们看看下面这段话对chdir行为的描述:
chdir函数用于改变当前工作目录。调用参数是指向目录的指针,调用进程需要有搜索整个目录的权限。每个进程都具有一个当前工作目录。在解析相对目录引用时,该目录是搜索路径的开始之处。如果调用进程更改了目录,则它只对该进程有效,而不能影响调用它的那个进程。在退出程序时,shell还会返回开始时的那个工作目录。 |
chdir实际上就是修改进程当前工作目录从当前目录改变到目标目录,如果目标目录不具备执行权限就无法应用chdir函数;
实际上ls无法执行,和无法操作目录内的文件,也是因为这个原因,ls实际上是调用了遍历目录的函数再配合lstat函数输出文件信息,当不具备执行权限时,遍历函数无法对该目录应用搜索,也就查找不到任何文件,所以无法进行下一步lstat操作,只能抛出permission denied;
而目录文件无法操作,也是同样原因,因为没有执行权限所以系统调用无法搜索到该目录下的任何文件,所以就无法定位到这个文件上去执行下一步打开文件操作了;
我们来看看《Unix高级环境编程》第4.5节 文件访问权限 的描述
我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应该具有执行权限。这就是为什么对于目录其执行权限位常被称为搜索位的原因。 |