29.ファイルのアクセス権限を変更しよう。chmodコマンド
ナックス「はい。というわけで本日はアクセス権限の話」
デビー君「アクセス権限?」
ナックス「そうです。実はLinuxでは、あるユーザーに対してそのファイル『読める』『書き込める』『実行できる』の3種類の権利を許可したり、または拒否したりできます」
ナックス「つまり以前のエロ画像を自分だけが読めるように設定すれば、誰にもエロ画像を見られずに済むという訳です」
デビー君「なるほどー」
ナックス「ほんじゃまー、早速CUI環境を立ち上げてください」
デビー君「立ち上げました」
ナックス「とりあえずnanoエディタで適当なファイルを作成しますか。えーっと、ファイル名access.txtで、中身に『あいうえお』とでも書いて保存していただけますか」
ナックス「ちなみにnanoエディタは、nanoと記入するだけで起動することもできますが、作成したいファイル名がすでに決まっているのであれば、以下のようにそれを指定しながらnanoを起動することもできます」
$ nano access.txt
あいうえおと書く
Ctrlキーを押しながらOキーで保存。
Ctrlキーを押しながらXキーで終了。
デビー君「中身に『あいうえお』っていう文字が書かれたaccess.txtというファイルが出来ました」
ナックス「じゃあ、ls -lコマンドで見てみてください」
$ ls -l -rw-r--r-- 1 username username 16 2010-01-09 18:12 access.txt
ナックス「ホームディレクトリで作業しているので、他のファイルやディレクトリの情報も出るかと思いますが、今回はとりあえずaccess.txtの情報にだけ注目してください」
デビー君「以前やったls -lコマンドだね。lsコマンドよりも情報がいっぱい出る、っていうやつ」
ナックス「そうですさて、今回は一番左に注目」
-rw-r--r--
デビー君「なんだこれは?」
ナックス「これこそが『このファイル(またはディレクトリ)に対してどのようなアクセス権限が与えられているか』を示すものなのです」
デビー君「へー。どういう見方をするの?」
ナックス「まず、一番左の-。これは、『それがファイルであるか。またはディレクトリであるか』を示しています。それがディレクトリであった場合は、-ではなく、dと表示されます。例えばディレクトリの場合は」
drwxr-xr-x
ナックス「というアクセス権限になっていることが多いのですが、一番左がdになっているのがお分かりになるでしょうか?」
デビー君「うん。確かにdになってるね」
ナックス「でしょう。ですが、アクセス権限の核となる箇所は」
-rw-r--r--
ナックス「の部分の」
rw-r--r--
ナックス「の箇所です。これが権限がどのようになっているかを表している本体です」
デビー君「な、なんだか難しそうだな……」
ナックス「まず権限には3種類あります。『ファイルを見る権利・r』『ファイルに書き込む権利・w』そして、『ファイルを実行する権利・x』です」
デビー君「たしかに」
rw-r--r--
デビー君「を見ると、rとかwとか書いているけど……」
ナックス「そして、」
rw-r--r--
ナックス「は、実際にはこのように見ます」
rw- r-- r--
デビー君「ん?なんだか間が空いたね」
ナックス「これの一番左が『そのファイルを所有している人の権限』を表しています。rw- のやつですね」
ナックス「つまり、このファイルを所有している人はそのファイルに対して『読む権利』と『書き込む権利』を持っていることになります」
ナックス「次に真ん中のr--。これは『そのファイルを所有しているグループの権限』を表しています。この場合はグループは『読む権利』しか持っていません」
ナックス「最後に一番右のr--。これはそのファイルの所有者でもないし、所有グループでも無い人、つまり『その他の人の権限』を表しています。つまり、その他の人は『ファイルを読む権利』しか持っていません」
デビー君「な、なんだか話が難しい」
ナックス「そうなんですよね。話が難しいよね。ごめんなさい。頑張ってついてきて。まずls -lを実行したときの結果をもう一度見てみてほしい」
-rw-r--r-- 1 username username 16 2010-01-09 18:12 access.txt
ナックス「ここにusernameが2箇所書かれている。おそらく皆の場合は自分のLinuxのユーザー名が表示されているはずだ」
デビー君「うんうん」
ナックス「実はこれはそのファイルの所有者と所有グループを表示しているんだ」
ナックス「左側のusernameがそのファイルの所有者名。右側のusernameがそのファイルの所有グループ名」
ナックス「だから、中には右側のusernameが、自分のLinuxのユーザー名ではなく、なにやら他の名前が表示されている人もいるかもしれない」
デビー君「ちょ、ちょっと待って。『所有グループ』って何?」
ナックス「Linuxだと、一般ユーザーを色々追加できることは教えたよね?そのユーザーの中のある集団をまとめて、ある一つのグループを作ることが出来る。うーん、ちょっとわかりやすく説明すると」
-rw-r----- 1 ジャイアン ジャイアンの家族 16 2010-01-09 18:12 ジャイアンが作った歌
ナックス「例えば歌が好きなジャイアンが、新曲の歌詞を書いたとしよう。この場合、所有者はジャイアンだ。ジャイアンは家族には歌の歌詞を見てほしい。でも、勝手には書き換えないでほしいから、rの権限。つまり『そのファイルを読むための権限』だけ与える。でも、その他のドラえもんやのび太には、恥ずかしくて見せたくない。だから『その他の人』には、ファイルを読むための権利も書き込む権利も与えない」
デビー君「あー。なるほど、ちょっと分かる」
ナックス「上の例だと、グループ名は『ジャイアンの家族』と言うことになる。ある一人のユーザーは、同時に複数のグループに所属することが出来る。なので、例えば」
ジャイアンのお母さんが所属しているグループ ジャイアンの家族 ママさんバレーチーム 商店街活性化委員会
ナックス「みたいなことも出来る」
デビー君「ふむふむ」
ナックス「『新しいグループを作り、そこにユーザーを追加する』『そのファイルを所有するグループを設定する』とか言う方法は、後日機会があればやるけども、まだ当分先の予定なので、興味がある方は他のサイトなどを参考にしてほしい」
ナックス「さて、実際に権限を変更してみよう。権限を変えるにはchmodコマンドを使う。とりあえず、実際の書き換え方法の例をいくつか列挙してみよう」
$ chmod u+x ファイル名[またはディレクトリ名](そのファイルを『所有ユーザー』が実行できるようにする)
$ chmod g+w ファイル名[またはディレクトリ名](そのファイルを『所有グループ』が書き換えられるようにする)
$ chmod o+r ファイル名[またはディレクトリ名](そのファイルを『その他の人』が読めるようにする)
$ chmod u-r ファイル名[またはディレクトリ名](そのファイルを『所有ユーザー』が読めないようにする)
$ chmod g-x ファイル名[またはディレクトリ名](そのファイルを『所有グループ』が実行出来ないようにする)
$ chmod o-w ファイル名[またはディレクトリ名](そのファイルを『その他の人』が書き込めないようにする)
ナックス「所有ユーザーをu(おそらくuserのu)。所有グループをg(おそらくgroupのg)。その他をo(おそらくotherのo)で表現する」
ナックス「権限は足し算や引き算みたいに指定できる。単純に考えて」
+r(読み込み権限を与える) +w(書き込み権限を与える) +x(実行権限を与える) -r(読み込みを不許可にする) -w(書き込みを不許可にする) -x(実行を不許可にする)
ナックス「と覚えれば良い。例えば、+rwや-rwxなどで一度に権限を変更することも出来る」
デビー君「な、なるほど。ちょっと難しいな……」
ナックス「まぁ、早速やってみよう。今ファイルを作成した僕達は、ファイルの所有ユーザーだ。とりあえず、『グループ』と『その他』の権限を全部取り除こう」
$ chmod g-r access.txt
$ ls -l -rw----r-- 1 username username 16 2010-01-09 18:12 access.txt
$ chmod o-r access.txt
$ ls -l -rw------- 1 username username 16 2010-01-09 18:12 access.txt
デビー君「おー。グループとその他のrが消えたね」
ナックス「そうですね。さて、でもこれじゃあアクセス権限がどうなったのか実感が沸きませんね。というわけで、自分自身の権限も全て無くしてしまいましょう」
$ chmod u-rw access.txt
$ ls -l ---------- 1 username username 16 2010-01-09 18:12 access.txt
デビー君「権限が全く設定されていなくなったね」
ナックス「そうです。これで、誰もこのファイルに手出し出来なくなりました。試しにnanoコマンドでaccess.txtを開いてみましょう」
$ nano access.txt
デビー君「nanoは起動したけど、「あいうえお」っていう文字を書いたはずなのに、何も表示されないね。下の方に[ Error reading access.txt: 許可がありません ]って表示されてる」
ナックス「そうですね。ではCtrlキーを押しながらXキーを押してnanoを終了して、今度は読み込み権限だけ自分に付加してみましょう」
$ chmod u+r access.txt
$ ls -l -r-------- 1 username username 16 2010-01-09 18:12 access.txt
ナックス「この状態でnanoでaccess.txtを開いてみましょう」
$ nano access.txt
デビー君「今度は文字が表示されたけど下の方に[ Read 1 line ( Warning: No write permission) ]って表示されているね」
ナックス「そうですね。Warning: No write permissionは日本語に訳すと『警告:書き込みの許可がありません』という意味になる。試しに文字を書いてごらん」
デビー君「あれ?文字が書けちゃうよ?」
ナックス「じゃあCtrlキーを押しながらOキーを押して、普通に保存してみよう」
デビー君「あれ?保存が無事にできたと思ったら、エラーが出てる![ Error writing access.txt: 許可がありません ]だって!」
ナックス「そうです。書き込み権限が無いので、そのファイルを書き換えることができないのです。Ctrlキーを押しながらXキーを押してnanoを終了してください」
デビー君「げ!今まで見たことのない画面になった……」
ナックス「いえいえ。これはむしろnanoエディタの親切心。nanoは、ファイルを書き換えたのに保存をせずに終了しようとすると、『書き換えたのに保存せずに終了するの?保存しようか?』と聞いてきています。普通はここで、Yを押せば保存して終了。Nを押せば保存しないで終了。Ctrlキーを押しながらCを押せばnanoの終了をキャンセル出来るのですが、書き込み権限が無いので、ここでYを押しても保存出来ません(余裕があれば試してみてください)。ここはNを押して保存せずに終了しましょう」
ナックス「さて、最後に以下のコマンドで書き込みも出来るようにしておきましょう」
$ chmod u+w access.txt
$ ls -l -rw------- 1 username username 16 2010-01-09 18:12 access.txt
ナックス「これで次回からまた元通りにaccess.txtを読んだり書き換えたりできます」
デビー君「なるほど」
ナックス「さて。アクセス権限はファイルだけでなくディレクトリにも設定できます。試してみてください」
ナックス「そうそう。以前のエロ画像も所有グループとその他の権限をなくして、まぁこんな感じ」
-rw-------
ナックス「にでもすれば、デビー君のログインユーザー名とパスワードでLinuxにログインしない限り、中身を見られる心配は無いです」
デビー君「ふーん。でもひとつ疑問が。お母さんが僕のファイルをchmodコマンドで権限を変更すれば結局見られちゃうんじゃないの?」
ナックス「いえいえ。ファイルの権限を変えることが出来るのはそのファイルの所有者とrootユーザーのみです。あの画像の所有者はデビー君なので、お母さんがchmodコマンドで権限を変えようとしてもエラーが出て権限の変更が出来ません」
デビー君「なるほど。うーん、でも今回は難しかったなぁ……」
ナックス「ちなみにアクセス権限の変更のことは『パーミッションの変更』と言います。『パーミッション』は『許可』という意味で、『パーミッション変更してアクセスできるようにしておいてー』などと言うように使います」
ナックス「アクセス権限の考え方はLinux初心者ユーザーには難しい概念だと思います。私も初めはちんぷんかんぷんでした。ディレクトリのパーミッション変更も結構、『あれ?この設定でディレクトリの中身が見られなくなるの?』とか『この設定でこのディレクトリの中で新規ファイルが作成できないの?』などなど苦戦しました」
デビー君「へー。じゃぁ、ディレクトリのパーミッションの変更の仕方も解説してよ」
ナックス「嫌です」
デビー君「え?なんで」
ナックス「ディレクトリに限らず、ファイルに関してもパーミッションの変更は『習うより慣れろ』の方が覚えやすいです。論理的な話を聞くよりも自分で試してみてください」
デビー君「はーい。あれ?そういえばファイルを実行する権限、xについては今回ほとんどしていないね」
ナックス「そうですね。実行権限は作成したプログラムなどに対して付与する権限なのですが……。じゃぁ、次回は簡単なシェルプログラミングでも作りましょうか(30.シェルスクリプトでプログラミングする前の予習。echoコマンド。exprコマンド。)」
デビー君「ぷ、プログラムを作成する……だと?」