chmod 計算機,會把像 755 或 rwxr-xr-x 這樣的 Unix 權限值,轉換成另一種表示法的對應值,並明確處理 setuid、setgid,以及 sticky 位元。三個一般的八進位位置,各自代表一種使用者類別——擁有者、群組,以及其他人——在單一個位置裡,讀取貢獻 4,寫入貢獻 2,執行或目錄搜尋貢獻 1,所以數字 7 代表讀取、寫入,以及執行。像 4755 這樣的四位數輸入,會多帶一個開頭數字,把 setuid(4)、setgid(2),與 sticky(1)組合在一起,而 0755 與 755,代表的是完全相同的權限位元,因為標準輸出格式,會省略多餘的開頭零。反方向的轉換,運作方式也一樣:一個完整的九字元字串,例如 rwsr-xr-x,對應到一個唯一的 12 位元權限值,其中執行位置上的 s 與 t,會連同大小寫的差異,一起攜帶特殊位元的資訊。chmod 計算機接受這兩種形式的輸入,完全在瀏覽器中嚴格解析,並顯示對應的八進位與 rwx 快照,以及一份依使用者類別分列的權限表格,你可以先檢視這份表格,再把指令範本貼進終端機。

八進位數字一覽
一個介於 0 到 7 之間的八進位數字,恰好對應一種使用者類別。這些位元是用加總的方式表示,而不是條列的方式,所以數字 6 永遠代表讀取加寫入,絕不會包含任何執行權限。這是任何符合規範的 chmod 計算機都會套用的標準 POSIX 對應規則,包括這個以瀏覽器為基礎的 chmod 計算機,它會評估從 0 到 7 全部八種一般數字值。
| 八進位數字 | 位元加總 | 符號表示 | 意義 |
|---|---|---|---|
| 0 | 0 + 0 + 0 | --- | 沒有任何權限 |
| 1 | 0 + 0 + 1 | --x | 僅執行 |
| 2 | 0 + 2 + 0 | -w- | 僅寫入 |
| 3 | 0 + 2 + 1 | -wx | 寫入與執行 |
| 4 | 4 + 0 + 0 | r-- | 僅讀取 |
| 5 | 4 + 0 + 1 | r-x | 讀取與執行 |
| 6 | 4 + 2 + 0 | rw- | 讀取與寫入 |
| 7 | 4 + 2 + 1 | rwx | 讀取、寫入、執行 |
由左到右的三個數字,分別是擁有者、群組,以及其他人。像 755 這樣的三位數權限,對應到 rwxr-xr-x:擁有者擁有完整權限,群組與其他人,則各自擁有讀取與執行,但沒有寫入位元。正是這種一致的對應關係,讓你不需要工具,就能看著檔案列表,反推出八進位形式,也讓一個工具,可以在從八進位 0000 到 7777 全部 4,096 種不同權限值的範圍內,反方向轉換而不遺失任何資訊。
解讀九字元的符號表示模式
符號表示法在代表一個完整權限值時,永遠恰好使用九個字元,這也是 chmod 計算機在「符號轉八進位」方向唯一接受的形式。前三個字元屬於擁有者,接下來三個屬於群組,最後三個屬於其他人。在每一組裡,位置是固定的:第一個位置是讀取,第二個位置是寫入,第三個位置是執行或目錄搜尋。正是這種嚴格的結構,讓解析器能在兩種表示法之間毫無歧義地互相轉換,因為這九個位置中的每一個,都對應到單一一個權限位元,絕不會與其他位元衝突。
計算機會拒絕開頭多出來的檔案類型字元,例如 -rwxr-xr-x 開頭的那個減號,因為那個減號屬於 ls 指令的輸出格式,會讓接下來三組類別,全部往後偏移到錯誤的使用者類別上。它也會拒絕像 u+x 或 g-w 這類 chmod 修改運算式,因為那些只是局部指令,不是一份完整的權限快照,攜帶的意圖資訊也不一樣。輸入內容,會被檢查是否恰好符合九個有效位置字元,也就是 r、w、x,或連字號,小寫的 s 與 t 則保留給特殊位元的執行位置使用,所以像 rwxr-xr-x 這樣的值,可以乾淨地被解析,而 rwx-r-xr-x 則會回傳語法錯誤,而不是被悄悄修正。
特殊位元與四位數權限值
當牽涉到 setuid、setgid,或 sticky 時,權限值前面會多出第四個八進位數字。這個開頭的數字,把 setuid(4)、setgid(2),與 sticky(1)組合在一起,所以開頭的 4 代表設定了 setuid,開頭的 2 代表設定了 setgid,開頭的 1 代表設定了 sticky。剩下的三個數字,仍然保持一般的擁有者、群組、其他人意義,所以 4755,就是在一般的 755 權限之上,再加上 setuid,而 6755 則同時帶有 setuid 與 setgid。三位數的輸入,明確代表沒有任何特殊位元,而 0755 中明確寫出的開頭零,代表的權限位元與 755 完全相同,在標準輸出格式中會被省略。
| 開頭數字 | 位元加總 | 設定的特殊位元 |
|---|---|---|
| 0(或省略) | 0 | 無 |
| 1 | 0 + 0 + 1 | 僅 sticky |
| 2 | 0 + 2 + 0 | 僅 setgid |
| 3 | 0 + 2 + 1 | setgid 與 sticky |
| 4 | 4 + 0 + 0 | 僅 setuid |
| 5 | 4 + 0 + 1 | setuid 與 sticky |
| 6 | 4 + 2 + 0 | setuid 與 setgid |
| 7 | 4 + 2 + 1 | setuid、setgid,與 sticky |
在符號輸出中,特殊位元會共用三個執行位置,因此字元的大小寫,本身就攜帶了資訊。小寫的 s,代表在擁有者位置設定了 setuid,或在群組位置設定了 setgid,同時該位置的執行位元也一併設定。大寫的 S,代表設定了特殊位元,但該位置沒有執行位元。sticky 位元,在其他人位置,遵循同樣的規則,使用 t 與 T。保留這種大小寫,是能正確反轉回同一個八進位值的必要條件;把 s 換成 S,會解碼出一個不同的 12 位元權限值。所以 4755 讀作 rwsr-xr-x,因為 setuid 與擁有者執行位元同時設定;而 4655 讀作 rwSr-xr-x,因為設定了 setuid,但擁有者沒有執行權限。
在計算機中轉換一個 chmod 值
- 開啟 chmod 計算機,選擇轉換方向。當你手上有像 755 或 4755 這樣的數字時,選擇「八進位轉符號」;當你手上有像 rwxr-xr-x 或 rwsr-xr-x 這樣的快照時,選擇「符號轉八進位」。
- 以嚴格的格式,輸入一個完整的值。輸入恰好三位 ASCII 八進位數字,例如 755,或四位數字,例如 4755,不要加 0o 前綴、正負號、空格、分隔符號、小數點、底線,或外觀相似的 Unicode 字元;在符號方向,則輸入恰好九個字元,每個使用者類別各佔三個位置。
- 轉換並檢視結果。計算機會顯示標準的八進位值、九字元的符號值,以及一份分為擁有者、群組、其他人的表格,各自附有獨立的讀取、寫入、執行欄位,並標示出目前存在的任何 setuid、setgid,或 sticky 位元。
- 在複製之前,先確認目標檔案、實際的擁有權,以及最小權限的需求。在你確認過磁碟上實際的使用者與群組之前,這個頁面上的擁有者、群組、其他人,都只是抽象的標籤,這個計算機只會描述要求設定的權限位元,永遠不會描述政策上實際會產生的結果。
- 把 chmod OCTAL FILE 這個範本複製到剪貼簿。FILE 只是一個佔位符;這個工具絕不會詢問、解析,或操作任何真實路徑,所以在終端機中執行指令之前,請先把它換成實際的路徑。
這個計算機完全在目前的分頁中執行。如果瀏覽器封鎖了剪貼簿的寫入,畫面上顯示的八進位與符號值仍然會保留在螢幕上,你可以手動複製;而輸入內容一有變動,就會先清除先前的結果、錯誤訊息,與複製狀態,再執行新的一次轉換。
檔案與目錄常見的權限值
工程師最常參考的權限值,只是典型的預設值,不能取代你正在操作的這台機器上實際的政策,因為 umask、ACL,以及擁有權的情境,仍然可能覆蓋這些值。在真正套用一個非標準的值之前,請用 chmod 計算機先確認一次。600(rw-------)適合只有擁有者能讀取的私人檔案;644(rw-r--r--)是像靜態網站輸出這類公開可讀資產的預設值;700(rwx------)涵蓋私人指令碼與家目錄;755(rwxr-xr-x)讓任何有讀取權限的人,都能執行這個可執行檔;750(rwxr-x---)能在群組內共用一個目錄,而不會對外公開;1777(rwxrwxrwt)是帶有 sticky 的標準 /tmp 模式;4755(rwsr-xr-x),則是在一般的可執行檔外面,包上一層 setuid。1777 這個項目,正是特殊位元表格,與日常小抄交會的地方:開頭的 1 代表 sticky,而其他人執行位置上的小寫 t,則確認 sticky 與執行位元同時設定,這正是任何人都能寫入、但每個項目只有其擁有者才能刪除或重新命名的目錄,所使用的標準形式。
這個計算機無法告訴你的事
權限位元描述的是被要求設定的內容,不是核心實際上會允許的內容。POSIX 在chmod 的手冊頁中定義了這些位元的位置,但實際存取,仍然受到檔案擁有權、檔案存取控制清單、Linux capabilities、像 nosuid 與 nodev 這類掛載選項、唯讀檔案系統,以及行程所在的任何沙盒環境所限制。一個行程,也必須先在每一層父目錄上,擁有穿越(traverse)權限,才能真正到達目標;如果 /var 的權限是 700,且擁有者是另一個使用者,那麼對 /var/log/app/secret.log 執行 chmod,並不會有任何實質效果。
這個計算機的 chmod 轉換,不會考慮 umask,因為 umask 只會影響檔案建立時所要求的位元,不會影響磁碟上已經存在的位元。它也不會遞迴處理目錄、不會跟隨符號連結、不會修改 ACL 項目、不會計算 umask 的結果、不會檢查目前的權限,也不會判斷產生的指令套用起來是否安全。特殊位元需要在實際操作上多加留意:可執行檔上的 setuid 與 setgid,可能會改變有效身分,而且在特定的擁有權或安全條件下,可能會被清除或被忽略;目錄上的 setgid,通常會影響新建子項目的群組;目錄上的 sticky,通常會限制不是該項目擁有者的使用者刪除或重新命名該項目。請把這個計算機的輸出,當成檢視所要求權限值的輔助工具,另外分別確認擁有權與父目錄的穿越權限,並優先採用實際使用者與服務所需的最小權限,而不是為了繞過存取問題,直接套用像 777 這樣寬鬆的範例。
如果你還在權衡不同做法,如何把 Excel 工作表並排拆分成多個檔案這篇文章有詳細說明。
如果你還在權衡不同做法,陰影產生器小抄:參數與配方這篇文章有詳細說明。