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サーバーの一般アカウントでは、権限を000にしたlockフォルダーでtouchが拒否されました。

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で実行し、リダイレクト(>)でファイルを開く処理は、コマンドが実行される前に今のアカウントのシェルが行います。そのため、rootだけが書けるファイルへsudo echoの出力をリダイレクトすると、エラー行はシェル名で始まる[bash: ファイルパス: Permission denied]の形で出ます。

sudo echo x > /root/test.txt

リダイレクトまでrootで行うには、sh -cで行全体を囲んでシェルごとsudoで実行します。sudoの公式マニュアルも、リダイレクトが効くようにsh -cの中で実行する例を挙げています。

sudo sh -c 'echo x > /root/test.txt'

teeは標準入力を受け取って指定したファイルに直接書くため、teeをsudoで実行すると、ファイルはroot権限のteeが開きます。teeは受け取った内容を画面にももう一度出力します。

echo x | sudo tee /root/test.txt

🔲 SSHログインの拒否

Permission deniedの前に[アカウント@サーバーのアドレス:]が付き、括弧の中にpublickeyのような認証方式があれば、ログイン認証の段階で拒否されたケースで、ファイルの権限とは確認する場所が違います。サーバーのsshdはStrictModesの設定が既定値yesのため、ログインを受け付ける前にそのアカウントのホームフォルダーとファイルの権限、所有者を検査します。ホームフォルダー、~/.sshフォルダー、~/.ssh/authorized_keysのうち一つでも他のアカウントが書き込めると、sshdはその鍵ファイルを使わないため、ls -ldで3か所に他のアカウントの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デーモンが動いているサーバーで/var/log/audit/audit.logに[avc: denied]として残り、拒否された動作とコマンド名(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が./で実行しても拒否されます。

最初の欄が[-rw-r--r-- 1 root root]のdeploy.shをrootアカウントで./実行すると、[bash: line 1: ./deploy.sh: Permission denied]が出ました。

🔲 /dev/nullが通常ファイルに変わった場合

一般アカウントでSSHに入った直後、シェルのプロンプトより先に下の行が続けて出たら、すべてのアカウントが出力を捨てる文字デバイス/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もエラーなく終わりました。再起動で戻ることもありますが、サーバーを止めない上の1行のほうが速いです。

確認修正前修正後
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に戻って、はじめてデバイスとして復旧したことになります。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 0   +   6   =