第2章 2-4 / ユーザーと権限 ― yumiを迎える

パーミッションを読む

このページで叩くコマンドと到達点

前提:2-3が完了し、ubuntuユーザーのホームディレクトリ(~)にいる状態から始めます(~/practiceという空ディレクトリが存在しています)。ここまで何度も目にしてきたdrwxr-x---のような記号の意味を、今回は1文字ずつきちんと読み解きます。~/practiceの中に自分でファイルを作り、ls -lで権限を確認し、chmodを数字と記号の両方の書き方で使いこなせるようになるのが到達点です。実行権を落としたスクリプトが動かなくなる失敗も、あえて体験します。

SET 1 ― rwxrwxrwxを読む

ubuntu@lightsail: ~
  1. $cd ~/practice
  2. $ls -la
  3. $touch note.txt
  4. $mkdir work
  5. $ls -l
  6. -rw-rw-r-- 1 ubuntu ubuntu 0 Jul 3 09:30 note.txt
  7. drwxrwxr-x 2 ubuntu ubuntu 4096 Jul 3 09:30 work
  8. $touch script.sh
  9. $ls -l script.sh
  10. $stat note.txt
  11. $stat work
  12. $whoami
解説 ― SET 1 で何をしたか

1行目で1章から存在する練習用ディレクトリ~/practiceに移動し、2行目のls -laでまだ空であることを確認します。3行目のtouchでファイル、4行目のmkdirでディレクトリを作ります。5行目のls -lで表示される出力例の先頭10文字、たとえば-rw-rw-r--が今回の主役です。

この10文字は「1文字目=種別」「残り9文字=3文字ずつ3グループ」という構造になっています。1文字目の-は普通のファイル、dはディレクトリ※1を意味します。workの行がdから始まっているのはそのためです。続く9文字は、左から順に「所有者(owner)」「所有グループ(group)」「その他(other)」という3つの立場に対する権限を、それぞれrwx(read=読み取り、write=書き込み、execute=実行)の3文字で表しています。権限がなければその位置は-になります。

note.txt-rw-rw-r--を分解すると、「所有者=rw-(読み書き可・実行不可)」「グループ=rw-(同じく読み書き可)」「その他=r--(読み取りのみ)」となります。touchで作った直後の新規ファイルは、デフォルトでこのような権限になるのがUbuntuの標準設定です。一方workディレクトリのdrwxrwxr-xを見ると、所有者とグループはrwx(実行権あり)なのに対し、その他はr-xとなっています。ディレクトリにおける実行権(x)は「そのディレクトリの中に入れるかどうか」を意味するという点は、ファイルの実行権とは違う特別な意味なので覚えておいてください。

6行目のtouch script.shで、後のSET 3で実行権を体験するためのファイルを先に作っておきます。7行目のls -l script.shで確認すると、こちらもやはりnote.txtと同じ-rw-rw-r--で、拡張子が.shだからといって自動的に実行権が付くわけではないことがわかります。

89行目のstatは、ls -lよりもさらに詳しくファイルの情報(権限を8進数と記号の両方の表記で、さらにアクセス日時なども)を表示するコマンドです。次のSET 2で使う数字指定のchmodの意味を理解する助けになるので、余裕があれば出力を眺めてみてください。最後の10行目のwhoamiで、ここまで作った全てのファイル・ディレクトリの所有者が自分(ubuntu)であることを再確認しておきます。

POINT

rwxの並びは「所有者・グループ・その他」の順で固定です。省略せずに「所有者はどうか、グループはどうか、その他はどうか」と3回に分けて読む癖をつけると、長い記号の羅列に惑わされなくなります。

ゆみちゃん
ゆみ

あたしも最初はrwxrwxrwxを見た瞬間に「うわ、暗号だ…」ってなったよ。でも実は3文字×3セットってわかれば全然怖くないよ! 「自分・仲間・その他大勢」の3人に、それぞれ「読む・書く・実行する」の許可を出すか出さないか決めてるだけ。3人分×3個の質問、合計9個のYES/NOだと思えば案外シンプルでしょ?

SET 2 ― chmodで数字指定する

