目錄的只寫權限不允許重命名(移動)其中的檔案?

目錄的只寫權限不允許重命名(移動)其中的檔案?

事實上,我想問更一般的問題——“目錄的寫入權限到底允許你做什麼?” ——但讓我們用一個具體的例子來探討這個問題。

這是一個很長的問題,如果你很急的話閱讀粗體——它應該涵蓋主要部分。

不同來源(好問題,多一個,格里莫爾的)對目錄權限說類似以下內容:

r, read -- 讀取目錄內容(裡面的檔名)

w, write -- 變更目錄的屬性(例如修改時間)並建立/重新命名/刪除其中的條目

x,搜尋-存取裡面的文件,你可以存取文件的索引節點,因此你可以到達它的實際內容

我的問題在於 的描述w。它允許您存取哪些目錄屬性?我無法在只有寫入權限的目錄中建立/重新命名/刪除文件:我建立了一個目錄 ( tdir/) 並在其中建立了一個檔案 ( ) afile、、、、、chmod -x-r tdir/--都因權限拒絕而失敗,除非我也對該目錄設定了權限。mv tdir/afile tdir/afrm tdir/afiletouch tdir/newfilex

僅此一項x並未授予您在目錄內建立/重新命名/刪除檔案的權限。

為了做到這一點,你需要xw

但確實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。

相關內容