chmodはファイルやフォルダのパーミッション、アクセス権限を設定するLinuxコマンドだ。
パーミッションはLinuxサーバーを設定していれば必ず意識しなければならないものだ。
このページではchmodコマンドの詳細をお伝えする。また、chmodの操作方法を通してパーミッションについてもまとめた。
パーミッションについて
パーミッションとは、Linuxを含むUnixで扱われるファイルやディレクトリのアクセス権の設定のことだ。
ファイルやディレクトリは扱う所有者、グループ、その他の3種類毎に、実行できるか、書き込み変更ができるか、読み込みができるか、という3種類のアクセスの可・不可を設定できる。
例えば、あるディレクトリの実行ファイルtest.shは、実行は所有者にしかできない。内容の変更は所有者とグループにはできる。その他のユーザーにはすべてのアクセスを禁止するというように、1つのファイルやディレクトリに関して複数の設定ができる。
設定値
設定値は所有者、グループ、その他の順にそれぞれ0から7の整数で表わされる。
それぞれの数字は、以下の設定値を加算して求める。
読み込みができる=4
書き込み、変更ができる=2
実行ができる=1
例えば、所有者には書き込みと読み込みだけさせて、所属グループには読み込みだけさせたい場合には、
644
となる。
実践ファイルの作成
今回は、流れに沿って実践できるように構成した。コマンドもすべて用意している。
はじめに次のコマンドで必要なファイルを作成しよう。
1 2 3 4 5 |
mkdir work mkdir work/data echo 'echo test' > work/test01.sh echo -e 'Apple\n1200\nAomori' > work/data/apple.dat echo -e 'Orange\n1000\nEhime' > work/data/orange.dat |
パーミッションの確認
作成したファイルの現在のパーミッションを確認してみよう。
現在のパーミッションは-lオプションを付けたlsコマンドで見ることができる。
$ ls -l work
1 2 |
ls -l work ls -l work/data |
dataフォルダの表示内容を確認してみよう。
一番左の項目がdrwxrwxr-xとなっている。
左の1文字がファイルかディレクトリかシンボリックリンクかを表わしている。
次の3文字が所有者のアクセス権限だ。
rが読み取り可能、wが書き込み可能、xが実行可能ということで、所有者はdataフォルダに対してはすべての権限を与えられている。
次の3文字がグループユーザーのアクセス権限でこれもすべての権限が与えられている。
最後の3文字がその他ユーザーのアクセス権限だ。
rが読み取り可能、wが書き込み可能、-は権限なしなので、読み書きはできるが、実行はできないという設定だ。
シェルファイル
test01.shは、testと言う文字を画面出力するシェルファイルで実行することができる。
シェルファイルの拡張子は慣例的にshだ。
シェルファイルの実行は、./に続けてファイル名を入力する。
$ ./ファイル名
では実際にworkフォルダ内のtest01.shを実行してみよう。
$ ./work/test01.sh
1 |
./work/test01.sh |
許可がありませんというメッセージが表示され、実行できなかった。
今、所有者としてtest01.shにアクセスしているが、test01.shの所有者のアクセス権限は読み取りと書き込みだけが可能で実行可能ではないからだ。
chmodコマンドの基本
前置きが長くなったが、chmodコマンドについてお伝えしていく。
chmodコマンドの基本
ではtest01.shをchmodコマンドで実行可能に変更してみよう。
パーミッションを変更するコマンドは次の通りだ。
$ chmod アクセス権限 ファイル名
workフォルダ内のtest01.shのアクセス権限をすべての利用者がすべての権限を持つように設定する場合は、次の通りだ。
$ chmod 777 work/test01.sh
test01.shにすべての利用者に対してすべての権限を与えた。
確認してみよう。
$ ls -l work/test01.sh
アクセス権限がrwxrwxrwxとなり、すべての利用者がすべての権限を持っていることがわかった。
では、実際に実行してみよう。
$ ./work/test01.sh
testという文字が表示され、実行された。
1 2 3 |
chmod 777 work/test01.sh ls -l work/test01.sh ./work/test01.sh |
chmodコマンドで利用者とアクセス権限を指定する方法
アクセス権限を660だったものを777などの数値指定をすると、その他ユーザーに読み取りのみの権限を付けたかった場合、実行と書き込みの権限まで付いてしまう。
今設定している値から次の書式で必要な箇所だけ変更することができる。
$ chmod ユーザー 追加か解除か アクセス権限 ファイル名
ユーザーは、所有者がu、グループがg、その他ユーザーはo、すべてのユーザーはaで設定する。
続いて追加の場合は+、解除の場合は-、その値にしたい場合は=を記述する。
最後のアクセス権限は、実行許可ならx、書き込み許可ならw、読み取り許可ならrを設定する。
workフォルダ内のtest01.shに現在のアクセス権限のその他ユーザーの権限から実行権限を解除したい場合は次の通りである。
$ chmod o-x work/test01.sh
確認してみよう。
$ ls -l work/test01.sh
アクセス権限がrwxrwxrw-となり、その他ユーザーの実行権限が解除されていることがわかった。
1 2 |
chmod o-x work/test01.sh ls -l work/test01.sh |
アクセス権限は、重複して記述できる。
例えば、すべての権限を追加した上で、グループには実行権限を解除、その他ユーザーの実行と書き込み権限を解除したい場合は、次のように指定する。
$ chmod a=xwr,g-x,o-xw work/test01.sh
確認してみよう。
$ ls -l work/test01.sh
アクセス権限がrwxrw-r--となり、すべての権限が許可された上で、グループには実行権限を解除、その他ユーザーの実行と書き込み権限を解除されていることがわかった。
1 2 |
chmod a=xwr,g-x,o-xw work/test01.sh ls -l work/test01.sh |
chmodコマンドの便利なオプションたち
コマンドの一覧
後から詳細をご紹介するが、まずは一覧で見てみよう。
オプション-v ,--verbose
コマンド実行の診断結果を表示する
オプション-c ,--changes
コマンドの実行結果、変更があった場合のみ、結果を表示する
オプション-R ,--recursive
複数ファイルに対して設定する場合、ディレクトリ内も設定対象とする
-vオプション(--verbose):コマンド実行の診断結果を表示する
-vオプション(--verboseオプション)はchmodコマンドの結果を表示するコマンドだ。
パーミッションが正常に変更されたかが確認できる。
$ chmod -v アクセス権 ファイル名
workフォルダ内のtest01.shのアクセス権限をすべての利用者がすべての権限を持つように設定し、結果を表示する場合は、次の通りだ。
$ chmod -v 777 work/test01.sh
どのように変更されたかが表示される。
1 |
chmod -v 777 work/test01.sh |
もう一度同じコマンドを実行してみよう。
$ chmod -v 777 work/test01.sh
変更がない場合は、保留されましたと表示される。
1 |
chmod -v 777 work/test01.sh |
-cオプション(--changes):コマンドの実行結果、変更があった場合のみ、結果を表示する
-cオプション(--changesオプション)は-vオプション同様、chmodコマンドの結果を表示するコマンドだ。ただし、コマンド実行の結果、変更がなければ結果は表示しない。
$ chmod -c アクセス権 ファイル名
workフォルダ内のtest01.shのアクセス権限を管理者とその他ユーザーがすべての権限を持つように設定し、結果を表示、しかし変更がない場合は結果を表示しないと設定する場合は、次の通りだ。
$ chmod -c 707 work/test01.sh
どのように変更されたかが表示される。
1 |
chmod -c 707 work/test01.sh |
もう一度同じコマンドを実行してみよう。
$ chmod -c 707 work/test01.sh
変更がない場合は、結果は表示されない。
1 |
chmod -c 707 work/test01.sh |
-Rオプション(--recursive):複数ファイルに対して設定する場合、ディレクトリ内も設定対象とする
chmodコマンドは、ファイル名にワイルドカードを指定することで複数ファイルに対してパーミッションを設定することができる。
-Rオプション(--recursiveオプション)は、複数ファイルにパーミッションを設定する場合、ディレクトリ内も設定対象とする。
$ chmod -R アクセス権 ファイル名
まず、-Rオプション(--recursiveオプション)を設定せずに-vオプション(--verboseオプション)を使ってどのファイルが変更されているか確認してみよう。
workフォルダ内ファイルとディレクトリを対象とし、確認を行いながらパーミッションを設定するコマンドは次の通りだ。
$ chmod -v 755 work/*
ディレクトリdataとtest01.shの1ファイルのみが対象となった。
1 |
chmod -v 755 work/* |
今度は、ディレクトリの中も含めて変更する。
$ chmod -vR 755 work/*
ディレクトリdataとtest01.shの他にもディレクトリdataの中の2ファイルも対象となった。
1 |
chmod -vR 755 work/* |
関連項目
最後にchmodコマンドに関連して、基本的なファイルの権限の変更のコマンドも紹介しておく。
chgrp
ファイルやフォルダのアクセスできるグループを設定する。
chown
ファイルやフォルダの所有者を設定する。
まとめ
chmodコマンドはLinuxを使う上で、かなり早めに覚えなければいけないコマンドだろう。詳細を含めてまとめてみたが、いかがだっただろうか?
Webにサービスを公開する、複数人でサーバーを管理するときなどには、知らなくてはエンジニアとして生きていけないコマンドだ。
ぜひ、オプションなども含めて、覚えてしまおう。
> 実行ができる=4
> 書き込み、変更ができる=2
> 読み込みができる=1
設定値の4と1が逆ではないでしょうか?
おおっと、失礼いたしました。修正いたします。