はじめに
Permission denied !!
コマンド実行時にこんなメッセージが出ると、とりあえずコマンドの前にsudo(管理者実行コマンド)を追加する私でしたが、どうやら違う解決策もあるとのことで、今回はその一つであるchmodコマンドについて少しまとめてみようと思います。
この記事がおすすめな人
・Linux初心者の方
・「Permission denied」にはとりあえずsudoコマンドを使っている方
・chmod sudoどちらも"権限変更"用のコマンドというのは知っているけど、何が違うのだろう」と思っている方
この記事でお話すること
sudoとchmodどちらも権限の変更に関するコマンドとなりますが、違いを簡単にすると下記の通りとなります。
chmod |
sudo |
|
|---|---|---|
| 説明 | ファイル自体の権限を各ユーザー(所有者、グループ、その他)に対して変更 | コマンドを"管理者権限"で実行 |
| 使い方 | メインのコマンドの前に事前に実行 | メインのコマンドの書き出しにsudoを付けて同時に実行 |
| 効力 | 永続的(1回やればOK) | その1回の実行のみ |
| タイミング | 「Permission denied」と出たとき | 「Permission denied」と出たとき |
1. chmodとは?
『CHange MODe』の略で、ファイル権限の変更を行うLinuxコマンドです。下記の方が分かりやすくまとめてくださっていたので、こちらをご参照ください。
使い方としては、下記のようにメインのコマンドを実行する前に「ファイル権限」の変更を行います。
chmod +x build.sh #ファイルに「実行権限(Executable)」を追加する
./build.sh #正常に実行される
2. 「ファイル権限」とchmodの関係について
本題である「chmodとsudoの関係について」を触れる前に、前提知識で必要になる『ファイル権限』について少し説明しようと思います。
Linuxでは、Windows等と同じように"ファイルにアクセスできる人を制限する機能"となる『ファイル権限』が存在します。各ファイルに設定されたファイル権限は、下記のコマンドで確認できます。
ls -l <ファイル名>
# 「-rwxr--r-- 1 所有者 グループ 865 日付 ファイル名」のように出力される
出力された情報の「-rwxr--r--」が"指定したファイルの権限"になります。もう少し詳しく見てみましょう。
上記のように、実は区分分けすることができます。左から順番に説明した表を作成してみました。
| パーツ | 説明 |
|---|---|
- |
ls -lコマンドで指定した種類を表します。今回は「ファイル」を指定したので-と表示されており、他にも「ディレクトリ」を指定した場合はdと表示されます。 |
rwx(所有者) |
「所有者」用のファイル権限を表します。左から順にr(read) w(write) x(execute)から持っている権限が記入されます。権限がない部分は-と表示されます。rwxと表示されているので、今回はすべての権限を持っていることを意味しています。 |
r--(グループ) |
「グループ」用のファイル権限を表します。「所有者」と同様に左から順にr(read) w(write) x(execute)から持っている権限が記入されます。権限がない部分は-と表示されます。r--と表示されているので、今回はr(read)のみ権限を持っていることを意味しています。 |
r--(その他) |
「その他(ユーザー)」用のファイル権限を表します。「所有者」「グループ」と同様に左から順にr(read) w(write) x(execute)から持っている権限が記入されます。権限がない部分は-と表示されます。r--と表示されているので、今回はr(read)のみ権限を持っていることを意味しています。 |
「所有者」「グループ」「その他(ユーザー)」に関する説明は今回は割愛しますが、『ユーザーの種類によってファイル権限が分かれる』ということを覚えておいてください。
3. chmodとsudoの関係について
「sudo」について少し説明
sudoとは:『SuperUser Do』の略で、その後に続くコマンドを「管理者(root)権限」での実行に変更するコマンドです。『管理者』は『一般ユーザー』よりも高い権限を持つことが一般的です。
例)
apt-get update #『Permission denied』(管理者権限が必要)と表示される
sudo apt-get update #正常に実行される
さて、本題です。まずはsudoが必要なファイルであるetc/hostsのファイル権限を確認してみましょう。
ls -l /etc/hosts
# 「-rw-r--r-- 1 root root 427 日付 /etc/hosts」のように出力される
出力されたファイル権限と所有者を図に表すと、下記の通りとなります。 ※同名(root)グループは権限が少ないためひとまず除きます
「root」は管理者を示すため、sudoでコマンドを実行すると、etc/hostsに対して「読み込みr・書き込みw」の操作ができます。
逆にsudoを付けずにコマンドを実行すると、その他ユーザー(一般ユーザー)はetc/hostsに対して「読み込みr」しかできません。
次にchmodコマンドを使って、その他ユーザー(一般ユーザー)でも書き込みができるように権限を追加してみましょう。下記のコマンドで権限の追加を行います。
sudo chmod o+w /etc/hosts
ls -l /etc/hosts
# 「-rw-r--rw- 1 root root 427 日付 /etc/hosts」のように出力される
その他ユーザー(一般ユーザー)にwが追加されたことで、sudoを使わずとも「読み込みr・書き込みw」の操作ができるようになりました。
つまり『chmodで、管理者や一般ユーザーを含む"権限"を設定』した後、『必要に応じてsudoで"管理者権限"を扱う』というのが「chmodとsudoの関係」になります。
4. まとめ
冒頭でも少し説明しましたが、改めてsudoとchmodの違いを表にすると下記の通りとなります。
chmod |
sudo |
|
|---|---|---|
| 説明 | ファイル自体の権限を各ユーザー(所有者、グループ、その他)に対して変更 | コマンドを"管理者権限"で実行 |
| 使い方 | メインのコマンドの前に事前に実行 | メインのコマンドの書き出しにsudoを付けて同時に実行 |
| 効力 | 永続的(1回やればOK) | その1回の実行のみ |
| タイミング | 「Permission denied」と出たとき | 「Permission denied」と出たとき |
もしコマンドを実行して、「Permission denied」と表示された場合、sudoコマンドを用いて管理者権限で実行し、それでも「Permission denied(もしくはcommand not found)」と表示される場合はchmodコマンドで「ファイルの権限」を確認すると解決に繋がるかもしれません。
また、sudoはコマンド毎に一時的に管理者権限を利用するのに対し、chmodは永続的に権限を付与するため、運用の際はしっかりと検討する必要があるかと思われます。
参考URL




