bash: ./script.sh: Permission denied とは
LinuxやmacOSで「Permission denied」はファイルやディレクトリへのアクセス権限が不足している場合に発生するエラーです。シェルスクリプトの実行、ファイルの読み書き、ディレクトリへのアクセスなど幅広い場面で遭遇します。Linuxを使い始めた人が最初にぶつかるエラーの一つです。
エラーの発生パターン
このエラーは主に以下のようなケースで発生します。
パターン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
根本原因の特定方法
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
Stack Overflowでの質問状況
Stack Overflowでは、Bashに関する質問が約157,100件投稿されており、bash: ./script.sh: Permission deniedは最も頻繁に質問されるエラーカテゴリの一つです。
よくある質問(FAQ)
-
Qchmod 777 はなぜ危険ですか?
-
A
777はすべてのユーザーに読み取り・書き込み・実行の全権限を付与します。悪意のあるユーザーやプロセスがファイルを改ざんできるため、セキュリティリスクが非常に高くなります。特にWebサーバー上のファイルに777を設定すると深刻な脆弱性になります。
-
Qsudoとsuの違いは何ですか?
-
A
sudoは特定のコマンドだけを管理者権限で実行します。suはユーザーを切り替える(su rootでrootユーザーになる)コマンドです。sudoのほうがセキュリティ的に推奨されており、操作の監査ログも記録されます。
-
Qファイルの所有者を変更するには?
-
A
chownコマンドで所有者を変更できます。例: sudo chown user:group filename。ディレクトリ配下を再帰的に変更するには -R オプションを使用します(sudo chown -R user:group dirname)。所有者の変更にはroot権限が必要です。




コメント