了解 UNIX 權限和文件類型
chmod
直到今天,我才真正了解自己是如何工作的。我遵循了一個向我解釋了很多事情的教程。例如,我讀到您擁有三個不同的權限組:
- 所有者 (
u
)- 組 (
g
)- 每個人 (
o
)基於這三個組,我現在知道:
- 如果文件歸使用者所有,則使用者權限決定訪問權限。
- 如果文件所屬的組與使用者所屬的組相同,則由組權限決定訪問權限。
- 如果使用者不是文件所有者,並且不在組中,則使用其他權限。
我還了解到您擁有以下權限:
- 讀(
r
)- 寫 (
w
)- 執行 (
x
)我創建了一個目錄來測試我新獲得的知識:
mkdir test
然後我做了一些測試:
chmod u+rwx test/ # drwx------ chmod g+rx test/ # drwxr-x--- chmod u-x test/ # drw-r-x---
在閒逛了一段時間後,我想我終於掌握
chmod
了使用此命令設置權限的方式和方式。但…
我還有幾個問題:
d
開頭代表什麼?- 包含槽的名稱和用途是什麼以及它可以保存哪些其他值?
- 如何設置和取消設置?
- 這有什麼價值
d
?(因為你只有 7=4+2+1 7=4+2+1 7=4+2+1)- 為什麼人們有時使用
0777
而不是777
設置他們的權限?但由於我不應該問多個問題,我會嘗試在一個問題中提出。
在基於 UNIX 的系統(例如所有 Linux 發行版)中,關於權限,第一部分 (
d
) 代表什麼,這部分權限的用途是什麼?
我將分三個部分回答您的問題:文件類型、權限和各種形式的
chmod
.文件類型
輸出中的第一個字元
ls -l
代表文件類型;d
表示它是一個目錄。它不能設置或取消設置,這取決於文件的創建方式。您可以在ls 文件中找到完整的文件類型列表;你可能會遇到的是
-
:“正常”文件,由任何可以寫入文件的程序創建b
: 塊特殊文件,通常是磁碟或分區設備,可以用mknod
c
: 字元特殊文件,也可以創建mknod
(參見/dev
範例)d
: 目錄,可以用mkdir
l
:符號連結,可以用ln -s
p
:命名管道,可以用mkfifo
s
:套接字,可以用nc -U
D
: door,由 Solaris/openindiana 上的一些伺服器程序創建。權限
chmod 0777
用於在一次chmod
執行中設置所有權限,而不是將更改與u+
etc 結合使用。四位數字中的每一個都是一個八進制值,表示一組權限:
suid
,sgid
和“粘性”(見下文)- 使用者權限
- 組權限
- “其他”權限
八進制值計算為權限的總和:
- “閱讀”是 4
- “寫”是2
- “執行”為 1
對於第一個數字:
suid
是 4;具有此位集的二進製文件以其所有者使用者身份執行(通常root
)sgid
是2;具有此位集的二進製文件作為其所有者組執行(這用於遊戲,因此可以共享高分,但與遊戲中的漏洞結合使用通常會帶來安全風險),並且在具有此位集的目錄中創建的文件屬於預設情況下目錄的所有者組(這對於創建共享文件夾很方便)- “粘性”(或“限制刪除”)為 1;設置了該位的目錄中的文件只能由它們的所有者、目錄的所有者或
root
(參見/tmp
常見範例)刪除。有關詳細資訊,
chmod
請參見手冊頁。請注意,在這一切中,我忽略了其他可以改變使用者對文件的權限的安全功能(SELinux、文件 ACL ……)。特殊位的處理方式因文件類型(正常文件或目錄)和底層系統而異。(手冊頁中提到了這一點
chmod
。)在我用來測試它的系統上(coreutils
在文件系統上使用 8.23ext4
,執行 Linux 核心 3.16.7-ckt2),行為如下。對於文件,除非明確設置,否則始終清除特殊位,因此chmod 0777
等效於chmod 777
,並且兩個命令都清除特殊位並授予每個人對該文件的完全權限。對於目錄,特殊位永遠不會使用四位數字形式完全清除,因此實際上chmod 0777
也等價於chmod 777
但這具有誤導性,因為某些特殊位將保持原樣。(此答案的先前版本有此錯誤。)要清除目錄上的特殊位,您需要使用u-s
和g-s
/或o-t
顯式或指定負數值,因此chmod -7000
將清除目錄上的所有特殊位。在
ls -l
輸出中suid
,sgid
和 “sticky” 出現在x
條目的位置:suid
iss
orS
instead of the user’sx
,sgid
iss
orS
instead of the group’sx
, and “sticky” ist
orT
instead of others’x
。小寫字母表示同時設置了特殊位和可執行位;大寫字母表示僅設置了特殊位。chmod 的各種形式
由於上述行為,使用完整的四位數字
chmod
可能會令人困惑(至少事實證明我很困惑)。當您想設置特殊位和權限位時,它很有用;否則,如果您正在操作文件,則會清除這些位,如果您正在操作目錄,則會保留這些位。因此,chmod 2750
確保您至少sgid
準確地獲得u=rwx,g=rx,o=
;但chmod 0750
不一定會清除特殊位。使用數字模式而不是文本命令 (
[ugo][=+-][rwxXst]
) 可能更多是一種習慣和命令的目的。一旦您習慣了使用數字模式,通常更容易以這種方式指定完整模式。並且能夠使用數字模式考慮權限很有用,因為許多其他命令可以使用它們(install
,mknod
…)。一些文本變體可以派上用場:如果您只是想確保任何人都可以執行文件,
chmod a+x
那麼無論其他權限是什麼,都會這樣做。同樣,+X
僅當已設置執行權限之一或文件為目錄時才添加執行權限;這可以方便地在全域範圍內恢復權限,而無需特殊情況下的文件 v. 目錄。因此,chmod -R ug=rX,u+w,o=
等效於應用於chmod -R 750
所有目錄和執行檔以及chmod -R 640
所有其他文件。