drwxr-xr-x 是什麼?Linux 權限與 755
逐字拆解 drwxr-xr-x,了解它如何對應八進位 755,以及目錄中的 x 代表進入與 traverse,而不是執行檔案。
drwxr-xr-x 的含義
drwxr-xr-x 表示該目錄的擁有者可以修改內容,而其他使用者只能讀取並進入目錄,無法進行修改。其八進位模式為 755。Linux 會在每行 ls -l 輸出的開頭顯示這 10 個字元。它們的意義與順序固定,因此學會一組字串就能理解所有類似表示法。
有一項規則必須先說明,因為它會決定自行測試是否有參考價值。root 使用者不受權限位元限制。核心會授予 root CAP_DAC_OVERRIDE capability(discretionary access control override),因此 root 可以開啟模式設定禁止存取的檔案。本頁的所有範例對 root 都會成功,不論權限位元如何設定。若要觀察這些規則實際運作,請使用一般使用者登入。
逐一解讀這 10 個字元
建立一個目錄和檔案供檢視。以下操作都不會影響新目錄以外的任何內容。
mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txt使用常見的預設 umask 022 時,兩個目錄行會以 drwxr-xr-x 開頭,檔案行會以 -rw-r--r-- 開頭。
第 1 個字元表示檔案類型,不是權限。d 表示目錄。- 表示一般檔案。l 表示 symbolic link。c 和 b 分別表示字元與區塊裝置節點。s 表示 socket,p 表示 named pipe。它位於八進位值之外,因此 drwxr-xr-x 會變成 755,而不是以 d 開頭的數值。
後面的 9 個字元分成 3 組,每組 3 個字元,順序固定不變。
- 第 2 至第 4 個字元是 owner 三元組,適用於擁有該檔案的使用者。
- 第 5 至第 7 個字元是 group 三元組,適用於該檔案所屬的群組。
- 第 8 至第 10 個字元是 other 三元組,適用於其他所有使用者。
在每個三元組中,欄位順序固定為 r、w、x;連字號表示該位元未啟用。字母的位置不會變動。r-x 表示可讀取但不可寫入。-w- 表示可寫入但不可讀取,這種設定合法但很少見。
因此,drwxr-xr-x 可拆解如下:d 表示目錄,接著 rwx 表示 owner,r-x 表示 group,最後 r-x 表示 other。
部分系統會顯示第 11 個字元。結尾的句點 drwxr-xr-x. 表示檔案具有 SELinux (security enhanced Linux) context;Fedora 和 Rocky 等 SELinux 發行版預設會顯示此資訊。結尾的加號 drwxr-xr-x+ 表示檔案具有 POSIX ACL (access control list),也就是在這 9 個位元之外的額外規則。使用 getfacl <path> 讀取這些額外規則。
目錄中的 r、w 與 x 各自負責不同工作
這是初學者最容易弄錯的規則。檔案和目錄使用相同的字母,但授予的權限不同。
- 檔案上的
r可讀取內容。目錄上的r可列出其中的名稱,這也是一般ls所需的權限。 - 檔案上的
w可修改內容。目錄上的w可在其中新增及移除項目。刪除檔案是修改目錄的行為,因此由目錄的 write 權限決定,檔案本身的 mode 不會影響結果。 - 檔案上的
x可將其當作程式執行。目錄上的x可 traverses 該目錄,也就是核心在進行路徑查找時,能解析其中的一個名稱。
Traverse 是最容易讓人困惑的部分。目錄上的 x 不會執行任何內容。開啟 /srv/site/index.html 需要在 / 上具備 x,接著在 /srv 上具備 x,再在 /srv/site 上具備 x,最後在檔案上具備 r。如果這條鏈中的任何目錄缺少你所需的 x,查找就會在該處停止。即使路徑末端的檔案對所有使用者皆可讀取,呼叫端仍會收到整個路徑的 Permission denied。namei -l /srv/site/index.html 會列印這條鏈上的每個步驟,以及其 mode 和擁有者,讓你看出是哪個環節中斷。
只有 r 而沒有 x 的目錄,是值得辨識的特殊半完成狀態。一般使用者可以列出名稱,因為列出名稱是 r 授予的權限;但無法對任何項目執行 stat,因此 ls -l 會在大小和 mode 欄位填入問號,並對每個項目列印 ls: cannot access ...: Permission denied。
將字母轉換為 755
每個三元組都是 3 位元數字。r 是 4,w 是 2,x 是 1。將已啟用的位元相加。
rwx是 4 + 2 + 1 = 7rw-是 4 + 2 = 6r-x是 4 + 1 = 5r--是 4---是 0
因此,drwxr-xr-x 對擁有者是 7、對群組是 5、對其他使用者是 5:755。-rw-r--r-- 是 6、4、4:644。drwxrwxr-x 是 7、7、5:775,也就是在 755 的基礎上,為群組加入寫入權限。你不必手動計算字元,因為 stat 會同時輸出這兩種形式。
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt%A 是字母形式,%a 是八進位形式,%U 和 %G 則分別表示擁有者使用者與擁有者群組。
人們搜尋的權限字串
以下是實際伺服器上常見的模式,並列出其八進位值及使用情境。
-rw-r--r--是 644。服務只需讀取的一般檔案,例如設定檔或 HTML 頁面。-rw-------是 600。機密資料,例如 SSH 私密金鑰或應用程式的.env檔案。-rw-rw-r--是 664。位於群組共用目錄中的檔案,團隊成員需要寫入時使用。-rwxr-xr-x是 755。指令碼與二進位檔,例如/usr/local/bin/backup.sh和大多數的/usr/bin。-rwx------是 700。只有檔案擁有者可以執行的私有指令碼。drwxr-xr-x是 755。幾乎所有系統目錄,以及網站的文件根目錄。drwx------是 700。~/.ssh,以及鎖定狀態伺服器上的家目錄。drwxrwxr-x是 775。檔案擁有者所屬群組可以寫入的目錄。drwxrwsr-x是 2775。與上述相同,另加 setgid 位元,因此其中建立的新檔案會繼承該目錄的群組。drwxrwxrwt是 1777。/tmp。結尾的t是 sticky bit,因此使用者只能刪除自己的檔案。-rwsr-xr-x是 4755。以檔案擁有者身分執行的 setuid 二進位檔,例如/usr/bin/passwd和/usr/bin/sudo。-rw-rw-rw-是 666,而drwxrwxrwx是 777。任何人都可寫入;在伺服器上,這幾乎總是設定錯誤。lrwxrwxrwx是所有 symbolic link 顯示的值。Linux 會忽略連結上的模式位元,改為檢查目標,因此這個字串完全不具意義。
適用於你的權限三元組
這是初學者常弄錯的第二項規則。核心只會選擇一個權限三元組,選定後就停止判斷。
如果你的 user ID 符合檔案擁有者,系統會套用擁有者三元組,完全不檢查群組和其他使用者的位元。否則,如果檔案所屬群組是你所屬的群組之一,系統會套用群組三元組。若仍不符合,則套用其他使用者三元組。
這會導出兩個結果。即使擁有者三元組的限制最嚴格,仍然會優先套用。模式為 0466 的檔案會顯示為 -r--rw-rw-,擁有者只有讀取權限,其他所有人卻可以寫入,因為第一次擁有者檢查已經符合,後續位元不會再檢查。這是合法設定,但初次遇到時通常會讓人困惑。
接著,群組三元組是依檔案所屬群組選定,而不是依你所屬的群組清單選定。ls -l 會在每一行顯示兩個名稱:先是擁有者,再是群組。只有第二個群組對該檔案具有決定權。你屬於 20 個群組,只有在檔案所屬群組是其中之一時才有幫助。
id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txtid 會顯示你的 user 以及你所屬的每個群組。stat 會顯示檔案的擁有者和群組。比較兩者後,就能知道核心會為你套用哪個權限三元組。
因此,共用目錄通常會設定群組和 setgid 位元。sudo chmod 2775 /srv/shared 會顯示為 drwxrwsr-x,之後在其中建立的檔案會繼承該目錄的群組,而不是建立者的個人群組,讓下一位使用者仍然可以寫入這些檔案。為每個服務建立專用帳號是另一個必要做法,詳見 VPS 上每個 Linux 服務使用一個使用者。
umask 決定所有新檔案的模式
新檔案的模式不是由你直接指定,而是取自建立該檔案的程式,再扣除 umask 清除的位元。umask 是用來移除位元的遮罩,因此 umask 越大,檔案的權限就越私密。
大多數發行版的預設值是 022。建立一般檔案的程式會要求 0666,建立目錄的程式會要求 0777。umask 會從這兩個要求中清除 022,因此檔案會得到 644,目錄會得到 755。這正是全新 VPS 上常見的權限組合。
umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdirumask -S 會以字母形式輸出與 0022 相同的值,較容易讀取。將 umask 027 設定在 ~/.profile 中,可使用更嚴格的預設值:檔案為 640,目錄為 750。如此一來,群組成員可以讀取你的工作內容,其他人則無法存取。
有兩項限制需要注意。umask 只能清除位元,不能新增位元。因此,不論你如何設定,新建立的檔案都不會具備執行權限。systemd 服務也不會讀取你的 shell 設定檔,因此應改在 unit 檔案中設定該值。
[Service]
UMask=0027為什麼網站檔案是 644,而網站目錄是 755
Web server 會以專用帳號執行,在 Debian 和 Ubuntu 上是 www-data,在 Rocky 和 Alma 上是 nginx。該程序需要讀取所提供的檔案,也需要遍歷檔案上層的目錄。它沒有理由寫入這些檔案,靜態網站更不應允許這種權限。
檔案使用 644 時,owner 可寫入,所有人可讀取,因此 deploy user 可以發布內容,web user 可以提供內容。目錄使用 755 時,owner 可寫入,所有人可遍歷,因此 web user 可以沿著路徑存取檔案,但無法新增或刪除內容。如此一來,即使應用程式存在錯誤,也無法改寫它正在提供的頁面。
遍歷權限的規則會在這裡造成影響。如果網站位於 /home/deploy/site,而 /home/deploy 是 750,web user 根本無法進入 home directory,請求最後會以 HTTP 403 結束,並在 /var/log/nginx/error.log 中出現類似以下的記錄:
open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5其中的 13 是 EACCES,表示 kernel 拒絕權限。網路本身沒有問題:埠正在監聽,請求也已抵達。這就是在學習 Linux 上監聽埠的運作方式 時,這個問題容易令人困惑的原因。執行 namei -l /home/deploy/site/index.html,並沿著權限鏈向下檢查,找出第一個對其他使用者沒有 x 的目錄。
應用程式需要寫入的目錄,例如 upload path,是例外。請透過 ownership 授予權限,不要放寬 mode:sudo chown -R www-data:www-data /srv/site/uploads,並維持 mode 為 755。只對確實需要寫入的單一目錄保留寫入權限。
chmod,不遞迴修改整個目錄樹
chmod 有兩種寫法。八進位模式會一次設定全部 9 個權限位元:chmod 644 notes.txt。符號模式只變更指定的項目,其他權限維持不變:chmod u+x deploy.sh 為擁有者新增執行權限,而 chmod go-w notes.txt 移除群組與其他使用者的寫入權限。
遞迴修改是目錄樹受損的常見原因。chmod -R 755 . 會將每個映像檔與設定檔都設為可執行,因為 chmod 無法區分指令碼與 JPEG。請改用大寫 X。
chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txt大寫 X 會將執行權限套用至目錄,以及原本任一位置已具有執行位元的檔案。目錄最後會是 755,一般檔案會是 644,原本已可執行的指令碼則維持原狀。當某個檔案已有可套用的權限模式時,chmod --reference=good.sh other.sh 可將該模式複製到其他檔案。
你看到的錯誤訊息
bash: ./deploy.sh: Permission denied表示適用於你的 triad 中沒有 x 位元,或該路徑上的某個目錄沒有 x。chmod u+x deploy.sh可修正第一種情況。
bash: ./deploy.sh: cannot execute: required file not found是另一種名稱容易造成混淆的錯誤。x位元正常,但第一行指定的直譯器不存在。通常原因是 Windows 換行格式,導致 kernel 尋找名為 /bin/bash\r 的直譯器。使用 sed -i 's/\r$//' deploy.sh 修正。
Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open.來自 SSH client,因為其他帳號可讀取 private key,所以 client 拒絕使用該金鑰。金鑰的權限應為 600,~/.ssh 的權限應為 700。完整的金鑰處理方式請參閱管理 SSH 金鑰及其檔案權限。
Authentication refused: bad ownership or modes for directory /home/deploy/.ssh會出現在 server 的 journal 中,表示 home directory 或其 .ssh 可由群組寫入。sshd 的 StrictModes 設定會拒絕該金鑰;從 client 端看起來,這會變成沒有說明原因的非預期密碼提示。
sudo: /etc/sudoers is world writable後接 sudo: no valid sudoers sources found, quitting,表示 sudo 檢查自身設定檔的權限模式後拒絕執行。該檔案的權限必須是 0440。這通常是大範圍遞迴執行 chmod 後的結果,也可能與上述 sshd 訊息同時出現,導致只能透過 provider 的 console 恢復存取。
為何 777 不是修正方法
777 會讓機器上的每個帳號,以及這些帳號所執行的每個程序,都取得寫入權限。伺服器會以各自的使用者帳號執行服務,因此在 VPS 上,「所有人」涵蓋的範圍遠大於筆記型電腦。遭入侵的服務可以寫入所有允許 777 寫入的位置。
在 web root 下,危害會直接發生。伺服器同時提供該目錄內容時,任何人都可寫入的目錄會讓檔案上傳漏洞變成植入 script 的手段,之後還能要求伺服器回傳並執行該檔案。
對於所有權問題,777 幾乎總是錯誤答案。表面症狀是「應用程式無法寫入此目錄」。真正原因是該目錄屬於錯誤的使用者。sudo chown -R appuser:appuser /srv/app/storage 搭配 mode 755 即可解決問題,並阻止其他帳號存取。在部署任何內容前先建立這些帳號,是新 VPS 的前 10 分鐘應完成的工作。
在一個常見位置使用 world write 是合理的:/tmp,其權限設定寫作 drwxrwxrwt。結尾的 t 是 sticky bit:目錄可由所有人寫入,但使用者只能刪除自己擁有的檔案。沒有這個 bit,任何帳號都能刪除其他帳號的暫存檔案。
變更模式前先讀取目前設定
這些命令只會讀取狀態,因此可在任何位置安全執行。
id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002find <path> -perm -0002 會列出路徑下所有設定 world write bit 的項目。有人使用 chmod 777 修復項目後,這是稽核系統最快的方法。
若要確認特定服務帳號能否進入某個目錄,請以該帳號的身分提出查詢。sudo -u www-data test -x /srv/site && echo yes || echo no 會在該使用者對目錄具備 traverse 權限時輸出 yes,沒有該權限時則輸出 no。以 root 身分查詢無法證明任何事情,因為 root 會略過這項檢查,結果永遠是 yes。
FAQ
Linux 中的 drwxr-xr-x 代表什麼?
這表示該項目是目錄,開頭的 d 表示目錄,權限模式為 755。擁有者三元組為 rwx,因此擁有者具備所有權限。群組三元組為 r-x,其他使用者三元組為 r-x,因此其他使用者都能列出其中的名稱並通過該目錄,但只有擁有者能新增或刪除內容。使用 stat -c '%A %a %U %G %n' <path> 可確認任一路徑;該命令會並列顯示字母格式與八進位格式。
為什麼網頁檔案是 644,而網頁目錄是 755?
網頁伺服器會以不同的帳號執行;在 Ubuntu 上是 www-data。它需要讀取所提供的檔案,也需要通過檔案上方的每一層目錄,但沒有理由對其中任一項進行寫入。644 讓擁有者具備寫入權限,其他使用者具備讀取權限。755 讓擁有者具備寫入權限,其他使用者具備通過目錄的權限。應用程式確實需要寫入的目錄,應使用 chown 移交給該應用程式的使用者,而不是放寬權限模式讓所有人都能寫入。
x 位元是否表示我可以執行目錄?
不是。在目錄上,x 表示通過目錄,也就是核心在解析路徑時,能夠解析其中一個名稱的權限。cd 需要這項權限,任何開啟其下檔案的操作也需要這項權限。路徑上的每一層目錄都需要 x,因此即使檔案的權限模式為 644,只要上層目錄缺少你所需的 x,該檔案仍然無法存取。namei -l /path/to/file 會列出路徑中每一層目錄的權限模式,藉此顯示路徑解析在哪一層停止。
chmod 777 是否有可能是正確的修正方式?
在伺服器上幾乎不會。它會授予機器上的每個帳號寫入權限,包括服務所使用的帳號,因此只要其中一項服務遭到入侵,就能改寫該檔案。應用程式無法寫入目錄時,真正的問題通常是擁有權:sudo chown -R appuser:appuser /srv/app/storage 搭配 755 權限模式,就能提供應用程式所需的權限,同時排除其他使用者。常見的例外是 /tmp 使用 1777,而這之所以有效,是因為 sticky bit 會阻止使用者刪除其他使用者的檔案。
為什麼 ls 會在權限後面顯示句點或加號?
第 11 個字元表示超出 9 個權限位元的其他規則。句點(如 drwxr-xr-x.)表示已附加 SELinux security context,這在 Fedora 與 Rocky 上很常見。加號(如 drwxr-xr-x+)表示已設定 POSIX ACL (access control list),因此某些使用者或群組具備 3 個三元組未顯示的權限。執行 getfacl <path> 可列出這些額外項目。