Permission deniedでファイルが操作できない

ファイルを開こう・実行しよう・書き込もうとしたら Permission denied と言われて弾かれる——という状況を切り分けていきます。

どんな症状か

cat や vi で開こうとして拒否される、./script.sh のように実行しようとして拒否される、他のユーザーが作成したファイルを編集しようとして拒否される、といったケースです。

原因を切り分ける

ステップ1:誰が所有していて、誰に何の権限があるか確認する

$ ls -l notes.txt
-rw-r----- 1 alice staff 1240 ...  notes.txt

先頭のパーミッション表記(所有者/グループ/その他の3ブロック)と、そのあとの所有者・グループ名を確認します。上の例は「所有者aliceは読み書き可、グループstaffは読み取りのみ、それ以外は権限なし」という意味です。自分がaliceでもstaffのメンバーでもない場合は、Permission deniedになります。

ステップ2:自分がどのユーザー・グループに属しているか確認する

$ whoami
$ id
uid=1001(bob) gid=1001(bob) groups=1001(bob),100(users)

自分のユーザー名と、所属しているグループの一覧を確認します。ステップ1で見たファイルの所有者・グループと照らし合わせます。

ステップ3:実行しようとしている場合は実行権限(x)を確認する

$ ls -l script.sh
-rw-r--r-- 1 alice staff 320 ...  script.sh

読み取り権限(r)はあっても実行権限(x)が付いていなければ、./script.sh はPermission deniedになります。

ステップ4:ディレクトリ自体の権限も確認する

ファイル自体の権限に問題がなくても、そのファイルが置かれている親ディレクトリに実行権限(ディレクトリの場合は「中に入る権限」の意味になります)がないと、中のファイルにアクセスできずPermission deniedになることがあります。

解決方法

  • 自分のファイルの場合: chmod で必要な権限を追加します(例:chmod +x script.sh、chmod u+w notes.txt)。
  • 他人のファイルの場合: まず所有者に相談し、本当にアクセスが必要な理由を確認します。必要であれば所有者にグループへ追加してもらう(usermod -aG グループ名 ユーザー名、反映には再ログインが必要)方法もあります。
  • むやみにsudoを使わない: sudoで強制的に開くこともできますが、なぜそのファイルに権限がないのか(意図的な保護かもしれません)を先に確認するのが安全です。
関連する章: パーミッションの基本は初級「パーミッションと所有者」、応用的な使い方は中級「パーミッション応用とリンク」で扱っています。