Linux 的 Permission denied:包含 /dev/null 的 10 種情況

測試環境RHEL 系列AlmaLinux 9.8root 帳號Debian 12 一般帳號2026-11-05 確認
找出 Permission denied 的原因

Permission denied 是 Linux 中目前帳號沒有權限使用該檔案、資料夾或指令時出現的錯誤。先依錯誤行開頭的指令名稱與路徑判斷是哪種情況,再用 ls -l 確認權限與擁有者,接著以符合該情況的權限或帳號重新執行即可解決。

以下輸出是在 AlmaLinux 9.8 伺服器的 root 帳號與 Debian 12 伺服器的一般帳號上執行的結果,帳號名稱、主機名稱以及 /dev/null 輸出中的時間都是範例值。

1️⃣ 找出 Permission denied 的原因

錯誤行會以 [指令: 對象: Permission denied] 的形式結尾,從前面的指令名稱與路徑就能看出是在哪裡被擋下。在下方圖中選擇與你畫面相似的錯誤訊息,就會顯示應先確認的指令與本文中要閱讀的位置。

🧭 依錯誤訊息找出你的情況
說明圖解
🧭 錯誤訊息
錯誤訊息cat: secret.txt: Permission deniedls: cannot access 'web/index.html': Permission denied./deploy.sh: Permission deniedls: cannot open directory '/proc/1/fd': Permission deniedbash: /root/test.txt: Permission denieduser@server1: Permission denied (publickey)(13)Permission denied-bash: /dev/null: Permission denied
➜
先確認ls -l secret.txtls -ld webls -l deploy.shidsudo sh -c家目錄與檔案權限getenforce · findmntls -l /dev/null
➜
本文中的位置🔲 檔案的讀取與寫入權限🔲 資料夾的通過權限🔲 執行權限🔲 讀取 root 專屬的資訊🔲 加了 sudo 仍擋下 > 時🔲 SSH 登入遭拒3️⃣ 少見的 Permission denied🔲 /dev/null 變成一般檔案的情況
讀取或修改檔案的指令被拒時,先確認該檔案的 r、w 權限與擁有者。
錯誤中出現路徑中間某個資料夾的名稱時,請確認該資料夾是否有 x 權限。
直接執行腳本被拒時,請確認該檔案是否有 x 權限。
以一般帳號讀取系統資訊被擋時,先確認目前帳號,再以 root 重新執行。
加了 sudo 仍在 > 重新導向時被擋,請連重新導向一起以 root 執行。
錯誤前方帶有帳號與伺服器位址時,表示是在登入驗證時遭拒。
權限欄正確或以 root 執行仍被拒時,請確認 SELinux、noexec 與執行位元。
一登入就連續出現這一行時,請確認 /dev/null 是否變成了一般檔案。

2️⃣ 常見的 Permission denied

🔲 檔案的讀取與寫入權限

要讀取檔案,該帳號需要讀取(r)權限;要修改或新建檔案則需要寫入(w)權限。權限設為 600 的 secret.txt 只有擁有者 root 能讀寫。

ls -l secret.txt
-rw------- 1 root root 16 Oct 29 00:29 secret.txt
runuser -u daemon -- cat secret.txt
cat: secret.txt: Permission denied

改用另一個帳號 daemon 讀取同一個檔案,立刻被拒。在沒有寫入權限的資料夾中建立檔案也會出現同樣的錯誤,在 Debian 12 伺服器的一般帳號下,touch 在權限設為 000 的 lock 資料夾中被擋下。

touch ~/touchtest/lock/x.txt
touch: cannot touch '/home/user/touchtest/lock/x.txt': Permission denied

在 ls -l 的第一欄依擁有者、群組、其他帳號的順序查看是否有 r 與 w,再用 chmod 只為需要的帳號加上權限,或用 chown 變更擁有者。

🔲 資料夾的通過權限

即使檔案權限正確,只要路徑中間的資料夾沒有 x 權限,就碰不到其中的檔案。對資料夾而言,x 是穿過該資料夾進入內部的權限,r 是讀取內部名稱清單的權限。

web/ ── drw-r--r-- · 有 r · 沒有 x → 在此被擋
css/ ── 看得到名稱,權限 · 大小為 ?
style.css ── 無法到達
index.html ── 看得到名稱,權限 · 大小為 ?
ls -ld web web/css
drw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/css
runuser -u daemon -- ls -l web
ls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ?            ? css
-????????? ? ? ? ?            ? index.html

web 資料夾只有 r,所以 daemon 能讀到內部的名稱 css 與 index.html,但因為沒有 x,權限與大小都留成問號。相反地,只有 x 沒有 r 的 site 資料夾無法列出清單,但已知名稱的檔案可以讀取。

ls -ld site
drwx--x--x 2 root root 24 Oct 29 00:29 site
runuser -u daemon -- ls site
ls: cannot open directory 'site': Permission denied
runuser -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.sh
bash: line 1: ./deploy.sh: Permission denied

用 chmod u+x 為擁有者加上 x 後,第一欄變成了 [-rwxr--r--]。

chmod u+x deploy.sh
ls -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/fd
ls: cannot open directory '/proc/1/fd': Permission denied
chage -l daemon
chage: 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,親自查看讀取檔案、通過資料夾與執行權限被擋下時的輸出。

Permission denied 模擬器coreutils 8.32
[root@server1 work]#
只在瀏覽器中運作。以 root 帳號開始,在 runuser -u daemon -- 後面接上 cat 或 ls,就會顯示以另一個帳號 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 確認今天被擋的紀錄。

getenforce
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today

rsync 常駐程式接收時出現的 [Permission denied (13)],也是 SELinux 擋下模組路徑存取的情況。

在以 noexec 掛載的檔案系統上無法直接執行檔案,因此即使 ls -l 顯示 x,也會以 [bash: 腳本路徑: Permission denied] 遭拒。把該資料夾交給 findmnt -T,就會顯示該資料夾掛載的位置與選項,選項中有 noexec 就是這種情況。

findmnt -T /tmp -o TARGET,OPTIONS

root 能通過大部分的權限檢查,但只有執行這件事,必須擁有者、群組、其他帳號中至少一處有 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/null
stat -c %F /dev/null
regular 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/null
crw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/null
stat -c %F /dev/null
character special file

mknod 的 [c 1 3] 是核心裝置編號清單中 /dev/null 的編號。復原後,一般帳號的 echo x > /dev/null 也沒有錯誤地結束了。重新開機也可能讓它恢復,但不必停止伺服器的上面這一行比較快。

確認修正前修正後
ls -l 第一欄-rw-r--r--crw-rw-rw-
ls -l 大小位置551, 3
stat -c %Fregular filecharacter special file
以一般帳號寫入Permission denied沒有錯誤

要丟棄的輸出只導向 >/dev/null 或 2>/dev/null 為止,除了復原時以外,絕不要把 /dev/null 寫成 rm 或 mv 的對象。

🔢 FAQ & 推薦內容

嘗試寫入以唯讀方式掛載的檔案系統時會出現 [Read-only file system],這是與 Permission denied 不同的錯誤(EROFS)。這時請先確認該檔案系統以哪些選項掛載,而不是先看權限。

對所有帳號開放讀取、寫入與執行,那裡的 Permission denied 確實會消失,但其他帳號也能修改該檔案。只為需要的帳號加上權限或變更擁有者,影響範圍比較小。

只放寬權限雖能讓 Permission denied 消失,但 /dev/null 仍是一般檔案,丟棄的輸出會持續累積在該檔案中。stat 的結果回到 character special file,才算是復原成裝置。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 8   +   2   =