檔案的 Chmod 值是以三或四個八進位數字組成的字串來表示,每個數字是讀取權限 4、寫入權限 2,以及執行或目錄搜尋權限 1 的總和,因此像 755 這樣的數值只是記錄了擁有者可以讀取、寫入與執行,而群組和其他所有人則可以讀取與執行。若要找出檔案的 chmod,你可以從目錄列表中讀取這個數字字串,或在兩種表示法之間轉換:chmod 指令所使用的精簡八進位形式,以及 ls 與 stat 所顯示的九個字元 rwx 形式。Chmod 計算機在瀏覽器中執行這項轉換,並明確處理會改變擁有者行為的特殊位元,因此你能在將權限字串寫入腳本或部署清單之前,準確確認它代表的意義。由於此工具是基於文字快照而非即時的檔案路徑運作,它是一項檢閱輔助工具,而不是用來檢查伺服器或修改儲存的方式;它會把你已知的檔案資訊轉換成你可能需要的其他各種表示法。

how to find chmod of a file
how to find chmod of a file

解讀數字:4、2 與 1 的意義

每個一般的 chmod 數字都是三個獨立位元的總和,而這些位元的權重永遠相同。讀取貢獻 4,寫入貢獻 2,執行或目錄搜尋貢獻 1,因此數字範圍只能是 0 到 7。將所需位元的權重相加即得到該數字;相減則可得知缺少哪些位元。數字 7 等於 4 加 2 加 1,因此擁有者擁有所有的普通權限。數字 5 等於 4 加 0 加 1,因此群組擁有讀取與執行權限,但沒有寫入權限。數字 0 代表完全沒有權限,這在明確拒絕某類使用者存取時相當有用。

三個普通位置依序代表擁有者、群組與其他人。像 644 這樣的典型數值代表擁有者可以讀取與寫入,擁有群組可以讀取,而其他人也可以讀取。當你看到 700 時,代表擁有者擁有完整存取權限,而群組與其他人則什麼都沒有,這是私密金鑰與個人腳本常見的設定。推算像 750 這樣的字串也是同樣的步驟:7 是讀取加寫入加執行,5 是讀取加執行,而 0 則是沒有任何權限。

八進位數字r + w + x符號表示意義
00 + 0 + 0---無存取權限
10 + 0 + 1--x僅執行或搜尋
20 + 2 + 0-w-僅寫入
30 + 2 + 1-wx寫入與執行
44 + 0 + 0r--僅讀取
54 + 0 + 1r-x讀取與執行
64 + 2 + 0rw-讀取與寫入
74 + 2 + 1rwx讀取、寫入與執行

同一檔案的八進位與符號表示法

同一組權限可以用兩種方式撰寫,兩者所承載的資訊完全相同。八進位形式將九個是非決策壓縮成三個數字,也是 chmod 指令所期望的輸入格式。符號形式則將這九個決策展開為 r、w、x 或連字號,並依擁有者、群組與其他人分為三個三人一組。將 755 轉為符號表示會得到 rwxr-xr-x,而將 rwxr-xr-x 轉回則會得到 755。兩種形式並沒有哪個比較正確;它們只是同一組模式位元的兩種編碼方式。

符號形式在執行位置上也有保留特殊位元的位置。當擁有者的執行位置顯示 s 而非 x 時,代表 setuid 已設定且執行權限也已開啟;S 則代表 setuid 已設定但執行權限未開啟。群組位置遵循相同的大小寫規則用於 setgid,而其他人位置則使用 t 或 T 代表黏滯位 (sticky bit)。保留這種大小寫的區別是在文字表示中往返轉換特殊位元的唯一方法,這也是為什麼計算機比讀取一份印出來的數值列表更可靠的原因之一。

使用計算機轉換檔案的 Chmod

