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サーバーの一般アカウントでは、権限を000にしたlockフォルダーでtouchが拒否されました。
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedls -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 deniedchmod u+xで所有者にxを足すと、最初の欄が[-rwxr--r--]に変わりました。
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shx権限があるのに実行が拒否されたら、そのファイルがあるファイルシステムが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で実行し、リダイレクト(>)でファイルを開く処理は、コマンドが実行される前に今のアカウントのシェルが行います。そのため、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になって、ファイルの読み取り、フォルダーの通過、実行権限で拒否される出力を直接確認できます。
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を実行し、今日拒否された記録を確認します。
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が./で実行しても拒否されます。
最初の欄が[-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/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もエラーなく終わりました。再起動で戻ることもありますが、サーバーを止めない上の1行のほうが速いです。
| 確認 | 修正前 | 修正後 |
|---|---|---|
| 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 & おすすめコンテンツ
Webサーバー・403
APMインストール後のApache 403エラー(403 Forbidden)
Webサーバーがwebフォルダーを読めず、error_logにPermission deniedが残って403が出たケースを扱った記事です。
Webサーバー・503
APMインストール後の503エラー
Apacheがphp-fpmのソケットにつながらず503が出たケースを、error.logで確認した記事です。
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。