MeWrite Docs

bash: permission denied

ファイルの実行権限がない場合に発生するエラー

概要

bash: ./script.sh: Permission denied は、実行権限のないファイルを実行しようとした場合に発生するエラーです。ファイルの権限設定を変更することで解決できます。

エラーメッセージ

bash: ./script.sh: Permission denied
-bash: /usr/local/bin/command: Permission denied

原因

  1. 実行権限がない: ファイルに実行権限が付与されていない
  2. 所有者の問題: 他のユーザーが所有するファイル
  3. マウントオプション: noexec でマウントされている
  4. SELinux/AppArmor: セキュリティポリシーで制限
  5. スクリプトのシェバン: 不正なインタープリタ指定

解決策

1. 実行権限を付与

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 現在の権限を確認
ls -la script.sh

# 実行権限を追加
chmod +x script.sh

# 所有者のみ実行権限
chmod u+x script.sh

# 全員に実行権限
chmod a+x script.sh

# 数値で指定(755: rwxr-xr-x)
chmod 755 script.sh

2. bash で直接実行

1
2
3
4
5
6
7
8
9
# 実行権限なしでも実行可能
bash script.sh

# または
sh script.sh

# source で実行(現在のシェルで)
source script.sh
. script.sh

3. 所有者を変更

1
2
3
4
5
6
7
8
# 所有者を確認
ls -la script.sh

# 所有者を変更
sudo chown $(whoami) script.sh

# グループも変更
sudo chown $(whoami):$(whoami) script.sh

4. シェバンの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ファイルの先頭を確認
head -1 script.sh

# 正しいシェバン
#!/bin/bash
#!/usr/bin/env bash
#!/usr/bin/python3
#!/usr/bin/env python3

# シェバンがない場合は追加
echo '#!/bin/bash' | cat - script.sh > temp && mv temp script.sh

5. マウントオプションの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# マウントオプションを確認
mount | grep $(df . --output=source | tail -1)

# noexec オプションがある場合
# /dev/sda1 on /home type ext4 (rw,noexec,...)

# マウントし直す(一時的)
sudo mount -o remount,exec /home

# fstab を編集(永続的)
sudo nano /etc/fstab
# noexec を削除

6. SELinux の問題(CentOS/RHEL)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# SELinux の状態確認
getenforce

# 一時的に無効化
sudo setenforce 0

# ファイルのコンテキストを確認
ls -Z script.sh

# コンテキストを修正
sudo restorecon -v script.sh

# 実行可能なコンテキストを設定
sudo chcon -t bin_t script.sh

7. AppArmor の問題(Ubuntu)

1
2
3
4
5
6
7
8
# AppArmor の状態確認
sudo aa-status

# プロファイルを確認
sudo cat /etc/apparmor.d/*

# 一時的にプロファイルを無効化
sudo aa-disable /path/to/profile

8. バイナリファイルの問題

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ファイルタイプを確認
file script.sh

# アーキテクチャの問題
# ELF 64-bit LSB executable, x86-64
# → 32ビット環境では実行できない

# Windows の改行コードを変換
dos2unix script.sh
# または
sed -i 's/\r$//' script.sh

9. sudo での実行

1
2
3
4
5
6
7
8
# root 権限で実行
sudo ./script.sh

# 環境変数を保持
sudo -E ./script.sh

# 特定のユーザーとして実行
sudo -u www-data ./script.sh

10. ディレクトリの権限

1
2
3
4
5
# 親ディレクトリの権限も確認
ls -la /path/to/

# ディレクトリには x 権限が必要(ディレクトリに入るため)
chmod +x /path/to/directory

よくあるシナリオ

Git からクローンしたスクリプト

1
2
3
4
5
6
# Git は実行権限を保持しないことがある
chmod +x scripts/*.sh

# Git で実行権限を追跡
git update-index --chmod=+x script.sh
git commit -m "Add execute permission"

Docker 内でのスクリプト実行

1
2
3
4
5
6
# Dockerfile
COPY script.sh /app/
RUN chmod +x /app/script.sh

# または COPY 時に権限を指定
COPY --chmod=755 script.sh /app/

cron ジョブ

1
2
3
4
5
6
7
# cron は PATH が限定的
# フルパスを指定
/usr/bin/bash /home/user/script.sh

# または cron 内で PATH を設定
PATH=/usr/local/bin:/usr/bin:/bin
* * * * * /home/user/script.sh

デバッグのコツ

詳細な権限情報

1
2
3
4
5
6
7
8
# stat で詳細情報
stat script.sh

# ACL を確認
getfacl script.sh

# ファイルの属性
lsattr script.sh

パスの確認

1
2
3
4
5
6
7
8
# which でパスを確認
which command

# type でコマンドの種類を確認
type command

# 環境変数 PATH を確認
echo $PATH

Linux の他のエラー

最終更新: 2025-12-08