ubuntu@lightsail: ~/practice
  1. $chmod 644 note.txt
  2. $ls -l note.txt
  3. -rw-r--r-- 1 ubuntu ubuntu 0 Jul 3 09:30 note.txt
  4. $chmod 755 work
  5. $ls -ld work
  6. drwxr-xr-x 2 ubuntu ubuntu 4096 Jul 3 09:30 work
  7. $chmod 700 script.sh
  8. $ls -l script.sh
  9. -rwx------ 1 ubuntu ubuntu 0 Jul 3 09:31 script.sh
  10. $chmod 664 work/note2.txt
  11. chmod: cannot access 'work/note2.txt': No such file or directory
  12. $touch work/note2.txt
  13. $chmod 664 work/note2.txt
  14. $chmod 600 note.txt
解説 ― SET 2 で何をしたか

1行目のchmod(change modeの略)は、パーミッションを変更するコマンドです。644のような3桁の数字を渡す書き方を数字指定と呼びます。仕組みはこうです。r=4、w=2、x=1という数値が割り当てられていて、与えたい権限の数値を足し算します。たとえば「読み書き可・実行不可」なら4+2=6、「読み取りのみ」なら4です。この1桁を「所有者」「グループ」「その他」の順に3つ並べたものが3桁の数字になります。644は「所有者=6(rw-)」「グループ=4(r--)」「その他=4(r--)」という意味で、2行目のls -lの出力例-rw-r--r--と一致していることを確認してください。

3行目のchmod 755 workは、実行権(ディレクトリなので「中に入れる権利」)を全員に与えつつ、書き込み(4+2+1=7)は所有者のみに許可する定番の組み合わせです。ディレクトリや実行可能なスクリプトによく使われる設定で、4行目の出力例drwxr-xr-xと数字の対応を見比べておきましょう。5行目のchmod 700 script.shは、所有者だけが読み書き実行でき、グループもその他も一切触れない、最も閉じた設定の1つです。個人用の秘密のスクリプトなどに使います。

7行目、まだ存在しないwork/note2.txtchmodをかけようとすると、出力例のようにNo such file or directoryで失敗します。chmodはあくまで既存のファイルの権限を変えるだけで、ファイルそのものを作ってはくれません。8行目のtouchで先にファイルを作ってから、9行目で改めてchmod 664をかけると成功します。この一連の流れで、「ファイルの実体」と「ファイルの権限設定」が別々の操作であることを体感しておきましょう。

10行目のchmod 600 note.txtは、所有者のみ読み書き可・実行不可(rw-------)にする設定で、次のSET 3で「実行権がないとどうなるか」を確認するための準備です。

数字権限記号意味
7rwx読み取り+書き込み+実行(すべて許可)
6rw-読み取り+書き込み(実行は不可)
5r-x読み取り+実行(書き込みは不可)
4r--読み取りのみ
0---すべて不可
POINT

よく使う組み合わせは755(ディレクトリ・実行ファイル向け:自分だけ書き込み可)・644(一般ファイル向け:自分だけ書き込み可、閲覧はみんなOK)・700(自分専用、他人は一切触れない)の3つです。まずこの3つを覚えれば実務の9割はカバーできます。

SET 3 ― chmodで記号指定する・実行権を体験する

ubuntu@lightsail: ~/practice
  1. $echo 'echo "hello from script"' > test.sh
  2. $ls -l test.sh
  3. -rw-rw-r-- 1 ubuntu ubuntu 27 Jul 3 09:35 test.sh
  4. $./test.sh
  5. bash: ./test.sh: Permission denied
  6. $bash test.sh
  7. $chmod u+x test.sh
  8. $ls -l test.sh
  9. -rwxrw-r-- 1 ubuntu ubuntu 27 Jul 3 09:35 test.sh
  10. $./test.sh
  11. hello from script
  12. $chmod go-w test.sh
  13. $ls -l test.sh
  14. $cd ~
解説 ― SET 3 で何をしたか

1行目は3-3で詳しく扱うecho>(リダイレクト)の組み合わせで、1行だけのミニスクリプトを持つファイルを作っています。ここでは「中身のあるファイルを1行で作れる」程度の理解で構いません。2行目のls -lを見ると、touch直後と同じく-rw-rw-r--、実行権(x)はどこにも付いていません。

3行目、./test.shのように先頭に./を付けてこのファイルを実行しようとすると、出力例のとおりPermission deniedで拒否されます。中身はただのテキストなのに実行できないのは、ファイルの種類にかかわらず実行権(x)が立っていないファイルは、Linux上では「プログラムとして動かしてよい」と認められていないためです。1章でcdlsといったコマンドが何の断りもなく実行できていたのは、それらのプログラムファイルにあらかじめ実行権が付与されていたからなのです。4行目のようにbash test.shと、bash自体にファイルを読み込ませる形であれば実行権がなくても動きますが、これは「test.shを実行している」のではなく「bashがtest.shの中身を読んでいる」だけの回避策です。

