一個 chmod 計算機範例會逐步說明如何將 Unix 權限值(例如 755 或 4755)轉換成九個字元的符號形式(例如 rwxr-xr-x 或 rwsr-xr-x),讓你能清楚讀出擁有者、群組和其他人各別設定了哪些位元,以及是否有 setuid、setgid 或 sticky 位元。這個計算機接受單一完整的權限快照,支援雙向轉換:八進位轉符號,或符號轉回八進位。接著它會回傳一個正規化的八進位值、一個九字元的符號字串,以及一張將擁有者、群組和其他人拆解為讀取、寫入和執行的對照表。特殊位元會同時以數字形式呈現在前導位元中,並以視覺化方式顯示在執行位置上,以 s、S、t 或 T 表示。整個計算、驗證、表格呈現和剪貼簿動作都在當前瀏覽器分頁中執行;你的檔案、路徑或指令都不會被上傳。這使得該工具在處理取自正式伺服器、容器映像檔,或不想留在 shell 歷史紀錄中的 sticky 位元目錄的權限快照時,可以安全使用。

範例比純粹的描述更重要的原因是,chmod 的兩種標記法隱藏了不同的資訊。八進位標記法簡潔且明確,但會把 setuid、setgid 和 sticky 位元折疊成一個單一的前導位元,而許多人往往忽略它。符號標記法會直接在執行位置上顯示特殊位元,但這也是當有人將輸出以純文字複製時,小寫 s 與大寫 S 之間的區別容易消失的地方。一個同時保留兩種形式的計算機能讓你在套用某個值之前先加以驗證,而不是猜測 4755 在 ls -l 輸出之後會呈現什麼樣子。

chmod calculator example
Chmod 計算機範例:Setuid、Sticky 與 rwx

八進位數字如何轉換為 rwx 字母

每個一般的 chmod 數字都是三個獨立位元的總和。讀取貢獻 4,寫入貢獻 2,執行或目錄搜尋貢獻 1。把這些值的任意組合相加,就會產生一個 0 到 7 之間的單一數字。三個一般位置中的第一個描述擁有者,第二個描述群組,第三個描述其他所有人。一旦納入三個特殊位元,完整的 12 位元權限空間從八進位 0000 一直延伸到 7777,總共有 4096 種不同的模式。

數字總和字母意義
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讀取、寫入與執行

當你看到四位數的權限時,前導位元並不屬於 4-2-1 的加總。它結合了三個特殊位元:setuid 貢獻 4、setgid 貢獻 2、sticky 貢獻 1。因此 6755 同時帶有 setuid 和 setgid,而 7755 則帶有全部三個特殊位元,不過 chmod 的說明手冊指出,非可執行檔上的 setuid 與 setgid 通常會被作業系統清除。三位數的權限明確表示沒有設定任何特殊位元,這也是為什麼正規化輸出會省略多餘的前導零。

實例演練:將 4755 轉換為 rwsr-xr-x

以四位數權限 4755 作為一個單一實例演練,這類值經常出現在 setuid 包裝程式、密碼輔助工具,以及一些舊版安裝程式中。使用文件中定義的公式逐位拆解。前導的 4 對應到 setuid 位元。下一個 7 對應到擁有者:4 加 2 加 1 等於讀取、寫入和執行。再下一個 5 對應到群組:4 加 1 等於讀取與執行。最後一個 5 對應到其他人:4 加 1 等於讀取與執行。按照標準的擁有者-群組-其他人順序組合字母,結果是 rwxr-xr-x,但因為同時設定了 setuid 且擁有者的執行位元存在,擁有者位置的執行字元會被 s 取代。最終的符號輸出是 rwsr-xr-x。往返轉回八進位時,會從執行位置讀回那些特殊位元並重建出 4755,而這正是 Chmod 計算機 所驗證的內容。

值得一試的常見 Chmod 計算機範例

在文件、腳本和 Stack Overflow 的回答中,總是會反覆出現一些標準模式。把每一個都跑過一次 chmod 計算機,是確認你對其含義的理解,並觀察特殊位元如何顯示在符號形式中最快的方式。

八進位符號典型使用情境
644rw-r--r--一般檔案的預設值,所有人都可讀取但僅擁有者可寫入
755rwxr-xr-x可執行檔與目錄的預設值,所有人都可進入並瀏覽
600rw-------私密檔案,例如只有擁有者才能存取的 SSH 金鑰
700rwx------私密目錄,例如使用者的家目錄或金鑰資料夾
4755rwsr-xr-x應以檔案擁有者身分執行的 Setuid 可執行檔
1777rwxrwxrwt所有人皆可寫入且帶有 sticky 的目錄,例如 /tmp

