[Linux]目录权限对文件操作的影响

时间:2021-06-01 12:24:21

问题

我们常使用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节 文件访问权限 的描述

我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应该具有执行权限。这就是为什么对于目录其执行权限位常被称为搜索位的原因。