5行目のchmod u+x test.shが、今回のもう1つの主役である記号指定のchmodです。数字指定が「3桁まとめて置き換える」のに対し、記号指定は「誰の」「何を」「どうするか」を個別に指定して変更を加える書き方です。u(user=所有者)に対して+x(実行権を追加)する、という意味になります。6行目で確認すると、所有者の部分だけがrwxに変わり、グループとその他はそのまま(元のrw-r--)であることがわかります。数字指定は3桁すべてを書き直す必要がありますが、記号指定は変更したい部分だけをピンポイントで触れるのが利点です。7行目で改めて./test.shを実行すると、今度は出力例のとおりhello from scriptが返り、無事にスクリプトとして動作したことがわかります。

8行目のchmod go-w test.shも記号指定で、g(group)とo(other)をまとめて指定し、-w(書き込み権を削除)しています。u(所有者)・g(グループ)・o(その他)・a(全員)というアルファベットと、+(追加)・-(削除)・=(完全に置き換え)という記号を組み合わせることで、細かい調整が自在にできます。9行目のls -lで、実行権(x)はそのままに書き込み権だけがグループ・その他から消えていることを確認します。最後の10行目のcd ~でホームディレクトリに戻り、このページを締めくくります。

記号意味
u所有者(user)
g所有グループ(group)
oその他(other)
a全員(all = u+g+o)
+権限を追加する
-権限を削除する
=指定した権限だけに置き換える
ゆみちゃん
ゆみ

Permission denied./test.shが動かなかったとき、「あれ、コマンド打ち間違えたかな?」って焦る人多いんだけど、実は打ち方は合ってるパターンだよ。原因は実行権が無いだけ。焦らずls -lxが付いてるか確認する癖をつけると、この手のエラーには一瞬で対処できるようになるよ!

POINT

数字指定とチェック指定、どちらが正解ということはありません。「755や644のように定番の形にまとめて設定したい」ときは数字指定、「今の権限は変えず実行権だけ追加したい」のように部分的に触りたいときは記号指定、と使い分けるのが実務での基本パターンです。

まとめ

2-4では、ls -lの権限表示の読み方から、chmodによる数字指定・記号指定の両方、そして実行権がないファイルが動かせないことまでを体験しました。このページで叩けるようになったコマンドを一覧にまとめます。

コマンド何をするか覚え方
ls -l先頭10文字でファイル種別と権限を表示するd + rwx×3組(所有者・グループ・その他)
stat <ファイル>権限を数字・記号両方の表記で詳しく表示するstatistics(詳細情報)
chmod 644 <ファイル>所有者は読み書き、他は読み取りのみにする一般ファイルの定番
chmod 755 <ファイル>所有者は全権、他は読み取り+実行にするディレクトリ・実行ファイルの定番
chmod 700 <ファイル>所有者のみ全権、他は一切不可にする自分専用の鍵
chmod u+x <ファイル>所有者に実行権を追加するu(自分)に+x(実行権を足す)
chmod go-w <ファイル>グループとその他から書き込み権を外すgo(自分以外)から-w(書く力を奪う)

次のページ「2-5. 所有者とグループ」では、権限の3層構造のうち「誰が所有者・所有グループなのか」をchownchgrpで変更し、グループそのものをgroupaddで新しく作っていきます。

脚注 ─ 用語解説
  1. ディレクトリ … Windowsでいう「フォルダ」にあたる、ファイルをまとめる入れ物。ls -lの先頭がdで始まる。
  2. chmod(change mode) … ファイルやディレクトリのパーミッション(モード)を変更するコマンド。数字指定と記号指定の2通りの書き方がある。
  3. 数字指定r=4・w=2・x=1を足し算した3桁の数字で、所有者・グループ・その他の権限を一括指定するchmodの書き方。
  4. 記号指定u/g/o/a+/-/=を組み合わせ、権限の一部だけを変更するchmodの書き方。
  5. 実行権(execute) … ファイルの場合は「プログラムとして実行してよいか」、ディレクトリの場合は「中に入れるか」を意味する権限。記号はx
  6. Permission denied … 権限不足によって操作が拒否されたときに表示されるエラーメッセージ。