[Linux]目錄x權限對文件操作的影響


問題

我們常使用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--.  3 root root   17 Nov 29 04:51 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 711 test
drwx--x--x.  3 root root   17 Nov 29 04:51 test

//ives具備了操作權限
[ives@localhost documents]$ less /documents/test/ives/test_1.txt
111222

[END]

7.由於相對路徑的打開方式是從當前目錄開始,無需遍歷完整的路徑表,所以有時候當某進程已經進入了某目錄,而恰好又有一個具備權限的進程修改了完整路徑當中相對於當前工作目錄之前的一個文件夾權限,就會出現相對路徑依然能夠打開,而絕對路徑則不具備權限的情況

//在/documents/test具備權限前進入目錄
[ives@localhost /]$ cd /documents/test/ives
[ives@localhost ives]$

//root臨時改變了/documents/test權限
[root@localhost documents]# chmod 744 test

//現在ives利用相對路徑依然可以訪問ives目錄下的文件
[ives@localhost ives]$ less test_1
111222
[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--.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM