
事實上,我想問更一般的問題——“目錄的寫入權限到底允許你做什麼?” ——但讓我們用一個具體的例子來探討這個問題。
這是一個很長的問題,如果你很急的話閱讀粗體——它應該涵蓋主要部分。
不同來源(好問題,多一個,格里莫爾的)對目錄權限說類似以下內容:
r, read -- 讀取目錄內容(裡面的檔名)
w, write -- 變更目錄的屬性(例如修改時間)並建立/重新命名/刪除其中的條目
x,搜尋-存取裡面的文件,你可以存取文件的索引節點,因此你可以到達它的實際內容
我的問題在於 的描述w
。它允許您存取哪些目錄屬性?我無法在只有寫入權限的目錄中建立/重新命名/刪除文件:我建立了一個目錄 ( tdir/
) 並在其中建立了一個檔案 ( ) afile
、、、、、chmod -x-r tdir/
--都因權限拒絕而失敗,除非我也對該目錄設定了權限。mv tdir/afile tdir/af
rm tdir/afile
touch tdir/newfile
x
僅此一項x
並未授予您在目錄內建立/重新命名/刪除檔案的權限。
為了做到這一點,你需要x
和w
。
但確實touch tdir
改變了目錄的修改時間w
。
我會以這種方式重新表述上述來源,以符合問題:目錄r
允許您查看其中的文件名,但無法訪問實際文件(索引節點);x
使您可以存取文件的索引節點(這意味著您可以查看它們的權限,並據此可以存取內容),但您仍然無法更改目錄中的任何內容;目錄實際上是某種文件,要更改其中的某些內容,您需要權限w
。
因此,當您更改目錄中的某些內容時,您需要w
權限。如果您的變更需要目錄中檔案的索引節點—您x
也需要。
它解釋了為什麼不能只使用以下命令刪除目錄中的檔案w
:刪除檔案時,您需要將 inode 的連結計數減少 1 - 您需要知道 inode - 因此您需要x
目錄。
但是為什麼您需要x
建立(您可以要求系統建立一個檔案而不暴露 inode?)並重新命名/移動檔案(當您移動檔案時,您不會以任何方式更改它,您只更改記錄目錄內部及其inode 計數?
也許這只是一個實施的事情?也就是說,您確實不需要 inode 來重命名/建立檔案——您只需要檔案名稱和w
權限;但inode和檔名構成目錄中的一筆記錄;因此更改檔案名稱 = 更改記錄 = 存取 inode 的方式。
那麼目錄除了修改時間、權限和檔案記錄之外還有哪些屬性呢?目錄中還有哪些內容您只能更改w
?
答案1
x 可讓您存取檔案的索引節點(這表示您可以查看它們的權限,並據此可以存取內容),但您仍然無法變更目錄中的任何內容;目錄實際上是某種文件,要更改其中的某些內容,您需要 w 權限。
是的。
但是為什麼需要 x 來建立(您可以要求系統建立一個檔案而不暴露 inode?)並重命名/移動檔案(當您移動檔案時,您不會以任何方式更改它,您只更改目錄內的記錄及其inode 計數?
如果沒有x
,您只能影響目錄本身 - 您從外部看到該目錄。如果沒有x
,目錄條目將超出您的範圍。如果您想要新增、刪除或修改(例如重新命名)目錄中的項目,您需要能夠存取該條目。
文件的權限決定了您可以對文件的內容執行哪些操作。目錄的權限決定了您可以對檔案的目錄條目執行什麼操作,因為目錄條目是目錄的內容。
目錄中的寫入權限允許您建立和刪除條目。重新命名算是原子地建立一個條目並刪除另一個條目。除此之外,目錄具有與常規文件相同的元資料。寫入權限還允許您變更目錄的上次修改和上次存取時間戳記。要變更目錄的權限、群組所有權或存取控制清單(如果支援),您需要擁有它。要更改其使用者擁有權,大多數 UNIX 變體都需要 root。