「Permission denied」が発生する場面と最初に確認する情報
「Permission denied」は、ファイルの読み書き、スクリプトの実行、ディレクトリへの移動などで、実行ユーザーに必要な権限がない場合に発生します。まず権限を変更するのではなく、どのコマンドを、どのユーザーで、どのパスに対して実行したかを整理します。特に、ファイル自体の権限だけでなく、対象パス上にある親ディレクトリを通過できるかも確認が必要です。
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)の順に並びます。
-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はディレクトリ内の項目へアクセスしたり、そのディレクトリをパスとして通過したりする権限に関係します。操作によって必要な組み合わせが異なる点に注意してください。
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へ渡す権限モードです。
| 指定 | 所有者 | グループ | その他 |
|---|---|---|---|
| 755 | rwx | r-x | r-x |
| 644 | rw- | r– | r– |
| 700 | rwx | — | — |
| 640 | rw- | r– | — |
# 現在の状態を記録してから、対象を限定して変更します。
ls -l ./script.sh
sudo chmod 755 ./script.sh
ls -l ./script.sh
# 期待される確認例(実際の所有者・時刻などは環境に依存します)。
# -rw-r----- ... ./script.sh
# -rwxr-xr-x ... ./script.shsudoの実行可否、認証要求、実際に切り替わるユーザーはsudoersの設定や環境に依存します。権限エラーを解消するために、最初から777のような広い権限を付けるのではなく、必要なユーザー区分だけを変更してください。
確認結果に応じた修正と再確認の進め方
所有者やグループが意図と異なる場合は、chownやchgrpを検討します。モード権限だけが不足している場合はchmodを使います。ただし、変更前に対象パス、所有者、グループ、権限、実行ユーザーを記録し、対象を限定してください。