Linux/Shell Permission denied の原因と解決方法

bash: ./script.sh: Permission denied とは

LinuxやmacOSで「Permission denied」はファイルやディレクトリへのアクセス権限が不足している場合に発生するエラーです。シェルスクリプトの実行、ファイルの読み書き、ディレクトリへのアクセスなど幅広い場面で遭遇します。Linuxを使い始めた人が最初にぶつかるエラーの一つです。

このエラーの原因は「ファイルやディレクトリに対する適切なアクセス権限がない」という点です。ls -lでパーミッションを確認しましょう。

エラーの発生パターン

このエラーは主に以下のようなケースで発生します。

パターン1: スクリプトに実行権限がない

$ ./myscript.sh
bash: ./myscript.sh: Permission denied

$ ls -l myscript.sh
-rw-r--r-- 1 user group 100 Mar 27 10:00 myscript.sh
# 実行権限(x)がない

スクリプトファイルに実行権限(x)が付与されていないため、直接実行できません。Linuxではファイルに実行権限を明示的に付与しないと、スクリプトとして実行できません。

# 修正: 実行権限を付与
$ chmod +x myscript.sh
$ ./myscript.sh

# または bash コマンドで実行(権限不要)
$ bash myscript.sh

パターン2: root権限が必要な操作

$ apt-get update
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)

$ vi /etc/nginx/nginx.conf
# 保存時に Permission denied

システムファイルの編集やパッケージ管理などの操作は管理者権限(root)が必要です。一般ユーザーでは権限が不足しています。

# 修正: sudoで管理者権限を使用
$ sudo apt-get update

$ sudo vi /etc/nginx/nginx.conf

# 現在のユーザーを確認
$ whoami

パターン3: ディレクトリのパーミッション不足

$ cd /var/log/private/
bash: cd: /var/log/private/: Permission denied

$ ls -ld /var/log/private/
drwx------ 2 root root 4096 Mar 27 10:00 /var/log/private/

ディレクトリの所有者がrootで、他のユーザーには一切のアクセス権限がない状態です。ディレクトリに入るにはそのディレクトリの実行権限(x)が必要です。

# 修正例1: sudoで一時的にアクセス
$ sudo ls /var/log/private/

# 修正例2: 自分のディレクトリの場合はパーミッション変更
$ chmod 755 /home/user/mydir

# パーミッションの意味
# r(4): 読み取り  w(2): 書き込み  x(1): 実行/ディレクトリ移動
# 755: 所有者=rwx, グループ=r-x, その他=r-x
sudoを使う際は、実行するコマンドの影響範囲を必ず確認してください。特にchmod -R 777のような過度に緩いパーミッションの設定はセキュリティリスクになります。必要最小限の権限を付与する原則(最小権限の原則)を守りましょう。

根本原因の特定方法

Permission deniedが発生した場合、まずls -lでファイルのパーミッション、所有者、グループを確認します。次にwhoamiとgroupsで現在のユーザーとグループを確認し、アクセスに必要な権限を特定します。

# パーミッションの確認
$ ls -la myscript.sh
-rw-r--r-- 1 root root 100 Mar 27 10:00 myscript.sh

# 現在のユーザーとグループを確認
$ whoami
$ groups

# ディレクトリの権限を確認(-dオプション)
$ ls -ld /var/log/

# SELinuxが有効な場合のコンテキスト確認
$ ls -Z myscript.sh

防止策とベストプラクティス

Permission deniedを防ぐには、ファイルやディレクトリの作成時に適切なパーミッションを設定する習慣をつけましょう。シェルスクリプトを作成したらすぐにchmod +xで実行権限を付与し、チームで共有するファイルにはグループ権限を適切に設定します。

# 防止策まとめ
# 1. スクリプト作成時に実行権限を付与
$ touch myscript.sh
$ chmod +x myscript.sh

# 2. 適切なパーミッション設定
$ chmod 644 config.txt    # 設定ファイル: 所有者rw, 他r
$ chmod 755 script.sh     # スクリプト: 所有者rwx, 他rx
$ chmod 700 secret.key    # 秘密鍵: 所有者のみ

# 3. umaskでデフォルトパーミッションを設定
$ umask 022  # 新規ファイル:644, ディレクトリ:755
chmod 777は絶対に避けてください。必要最小限の権限を付与する「最小権限の原則」に従い、適切なパーミッション(644、755、700など)を使い分けましょう。

Stack Overflowでの質問状況

Stack Overflowでは、Bashに関する質問が約157,100件投稿されており、bash: ./script.sh: Permission deniedは最も頻繁に質問されるエラーカテゴリの一つです。

よくある質問(FAQ)

Q
chmod 777 はなぜ危険ですか?
A

777はすべてのユーザーに読み取り・書き込み・実行の全権限を付与します。悪意のあるユーザーやプロセスがファイルを改ざんできるため、セキュリティリスクが非常に高くなります。特にWebサーバー上のファイルに777を設定すると深刻な脆弱性になります。

Q
sudoとsuの違いは何ですか?
A

sudoは特定のコマンドだけを管理者権限で実行します。suはユーザーを切り替える(su rootでrootユーザーになる)コマンドです。sudoのほうがセキュリティ的に推奨されており、操作の監査ログも記録されます。

Q
ファイルの所有者を変更するには?
A

chownコマンドで所有者を変更できます。例: sudo chown user:group filename。ディレクトリ配下を再帰的に変更するには -R オプションを使用します(sudo chown -R user:group dirname)。所有者の変更にはroot権限が必要です。

免責事項: 当記事の情報は執筆時点の内容に基づいています。最新情報は各公式サイトをご確認ください。当サイトは情報提供を目的としており、資格取得・技術的対応の結果について一切の責任を負いません。

コメント

タイトルとURLをコピーしました