Chmod 許可權計算器

勾選屬主、屬組和其他使用者的讀、寫、執行許可權,即可得到八進位制 chmod 數字、rwx 符號字串以及可直接貼上到終端的命令。

勾選核取方塊得到數字,或輸入數字檢視它實際允許什麼。 許可權面向三類物件——檔案屬主、屬組和其他所有人——每類各自獨立擁有讀、寫、執行三種許可權。你可以切換表格,也可以直接輸入八進位制值,兩者會保持同步。

物件 讀 (4) 寫 (2) 執行 (1)
屬主 (u)
屬組 (g)
其他人 (o)

讀寫 Unix 許可權位

三組三元位

每個 Unix 檔案都帶有九個許可權位,按三位一組分成三組。第一組屬於檔案屬主,第二組屬於檔案所屬的組,第三組屬於系統上的其他所有人。每組中的三位分別表示讀、寫、執行,權值依次為 4、2、1。把需要的位相加即可得到 0 到 7 之間的一個數字,這就是許可權歷來用三位八進位制數書寫的原因。

755 這樣的數字正是由此而來。屬主位是 7,即 4 + 2 + 1,因此屬主可讀、可寫、可執行;屬組位和其他人位都是 5,即 4 + 1,可讀可執行但不能修改。同一個值用符號寫法表示就是 rwxr-xr-x,也正是 ls -l 在檔案型別字元之後列印的內容。

這三個動詞在目錄上的含義略有不同:讀允許列出目錄內的名稱,寫允許建立和刪除條目,執行允許進入目錄並訪問一個已知路徑。只有讀而沒有執行許可權的目錄幾乎沒有用——你能看到名字,卻打不開背後的任何東西。

你真正會用到的數值

少數幾種組合就能覆蓋大部分實際工作。644(rw-r--r--)是文件或原始檔的常規模式:屬主編輯,其他人只讀。755(rwxr-xr-x)是目錄和可執行指令碼的常規模式,因為二者都必須有執行位才能使用。600(rw-------)讓檔案僅對屬主可見,這正是 OpenSSH 對私鑰的強制要求;目錄對應的是 700。

賦予他人寫許可權的模式值得再三斟酌。777 意味著機器上任何賬號都能覆蓋或刪除該檔案,它幾乎從來不是正確答案——它只是在不理解問題的前提下讓許可權報錯最快消失的辦法。當 Web 伺服器無法寫入上傳目錄時,真正的修復方式通常是用 chown 更改屬主或屬組,而不是把檔案對全世界開放。

許可權還與 umask 相互作用。新檔案按預設模式減去 umask 值建立,常見的 umask 是 022,這就是新建檔案通常是 644 而不是 666 的原因。

setuid、setgid 與粘滯位

在這三位之前還可以有第四位,它攜帶三個特殊位:setuid(4)、setgid(2)和粘滯位(1)。它們改變程式以誰的身份執行,以及目錄如何對待其中新建的檔案。

執行檔上的 setuid 會讓它以檔案屬主而非啟動者的許可權執行。passwd 正是靠它在普通使用者執行時更新系統檔案,這也是 setuid 程式需要被嚴格審計的原因——其中一個缺陷就是通往屬主許可權的直通車。setgid 對屬組起同樣作用。在目錄上,setgid 的含義更為友好:目錄內新建的檔案會繼承該目錄的屬組,從而讓共享專案目錄始終保持一致。

粘滯位最常見於 /tmp,通常寫作 1777。它允許任何人在目錄中建立檔案,同時把刪除許可權限制為檔案自身的屬主,使使用者無法刪除彼此的臨時檔案。在長格式列表中這些位會替換執行位字元:s 取代 x 表示設定了 setuid 或 setgid,大寫 S 表示設定了該位但沒有執行許可權,t 則標記粘滯位。

開源說明:使用原生 JavaScript 實現,不依賴第三方庫。

常見問題

755 到底是什麼意思?
屬主可讀、可寫、可執行;屬組和其他人可讀、可執行但不能修改。這是目錄以及需要被他人執行的指令碼的常規模式。
指令碼可讀卻提示 permission denied,為什麼?
讀取檔案和執行檔案是兩個獨立的許可權位。指令碼需要對應使用者擁有執行位,644 是不夠的——請改為 755,或者顯式通過直譯器執行它。
777 有合適的使用場景嗎?
在共享或對外網開放的機器上幾乎沒有,因為它讓任何本地賬號都能修改或刪除該檔案。若某個服務無法寫入,應改變屬主或屬組,而不是放寬模式。
644 和 0644 有什麼區別?
對九個標準位而言沒有區別。開頭的 0 是特殊位那一位,設為 0 會清除 setuid、setgid 和粘滯位。很多人寫四位純粹是出於習慣。
SSH 為什麼拒絕使用我的私鑰?
OpenSSH 會拒絕其他使用者可讀的私鑰。把金鑰設為 600、把所在的 .ssh 目錄設為 700,警告就會消失。
chmod 在 macOS 和 Linux 上表現一致嗎?
數字模式完全相同。差異出現在擴充套件屬性和 ACL 上,macOS 會在許可權字串後用 `+` 標示,而這部分並不由 chmod 單獨管理。