问题
我们常使用linux以下命令
cd 进入目录
ls 列出目录中的文件
或者直接打开目录中的文件
以上操作对于目录权限位的设置来说,是有一定迷惑性的,如表格所示
cd进入该目录 | cd进入该目录内目录 | ls列出该目录内文件 | 操作该目录内文件(读/写已存在文件) | 操作该目录内文件(新建) | |
r-- | No | No | No | No | No |
-w- | No | No | No | No | No |
--x | Yes | Yes | No | Yes | No |
r-x | Yes | Yes | Yes | Yes | No |
1.可以看见,当目录只有读取权限的时候,是无法用cd打开、ls列出或者操作目录内的文件的;
2.那么,为什么这里无法用cd进入目录呢?因为cd其实就是chdir,我们看看下面这段话对chdir行为的描述:
chdir函数用于改变当前工作目录。调用参数是指向目录的指针,调用进程需要有搜索整个目录的权限。每个进程都具有一个当前工作目录。在解析相对目录引用时,该目录是搜索路径的开始之处。如果调用进程更改了目录,则它只对该进程有效,而不能影响调用它的那个进程。在退出程序时,shell还会返回开始时的那个工作目录。 |
3.chdir实际上就是修改进程当前工作目录从当前目录改变到目标目录,目录的访问(如绝对路径和相对路径的访问),路径中每一个目录,都需要执行类似chdir这样的打开操作,只有打开了目录,才能继续后续的读取目录中的目录项,从而操作这个目录项的文件,当然,如果这个目录项也是指向一个目录,那么将重复上述步骤。
4.如果目标目录路径当中包含有一个目录不具备执行(x)权限,访问就无法继续下去了;
5.我们来看看《Unix高级环境编程》第4.5节 文件访问权限 的描述
我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应该具有执行权限。这就是为什么对于目录其执行权限位常被称为搜索位的原因。 |
6.无论是从相对路径,或者是绝对路径中打开文件,Linux的文件系统都只能够通过第一个文件结构指针一级一级搜索下来的,当中所包含的每一个目录,只有一个目录不具备执行权限,就会无法对该目录应用搜索,也就查找不到该目录下的任何文件,所以无法进行下一步操作;
[ives@localhost documents]$ ls -al
drwxr--r--. root root Nov : test
[ives@localhost documents]$ less /documents/test/ives/test_1.txt
test/ives/test_1.txt: Permission denied //通过root改变/documents/test权限后
[root@localhost documents]# chmod test
drwx--x--x. root root Nov : test //ives具备了操作权限
[ives@localhost documents]$ less /documents/test/ives/test_1.txt [END]
7.由于相对路径的打开方式是从当前目录开始,无需遍历完整的路径表,所以有时候当某进程已经进入了某目录,而恰好又有一个具备权限的进程修改了完整路径当中相对于当前工作目录之前的一个文件夹权限,就会出现相对路径依然能够打开,而绝对路径则不具备权限的情况
//在/documents/test具备权限前进入目录
[ives@localhost /]$ cd /documents/test/ives
[ives@localhost ives]$ //root临时改变了/documents/test权限
[root@localhost documents]# chmod test //现在ives利用相对路径依然可以访问ives目录下的文件
[ives@localhost ives]$ less test_1 [END]
//但是在这个目录下利用绝对路径访问则存在权限问题
[ives@localhost ives]$ less /documents/test/ives/test_1
/documents/test/ives/test_1: Permission denied
结论
当你访问一个路径,无论是以相对或绝对路径访问(相对路径会从当前工作目录开始),路径所需遍历的文件夹都必须具备x权限,否则就会出现因搜索问题导致查找不到该目录下的文件而无法进行下一步操作
操作動作 | /dir1 | /dir1/file1 | /dir2 | 重點 |
讀取 file1 內容 | x | r | - | 要能夠進入 /dir1 才能讀到裡面的文件資料! |
修改 file1 內容 | x | w | - | 能夠進入 /dir1 且修改 file1 才行! |
執行 file1 內容 | x | x | - | 能夠進入 /dir1 且 file1 能運作才行! |
刪除 file1 檔案 | wx | - | - | 能夠進入 /dir1 具有目錄修改的權限即可! |
將 file1 複製到 /dir2 | x | r | wx | 要能夠讀 file1 且能夠修改 /dir2 內的資料 |
如最后一列所述,要將 file1 複製到 /dir2,目标文件夹dir2必须具备w和x权限,如果只具备w,系统将会提示:
cp: failed to access ‘./l_1/test_3.c’: Permission denied
这是因为缺乏x权限来到进入该目录。
如果只具备x,系统则提示:
cp: cannot create regular file ‘./l_1/test_3.c’: Permission denied
这是因为缺乏写入权限向该目录写入一个目录项。
所以如果需要复制一个文件,目标文件夹必须具备w和x权限。
事实上不仅是复制,只要是需要在目录上建立目录项的操作,例如新建文件,重命名增加硬软链接等等,都需要当前目录具备w和x权限。
另外,当具备r和x权限时才能读取目录中的目录项,例如用于ls命令只有在rx下才能列出当前目录项。
再次重申:
如果要操作(包括读、写、执行)某个文件x,x的当前目录必须具备x权限,这是前提!
无论x的当前目录是工作目录,还是非工作目录,都是一样的!
假设有目录结构如下
./a/b/test_1 --x.
./a/b/test_2 -w-.
./a/b/test_3 r--.
test_1、test_2、test_3分别是可执行可写可读文件。
假如当前工作目录是./a,./a/b的权限为r--,那么3个文件都将不能正常的进行rwx操作,因为进程在试图打开目录./a/b中所有的目录项时候就已经失败了,获取不到test_1、test_2、test_3这些目录项,自然就操作不到它们指向的iNode了
所有操作被理所当然的卡住了
./a/b/test_1 --x.
./a/b/test_2 -w-.
./a/b/test_3 r--.