Linux 的 Permission denied:包含 /dev/null 的 10 種情況
Permission denied 是 Linux 中目前帳號沒有權限使用該檔案、資料夾或指令時出現的錯誤。先依錯誤行開頭的指令名稱與路徑判斷是哪種情況,再用 ls -l 確認權限與擁有者,接著以符合該情況的權限或帳號重新執行即可解決。
以下輸出是在 AlmaLinux 9.8 伺服器的 root 帳號與 Debian 12 伺服器的一般帳號上執行的結果,帳號名稱、主機名稱以及 /dev/null 輸出中的時間都是範例值。
1️⃣ 找出 Permission denied 的原因
錯誤行會以 [指令: 對象: Permission denied] 的形式結尾,從前面的指令名稱與路徑就能看出是在哪裡被擋下。在下方圖中選擇與你畫面相似的錯誤訊息,就會顯示應先確認的指令與本文中要閱讀的位置。
2️⃣ 常見的 Permission denied
🔲 檔案的讀取與寫入權限
要讀取檔案,該帳號需要讀取(r)權限;要修改或新建檔案則需要寫入(w)權限。權限設為 600 的 secret.txt 只有擁有者 root 能讀寫。
ls -l secret.txt-rw------- 1 root root 16 Oct 29 00:29 secret.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission denied改用另一個帳號 daemon 讀取同一個檔案,立刻被拒。在沒有寫入權限的資料夾中建立檔案也會出現同樣的錯誤,在 Debian 12 伺服器的一般帳號下,touch 在權限設為 000 的 lock 資料夾中被擋下。
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission denied在 ls -l 的第一欄依擁有者、群組、其他帳號的順序查看是否有 r 與 w,再用 chmod 只為需要的帳號加上權限,或用 chown 變更擁有者。
🔲 資料夾的通過權限
即使檔案權限正確,只要路徑中間的資料夾沒有 x 權限,就碰不到其中的檔案。對資料夾而言,x 是穿過該資料夾進入內部的權限,r 是讀取內部名稱清單的權限。
ls -ld web web/cssdrw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/cssrunuser -u daemon -- ls -l webls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ? ? css
-????????? ? ? ? ? ? index.htmlweb 資料夾只有 r,所以 daemon 能讀到內部的名稱 css 與 index.html,但因為沒有 x,權限與大小都留成問號。相反地,只有 x 沒有 r 的 site 資料夾無法列出清單,但已知名稱的檔案可以讀取。
ls -ld sitedrwx--x--x 2 root root 24 Oct 29 00:29 siterunuser -u daemon -- ls sitels: cannot open directory 'site': Permission deniedrunuser -u daemon -- cat site/index.html<h1>index</h1>路徑很長時,用 ls -ld 從上層資料夾逐一確認是否有 x,並只為被擋的資料夾加上該帳號通過所需的 x。
🔲 執行權限
要以 ./檔名 執行腳本,該檔案必須有 x 權限。權限為 644 的 deploy.sh 執行遭拒。
ls -l deploy.sh-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh./deploy.shbash: line 1: ./deploy.sh: Permission denied用 chmod u+x 為擁有者加上 x 後,第一欄變成了 [-rwxr--r--]。
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.sh有 x 權限卻仍無法執行時,請確認該檔案所在的檔案系統是否以 noexec 掛載。
🔲 讀取 root 專屬的資訊
一般帳號無法讀取系統保留給 root 的資訊,例如 root 啟動的程序或其他帳號的密碼資訊。在 Debian 12 伺服器上以一般帳號開啟 1 號程序的 fd 資料夾時,出現了權限錯誤。
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: Permission denied.其他帳號的密碼到期資訊也因同樣理由被擋,存放這些資訊的 /etc/shadow 是刻意設成一般使用者無法讀取的檔案。這類錯誤不要放寬權限,請用 sudo 或 root 帳號重新執行。
🔲 加了 sudo 仍擋下 > 時
sudo 只會以 root 執行寫在它後面的指令,而為重新導向(>)開啟檔案這件事,是在指令執行前由目前帳號的 shell 處理。因此,若把 sudo echo 的輸出重新導向到只有 root 能寫的檔案,錯誤行會以 shell 名稱開頭,呈現 [bash: 檔案路徑: Permission denied] 的形式。
sudo echo x > /root/test.txt要連重新導向也以 root 執行,就用 sh -c 包住整行,讓 shell 本身以 sudo 執行;sudo 官方手冊也舉了在 sh -c 中執行以讓重新導向生效的例子。
sudo sh -c 'echo x > /root/test.txt'tee 會接收標準輸入並直接寫入指定的檔案,所以用 sudo 執行 tee 時,檔案由具有 root 權限的 tee 開啟。tee 也會把收到的內容在畫面上再輸出一次。
echo x | sudo tee /root/test.txt🔲 SSH 登入遭拒
若 Permission denied 前方帶有 [帳號@伺服器位址:],且括號中有 publickey 之類的驗證方式,就是在登入驗證階段遭拒,要確認的地方與檔案權限不同。伺服器上的 sshd 的 StrictModes 設定為預設值 yes,因此在接受登入前會檢查該帳號家目錄與檔案的權限與擁有者。只要家目錄、~/.ssh 資料夾、~/.ssh/authorized_keys 其中任何一個可被其他帳號寫入,sshd 就不會使用那個金鑰檔案,因此請用 ls -ld 確認這三處都沒有給其他帳號 w 權限。
⌨️ Permission denied 模擬器
下方模擬器以 root 帳號開始,可用 runuser 切換成另一個帳號 daemon,親自查看讀取檔案、通過資料夾與執行權限被擋下時的輸出。
3️⃣ 少見的 Permission denied
權限欄正確卻仍被拒時,是 SELinux 政策或 noexec 掛載這類權限位元以外的機制擋下的情況。以 root 執行仍被拒絕執行時,請確認該檔案是否完全沒有 x 位元。
在啟用 SELinux 的伺服器上,即使權限位元正確,只要 SELinux 政策阻擋就會出現 Permission denied,這時請先確認 SELinux 的拒絕紀錄。在有執行 audit 常駐程式的伺服器上,拒絕紀錄會以 [avc: denied] 留在 /var/log/audit/audit.log,並一併記錄被擋的動作、指令名稱(comm)與對象名稱(name)。
用 getenforce 查看 SELinux 是否啟用,再以 root 執行 ausearch 確認今天被擋的紀錄。
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayrsync 常駐程式接收時出現的 [Permission denied (13)],也是 SELinux 擋下模組路徑存取的情況。
在以 noexec 掛載的檔案系統上無法直接執行檔案,因此即使 ls -l 顯示 x,也會以 [bash: 腳本路徑: Permission denied] 遭拒。把該資料夾交給 findmnt -T,就會顯示該資料夾掛載的位置與選項,選項中有 noexec 就是這種情況。
findmnt -T /tmp -o TARGET,OPTIONSroot 能通過大部分的權限檢查,但只有執行這件事,必須擁有者、群組、其他帳號中至少一處有 x 才允許。因此完全沒有 x 的腳本,即使 root 用 ./ 執行也會被拒。
在 root 帳號下用 ./ 執行第一欄為 [-rw-r--r-- 1 root root] 的 deploy.sh,出現了 [bash: line 1: ./deploy.sh: Permission denied]。
🔲 /dev/null 變成一般檔案的情況
以一般帳號 SSH 登入後,若在 shell 提示字元之前就連續出現下方幾行,請先確認所有帳號用來丟棄輸出的字元裝置 /dev/null,是否變成了 root 擁有的一般檔案。行數會依登入時讀取的 profile 腳本數量而因伺服器不同,在同一台伺服器切換成 root 後就不再出現這個錯誤。
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
...ls -l /dev/null-rw-r--r-- 1 root root 55 Jan 10 09:00 /dev/nullstat -c %F /dev/nullregular file第一欄是 [-rw-r--r--],大小位置顯示 55,表示其他指令丟棄的錯誤文字已累積在檔案中。清理用的指令行若混入下方的寫法並以 root 執行,rm 會刪除裝置檔,接著下一個指令的 2>/dev/null 重新導向就會以同一個名稱建立 root 擁有的新一般檔案。
rm -f /dev/null 2>/dev/null下方這行請以 root 執行。先用旁邊的名稱建立新裝置,再用 mv 覆蓋,名稱就不會有空出來的瞬間,刪除與建立之間不會留下讓其他重新導向再建立一般檔案的空隙。
mknod -m 666 /dev/null.new c 1 3 && mv -f /dev/null.new /dev/null && ls -l /dev/nullcrw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/nullstat -c %F /dev/nullcharacter special filemknod 的 [c 1 3] 是核心裝置編號清單中 /dev/null 的編號。復原後,一般帳號的 echo x > /dev/null 也沒有錯誤地結束了。重新開機也可能讓它恢復,但不必停止伺服器的上面這一行比較快。
| 確認 | 修正前 | 修正後 |
|---|---|---|
| ls -l 第一欄 | -rw-r--r-- | crw-rw-rw- |
| ls -l 大小位置 | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| 以一般帳號寫入 | Permission denied | 沒有錯誤 |
要丟棄的輸出只導向 >/dev/null 或 2>/dev/null 為止,除了復原時以外,絕不要把 /dev/null 寫成 rm 或 mv 的對象。
🔢 FAQ & 推薦內容
網頁伺服器 · 403
安裝 APM 後的 Apache 403 錯誤(403 Forbidden)
說明網頁伺服器無法讀取網頁資料夾,在 error_log 留下 Permission denied 並出現 403 的情況的文章。
網頁伺服器 · 503
安裝 APM 後的 503 錯誤
透過 error.log 確認 Apache 無法連上 php-fpm socket 而出現 503 的情況的文章。
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。