目錄的只寫權限不允許重命名(移動)裡面的文件?
事實上,我想問一個更籠統的問題——“目錄的寫權限到底允許你做什麼?” ——但讓我們用一個具體的例子來處理它。
這是一個很長的問題,如果您急於閱讀粗體字- 它應該涵蓋主要部分。
不同的來源(很好的問題,還有一個,grymoire’s)在目錄權限上說類似於以下內容:
r, read – 讀取目錄的內容(裡面的文件名)
w, write – 更改目錄的屬性(例如修改時間)並在其中創建/重命名/刪除條目
x, search – 訪問裡面的文件,你可以訪問文件的inode,因此你可以訪問它的實際內容
我的問題在於
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
允許您查看其中的文件名,但無法訪問實際文件(對 inode);x
使您可以訪問文件的 inode(這意味著您可以查看它們的權限,並且據此可以訪問內容),但您仍然無法更改目錄中的任何內容;目錄實際上是某種文件,要更改其中的某些內容,您需要w
許可。因此,當您更改目錄中的某些內容時,您需要
w
許可。如果您的更改需要目錄中文件的 inode - 您也需要x
。它解釋了為什麼您不能
w
僅刪除目錄中的文件:刪除文件時,您需要將 inode 的連結計數減少 1 - 您需要知道 inode - 因此您需要x
directory。但是為什麼你需要
x
創建(你可以要求系統在不暴露 inode 的情況下創建一個文件?)和重命名/移動文件(當你移動一個文件時你不會以任何方式改變它,你只會改變記錄在目錄及其 inode 計數內?)?也許這只是一個實現的東西?也就是說,您確實不需要 inode 來重命名/創建文件——您只需要文件名和
w
權限;但inode和filename構成目錄中的一條記錄;因此更改文件名 = 更改記錄 = 訪問 inode 的方式。還有目錄除了修改時間、權限和文件記錄還有什麼屬性?您只能更改目錄中的哪些內容
w
?
x 使您可以訪問文件的 inode(這意味著您可以查看它們的權限,並且據此可以訪問內容),但您仍然無法更改目錄中的任何內容;目錄實際上是某種文件,要更改其中的某些內容,您需要 w 權限。
是的。
但是為什麼您需要 x 來創建(您可以要求系統在不暴露 inode 的情況下創建文件?)和重命名/移動文件(當您移動文件時,您不會以任何方式更改它,您只需更改目錄中的記錄及其 inode 計數?)?
沒有
x
,您只能影響目錄本身 - 您從外部看到目錄。沒有x
,目錄條目對您來說是超出範圍的。如果您想添加、刪除或修改(例如重命名)目錄中的條目,您需要能夠訪問該條目。文件的權限決定了您可以對文件的內容執行什麼操作。目錄的權限決定了您可以對文件的目錄條目執行什麼操作,因為目錄條目是目錄的內容。
目錄中的寫入權限允許您創建和刪除條目。重命名算作以原子方式創建一個條目並刪除另一個條目。除此之外,目錄具有與正常文件相同的元數據。寫權限還允許您更改目錄的最後修改和最後訪問時間戳。要更改目錄的權限、組所有權或訪問控制列表(如果支持),您需要擁有它。要更改其使用者所有權,大多數 unix 變體都需要 root。