Chmod 計算機接收一組完整的權限快照,並回傳它的所有其他表示形式,包括標準的八進位值、九個字元的符號字串,以及逐位置對照表。它完全在當前分頁中執行,絕不會接收檔案路徑,因此你可以從說明文件頁面、Pull Request 或印出的 ls -l 輸出中貼上數值,並讀出它真正的意義。

  1. 開啟 Chmod 計算機,並選擇八進位轉符號或符號轉八進位作為轉換方向。
  2. 輸入完整的八進位數值(例如 755),或在含有特殊位元時輸入四位數數值(例如 4755),需以欄位接受的嚴格格式輸入(恰好三或四個 ASCII 數字,無前綴或標點)。
  3. 若要反向轉換,請輸入完整的符號字串(例如 rwxr-xr-x 或 rwsr-xr-x),需為九個字元且不帶前綴的檔案類型連字號。
  4. 檢閱工具所顯示的標準八進位值、九個字元的符號輸出,以及擁有者、群組與其他人的權限對照表。
  5. 確認目標檔案、其擁有權、是否存在任何特殊位元,以及該數值是否真正反映你的服務所需的最少權限。
  6. 僅在完成上述檢閱後才複製 chmod 樣板,將 FILE 佔位符替換為實際路徑,並透過 shell 或自動化步驟套用。

若輸入未通過驗證,先前的結果與任何複製狀態都會被清除,如此你便無法基於過期的數值進行操作。編輯輸入或切換方向的行為也是如此,剪貼簿動作也受到防護,以避免延遲的非同步完成在你已繼續其他動作後才通知成功。原始輸入有固定的預算額度,以 UTF-16 程式碼單位計算,因此確切的邊界是可見的,超過下一個單位時會回傳明確的預算錯誤,而不是被靜默地截斷。

特殊位元:當第一位數不是擁有者時

四位數的 chmod 以一個特殊位元數字開頭,該數字位於三個普通數字之前,而非取代它們。第一位數將 setuid 設為 4、setgid 設為 2,黏滯位設為 1,因此 4755 代表 setuid 已設定,並搭配與 755 相同的擁有者、群組與其他人權限,而 2755 代表 setgid 已設定,搭配相同的三個普通數字。像 6755 這樣的數值同時帶有 setuid 與 setgid,而 7755 則帶有全部三個特殊位元。像 0755 這樣明確的前導零是可接受的,且代表與 755 相同的模式位元;當未設定特殊位元時,標準輸出會省略多餘的零。

特殊位元權重範例改變內容
setuid44755可執行檔以檔案擁有者的身分執行
setgid22755可執行檔以檔案群組的身分執行;在目錄上,新建立的子項目會繼承該群組
黏滯位11755在目錄上,只有項目擁有者可以刪除或重新命名子項目

特殊位元需要謹慎操作。setuid 或 setgid 可執行檔會變更程序的有效身分,而檔案系統或安全性政策可能會在特定的擁有權條件下清除或忽略這些位元。像 /tmp 這類目錄上的黏滯位,正是防止無關使用者刪除彼此檔案的原因。計算機會回報所要求的模式位元,但無法保證特定檔案系統會保留或認可每個位元,因此請將輸出視為檢閱輔助,而非保證。

Chmod 值無法告訴你的事

模式位元只是存取控制的一部分。POSIX 定義了位元位置,但程序是否實際能存取檔案,還取決於擁有權、存取控制清單 (ACL)、能力 (capabilities)、掛載選項(例如唯讀檔案系統)、應用程式沙箱機制,以及其他作業系統政策。程序也必須對路徑上每個父目錄擁有執行權限,才能到達該檔案,這在權限變更看似沒有效果時常常令人意外。Umask 會影響建立檔案時所要求的權限;它並非計算機會悄悄套用至輸入的額外數字。

請優先採用實際使用者與服務所需的最少權限,並在考慮像 777 這樣寬鬆的數值之前,先診斷擁有權、群組、目錄遍歷與 ACL。正如 chmod 手冊頁面所述,模式字串僅描述所要求的位元;實際授權是另一個獨立的問題。計算機的職責是確保該模式字串的正確性,而不是保證任何字串在每個環境中都安全。

若想深入了解,請參閱 涵蓋所有模式位元的 Chmod 計算機替代方案

若想深入了解,請參閱 Chmod 計算機 API 替代方案:純瀏覽器轉換