其中兩列包含特殊位元。在 4755 中,因為 setuid 與既有的執行位元結合,擁有者的執行位置變成 s。在 1777 中,因為在一個其他人也有執行權限的目錄上設定了 sticky 位元,其他人的執行位置變成 t。把每一個預設值跑過一次計算機,可以確認特殊字元的大小寫以及檔案系統實際儲存的精確八進位值。

解讀輸出中的 s、S、t 與 T

符號輸出中的執行位置同時也是特殊位元的指示。當 setuid 已設定且擁有者的執行位元也已設定時,擁有者的執行字元就是小寫 s。當 setuid 已設定但擁有者的執行位元未設定時,該字元就是大寫 S。相同的規則也適用於群組執行位置的 setgid:小寫 s 表示同時具有 setgid 與執行,大寫 S 表示只有 setgid 而沒有執行。Sticky 則在其他人執行位置使用 t 與 T,遵循相同的小寫與大寫規則。

正是這種大小寫區分讓往返轉換得以實現。一個只輸出一般字母的計算機,在有人將該字串貼進設定檔時,就會立刻遺失特殊位元的資訊。保留大小寫意味著該值能毫無歧義地解析回同一個八進位模式。當你在輸出中看到大寫 S 或 T 時,這是一個有用的警告,代表你對一個非可執行的目標要求了特殊位元,而大多數作業系統會默默地將其清除。

逐步教你如何使用 Chmod 計算機

  1. 選擇符合你既有輸入的轉換方向。如果你從像 755 或 4755 這樣的值開始,就選擇八進位轉符號;如果你從像 rwxr-xr-x 或 rwsr-xr-x 這樣的值開始,則選擇符號轉八進位。
  2. 以該工具所要求的嚴格格式,輸入單一完整的權限快照。八進位輸入必須恰好包含三個 ASCII 數字(例如 755),或是在設定特殊位元時恰好包含四個 ASCII 數字(例如 4755)。符號輸入必須恰好包含九個字元,依序涵蓋擁有者、群組和其他人,且不能有前導的檔案類型字元,也不能是 chmod 變更表達式。
  3. 執行轉換並並排檢視三項輸出。當沒有設定特殊位元時,正規化的八進位值會省略多餘的前導零。九字元的符號值會保留任何 s、S、t 或 T 的大小寫。擁有者-群組-其他人的對照表會列出讀取、寫入、執行或搜尋,並標示任何 setuid、setgid 或 sticky 位元。
  4. 將結果與目標檔案、擁有者使用者與群組,以及最小權限原則進行交叉核對。確認該程式使用 setuid 或 setgid 是否合適、sticky 是否僅用於所有人皆可寫入的目錄,以及像 777 這類過於寬鬆的預設值不是被用來掩蓋擁有權或瀏覽權的問題。
  5. 只有在上述檢視通過後,才將 chmod OCTAL FILE 範本複製到剪貼簿,然後在執行指令前將 FILE 預留位置替換為你系統上的實際路徑。

計算機無法掩蓋的限制

這個計算機回報的是被要求的模式位元;它不會實際執行 chmod、不會遞迴進入目錄、不會跟隨符號連結、不會修改 ACL、不會計算 umask 調整後的結果,也不會檢查任何檔案目前的權限。根據模式位元的 POSIX 定義,存取權限仍取決於擁有權、存取控制清單、能力(capabilities)、掛載選項、唯讀檔案系統,以及應用程式沙箱化。程序也需要對目標之上每一個上層目錄具備瀏覽權限,因此位於程序無法進入的目錄內的檔案,即使設為 600,仍然會產生權限錯誤。

特殊位元尤其需要特別留意。可執行檔上的 setuid 與 setgid 可能會改變有效身分,而系統在特定的擁有權或安全性條件下,可能會清除或忽略它們。目錄上的 setgid 通常會影響新建子項目的群組,而目錄上的 sticky 則通常會限制非檔案擁有者的刪除或重新命名行為。計算機會在輸出中呈現這些要求,但無法保證檔案系統會保留或落實每一個位元。請將結果視為套用指令前的檢視輔助;若需要更深入的參考,了解位元如何對應到底層系統,chmod 計算機速查表與本範例搭配使用效果絕佳。

延伸閱讀:Box Shadow 產生器範例:從滑桿到 CSS。