OS

Linuxで「Permission denied」が出る原因と確認ポイント

Linuxで「Permission denied」が表示されたときに、ファイルの権限・所有者・実行権限・ディレクトリ権限を確認し、sudoや数値指定の意味を理解しながら原因を切り分ける手順を解説します。

この記事でわかること

  • エラーメッセージだけで判断せず、対象パスの各階層と実行ユーザーを確認する。
  • ls -lで所有者・グループ・権限を確認し、ファイルとディレクトリで必要な権限が異なる点を押さえる。
  • chmodの数値指定は読み取り・書き込み・実行権限を表し、sudo自体の指定値ではないことを区別する。
  • 権限変更は原因を確認してから行い、過剰な権限付与を避ける。

「Permission denied」が発生する場面と最初に確認する情報

「Permission denied」は、ファイルの読み書き、スクリプトの実行、ディレクトリへの移動などで、実行ユーザーに必要な権限がない場合に発生します。まず権限を変更するのではなく、どのコマンドを、どのユーザーで、どのパスに対して実行したかを整理します。特に、ファイル自体の権限だけでなく、対象パス上にある親ディレクトリを通過できるかも確認が必要です。

BASH
whoami
id
pwd
ls -ld /path /path/to /path/to/target

# 出力例。実際のユーザー名・UID・権限は環境によって異なります。
# deploy
# uid=1001(deploy) gid=1001(deploy) groups=1001(deploy)
# drwxr-xr-x ... /path
# drwx------ ... /path/to
# -rw-r----- ... /path/to/target

確認時は、エラーメッセージ、実行したコマンド、対象パス、実行ユーザーをひとまとめに記録すると、再現条件を整理しやすくなります。

ls -lでファイルの権限と所有者を読む

ファイルの基本情報は、ls -lで確認できます。次の例では、先頭の10文字程度がファイル種別と権限、その後ろにリンク数、所有者、グループ、サイズなどが続きます。権限部分は、所有者、グループ、その他のユーザーの3区分に分かれ、それぞれ読み取り(r)、書き込み(w)、実行(x)の順に並びます。

TEXT
-rwxr-x--- 1 appuser appgroup 1234 Sep 30 10:00 script.sh
||||||||||
|||||||||+-- その他: 実行なし
||||||||+--- その他: 書き込みなし
|||||||+---- その他: 読み取りなし
||||||+----- グループ: 実行あり
|||||+------ グループ: 書き込みなし
||||+------- グループ: 読み取りあり
|||+------- 所有者: 実行あり
||+-------- 所有者: 書き込みあり
|+--------- 所有者: 読み取りあり
+---------- - は通常ファイル(d はディレクトリ)
確認項目見る内容
実行ユーザーwhoamiやidで、コマンドを実行したユーザーを確認する
所有者ls -lの所有者欄と実行ユーザーの関係を確認する
グループ実行ユーザーが対象グループに所属しているか確認する
権限文字列r・w・xが所有者/グループ/その他のどこに付いているか確認する
対象操作読む、書く、実行する、移動するなど、必要な権限を整理する
権限エラーの確認項目

たとえば実行ユーザーが所有者でも、所有者欄にxがなければ、実行ファイルや実行可能なスクリプトを直接起動できません。実行ユーザーが所有者でもグループでもない場合は、「その他」の権限が判定に使われます。

ファイルとディレクトリで異なる実行権限の意味

通常のファイルでは、rは内容の読み取り、wは内容の変更、xは実行に関係します。スクリプトを直接実行して拒否された場合は、ファイルのxだけでなく、1行目のインタプリタ指定や親ディレクトリの権限も確認します。ディレクトリでは、rは項目一覧の読み取り、wは項目の作成・削除など、xはディレクトリ内の項目へアクセスしたり、そのディレクトリをパスとして通過したりする権限に関係します。操作によって必要な組み合わせが異なる点に注意してください。

BASH
ls -ld /srv /srv/app /srv/app/data
ls -l /srv/app/data/report.txt

# 確認例。実際の出力は環境に依存します。
# 親ディレクトリのいずれかに、実行ユーザーの x がない場合、
# report.txt 自体に適切な権限があっても到達できないことがあります。

そのため、対象ファイルだけを見て判断せず、パスを構成する各ディレクトリを順番に確認します。

chmodの数値指定とsudoの役割を切り分ける

chmodの数値指定では、読み取りを4、書き込みを2、実行を1として足し合わせます。3桁は左から、所有者、グループ、その他の順です。たとえば7は4+2+1なので、rwxを表します。ここで重要なのは、755や644はsudoに指定する数値ではないことです。sudoは許可されたユーザーが、通常は特権ユーザーなど別のユーザーとしてコマンドを実行する仕組みです。sudo chmod 755 fileの755は、sudoではなくchmodへ渡す権限モードです。

指定所有者グループその他
755rwxr-xr-x
644rw-r–r–
700rwx——
640rw-r–—
chmodの数値指定例
BASH
# 現在の状態を記録してから、対象を限定して変更します。
ls -l ./script.sh
sudo chmod 755 ./script.sh
ls -l ./script.sh

# 期待される確認例(実際の所有者・時刻などは環境に依存します)。
# -rw-r----- ... ./script.sh
# -rwxr-xr-x ... ./script.sh

sudoの実行可否、認証要求、実際に切り替わるユーザーはsudoersの設定や環境に依存します。権限エラーを解消するために、最初から777のような広い権限を付けるのではなく、必要なユーザー区分だけを変更してください。

確認結果に応じた修正と再確認の進め方

所有者やグループが意図と異なる場合は、chownやchgrpを検討します。モード権限だけが不足している場合はchmodを使います。ただし、変更前に対象パス、所有者、グループ、権限、実行ユーザーを記録し、対象を限定してください。

参考