Linuxで「Permission denied」が出るときの確認方法|権限・所有者を調べる手順
Linuxでファイルを開く、スクリプトを実行する、設定ファイルを編集するといった操作をしたときに、Permission denied と表示されることがあります。
このエラーは、操作を実行したユーザーに必要な権限がない場合などに発生します。ただし、単純にファイルの権限を変更すれば解決するとは限りません。ディレクトリのアクセス権やファイルの所有者、追加のアクセス制御が原因になっているケースもあります。
まずはエラーが発生した操作と実行ユーザーを確認し、原因に合った方法で対処しましょう。
Linuxで「Permission denied」が発生する主な原因
代表的な原因は、次のとおりです。
| 原因 | 確認するポイント |
|---|---|
| ファイルの読み取り権限がない | ファイルのパーミッション |
| ファイルの書き込み権限がない | 所有者・グループ・書き込み権限 |
| スクリプトに実行権限がない | 実行ビットの有無 |
| 親ディレクトリにアクセスできない | ディレクトリの実行権限 |
| 別のユーザーで操作している | 実行ユーザーとグループ |
| ACLなどの追加設定がある | ACLやセキュリティ機構の設定 |
エラーが出たファイルだけでなく、そのファイルまでのディレクトリも確認することが重要です。
1. 現在のユーザーを確認する
最初に、どのユーザーとしてコマンドを実行しているかを確認します。
whoami
idwhoami は現在のユーザー名を表示し、id はユーザーIDや所属グループを表示します。
例えば、あるファイルの所有者が deploy なのに、user という別のユーザーで操作している場合、ファイルの権限設定によっては読み取りや書き込みが拒否されます。
サービスや定期実行の処理でエラーが出る場合は、手動で実行したときのユーザーと、実際に処理を動かしているユーザーが異なっていないかも確認してください。
2. ファイルの権限と所有者を確認する
ls -l を使うと、ファイルの権限・所有者・グループを確認できます。
ls -l /path/to/file例えば、次のように表示されたとします。
-rw-r----- 1 deploy www-data 1024 Oct 12 09:00 config.txtこの場合、権限の意味は次のとおりです。
rw-:所有者は読み取り・書き込みができるr--:グループは読み取りができる---:その他のユーザーには権限がない
所有者は deploy、グループは www-data です。操作するユーザーが所有者でも該当グループのメンバーでもなければ、ファイルを読めない可能性があります。
権限表示の先頭にある d はディレクトリ、l はシンボリックリンクを示します。対象がファイルなのかディレクトリなのかも確認しましょう。
3. 親ディレクトリの権限を確認する
ファイル自体に読み取り権限があっても、親ディレクトリを通過できなければアクセスできません。
パスの各階層を確認するには、namei -l が便利です。
namei -l /var/www/html/config.txt出力には、ルートディレクトリから対象ファイルまでの各階層と権限が表示されます。途中のディレクトリに必要な実行権限がない場合、そこがエラーの原因になっている可能性があります。
Linuxでは、ディレクトリの x は実行というより、内部のファイルやサブディレクトリにアクセスするための「通過権限」として重要です。
そのため、ファイルだけを確認して問題が見つからない場合は、親ディレクトリまで調べてください。
4. chmodで必要な権限を設定する
スクリプトを実行しようとして Permission denied が出る場合は、実行権限が設定されていない可能性があります。
現在の権限を確認します。
ls -l script.sh自分が所有するスクリプトに実行権限を付ける場合は、次のように実行します。
chmod u+x script.shu+x は、所有者に実行権限を追加する指定です。設定後は、次のコマンドで確認できます。
ls -l script.sh実行するときは、スクリプトがあるディレクトリで次のように指定します。
./script.shなお、シェルスクリプトであれば、実行権限を変更せずにインタープリターを指定して実行できる場合もあります。
bash script.shただし、これはスクリプトを bash で実行する方法です。ほかの種類のファイルや、ファイルそのもののアクセス権の問題をすべて解決するものではありません。
5. chownで所有者を変更する
ファイルの所有者が意図したユーザーと異なっている場合は、所有者の設定を確認します。
ls -l /path/to/file管理者権限が必要で、変更する理由が明確な場合は、chown で所有者を変更できます。
sudo chown deploy:deploy /path/to/fileこの例では、ファイルの所有者とグループを deploy に変更します。deploy は環境に合わせたユーザー名・グループ名に置き換えてください。
所有者を変更すると、アプリケーションやサービスの動作に影響することがあります。 Webサーバーやデータベースなどが使用するファイルでは、必要な所有者・グループを確認してから変更してください。
また、原因を確認せずにディレクトリ全体へ再帰的な chown を実行すると、関係のないファイルまで設定が変わるおそれがあります。
6. sudoで実行すべき操作か確認する
システム設定ファイルの編集など、管理者権限が必要な操作では、一般ユーザーのまま実行するとアクセスを拒否される場合があります。
例えば、管理者権限が必要なコマンドであることを確認したうえで、次のように実行します。
sudo commandcommand は実際に実行するコマンドに置き換えてください。
ただし、エラーが出るたびに sudo を付ければよいわけではありません。 不要な管理者権限で操作すると、ファイルの所有者が意図せず変わったり、重要な設定を変更してしまったりする可能性があります。
まずは対象ファイルと操作内容を確認し、管理者権限が必要な処理かどうかを判断してください。
7. 権限が正しいのにエラーが出る場合
通常のパーミッションや所有者に問題がない場合は、追加のアクセス制御が関係している可能性があります。
ACLを確認する
ACL(アクセス制御リスト)が設定されている場合、ls -l だけでは詳しいアクセス条件を判断できないことがあります。
getfacl /path/to/filegetfacl がインストールされていない環境では、利用可能なパッケージや管理方法を確認してください。ACLの設定を変更する前に、誰にどの権限が付与されているかを把握することが大切です。
SELinuxやAppArmorを確認する
SELinuxやAppArmorなどのセキュリティ機構がアクセスを制限している場合もあります。通常のファイル権限が正しくても、ポリシーによって操作が拒否されることがあります。
SELinuxを利用している環境では、状態や関連ログを確認します。
getenforceログを調べる際は、システムの設定や利用しているディストリビューションに合った方法を使ってください。原因を特定する前に、セキュリティ機構を無効化するのは避けましょう。
8. やってはいけない権限変更
エラーを早く解決しようとして、次のような操作を実行するのは危険です。
chmod -R 777 /path/to/directory777 は、所有者・グループ・その他のユーザーに読み取り・書き込み・実行権限を与える設定です。さらに -R を付けると、指定したディレクトリ以下に広く適用されます。
その結果、意図しないユーザーがファイルを書き換えられるようになったり、アプリケーションの設定が壊れたりする可能性があります。
権限は必要な範囲に限定し、対象のユーザー・グループ・操作内容に合わせて設定しましょう。
まとめ
Linuxで Permission denied が表示された場合は、すぐに chmod や sudo を実行するのではなく、原因を順番に確認することが重要です。
whoamiとidで実行ユーザーを確認するls -lでファイルの権限・所有者を確認するnamei -lで親ディレクトリの権限を調べる- 必要な場合だけ
chmodやchownで設定を変更する - 解決しない場合はACLやSELinuxなどの制御も確認する
特にサーバー上では、権限を広げすぎるとセキュリティ上の問題につながります。エラーが発生した対象と実行ユーザーを特定し、必要最小限の変更で解決することを意識してください。
Q. Permission deniedが出たら、まず何を確認すればよいですか?
まず whoami、id、ls -l で実行ユーザーと対象ファイルの権限・所有者を確認します。ファイルに問題がなければ、namei -l で親ディレクトリも調べてください。
Q. chmod 777にすれば解決できますか?
アクセスできるようになる場合はありますが、必要以上の権限を与えるため推奨できません。原因を確認し、必要なユーザーやグループに限定して権限を設定しましょう。
Q. sudoを付けてもPermission deniedが出るのはなぜですか?
通常のファイル権限以外に、親ディレクトリ、読み取り専用のファイルシステム、ACL、SELinuxやAppArmorなどが関係している可能性があります。エラーメッセージとログを確認して原因を切り分けてください。
