権限

INPUT · スライド

新しく作るものの既定(`umask`)

01 / 08

誰が 644 に決めたのか

前のレッスンで気づいたはずの疑問から始めるよ。

~ $ touch atarashii.txt~ $ stat -c %a atarashii.txt644

誰も指示していないのに 644 になるchmod は打っていないよね。

この数はどこから来ているんだろう。決めているのは touch ではないよ。echo hi > file.txt で作っても、cp で複製しても、やっぱり 644 になるからね。

決めているのは umask という設定だよ。今日はこれを読めるようにしよう。

02 / 08

umask を見てみる

打つだけで今の設定が出るよ。

~ $ umask0022

0022 だね。前のレッスンで覚えた読み方をすると「持ち主 0、グループ 2、その他 2」に見える。

でも待って。644 とは全然違う数だよね。

そう、umask は「与える権限」ではなく「引く権限」なんだ。mask(覆い隠す)という名前がそれを表しているよ。

引かれる前の数、つまり土台があるんだ。それを次のスライドで見てみよう。

03 / 08

土台は 666 と 777

土台を自分の目で見る方法があるよ。何も引かない設定にしてみるんだ。

~ $ umask 0~ $ touch zenkai.txt~ $ stat -c %a zenkai.txt666~ $ mkdir zendir~ $ stat -c %a zendir777

見えたね。

作るもの土台
ファイル666rw-rw-rw-
ディレクトリ777rwxrwxrwx

ファイルの土台に x が無いのに気づいたかな。新しく作るファイルには、実行の印を最初から付けないという決まりなんだ。

理にかなっているよね。作ったばかりのファイルが勝手に実行できてしまったら危ないからね。だから run.sh を作ったときも、自分で chmod u+x を打つ必要があったんだ。

04 / 08

土台から umask を引く

仕組みはこれで全部だよ。土台から umask の分を取り除く

ファイル:      666 - 022 = 644ディレクトリ:  777 - 022 = 755

022 を桁ごとに読むと「持ち主からは何も引かない、グループから 2(w)を引く、その他から 2(w)を引く」だね。

だから結果はこうなるよ。

土台引く結果
持ち主rw-なしrw-
グループrw-wr--
その他rw-wr--

-rw-r--r--、つまり 644 だね。「自分は読み書き、他の人は読むだけ」という既定は、umask 022 が作っていたんだ。

謎が解けたね。

05 / 08

厳しくしてみる

umask を変えると、これから作るものの既定が変わるよ。

~ $ umask 077~ $ touch himitsu.txt~ $ stat -c %a himitsu.txt600

077 は「グループとその他から全部(7)引く」という意味だね。だから作ったファイルは最初から 600、つまり自分だけのものになる。

umaskファイルディレクトリ意味
022644755既定。他人は読める
027640750グループは読める、他人は何も
077600700自分だけ
002664775グループも書ける

秘密の作業をするときは umask 077 にしておくと、毎回 chmod 600 を打たなくて済むよ。うっかり忘れる事故も防げるね。

06 / 08

引き算ではなく「取り除き」

「引き算」と言ってきたけれど、正確には少し違うよ。ふつうの引き算ではなく、持っている権限から取り除くという動きなんだ。

違いが出る例を見てみよう。umask 003 だとどうなると思う?

666 の その他の桁は rw-(6)003 の その他の桁は -wx(3)

ふつうの引き算なら 6−3=3 だけれど、実際は違うよ。土台に無いものは引けないんだ。

  • w(2)は土台にある → 取り除かれる
  • x(1)は土台に無い → 何も起きない

結果はその他の桁が r--(4)になるよ。6−3=3 ではなく 4 だね。

ふだんは 022077 のように、この違いが出ない数を使うので気にしなくていいよ。でも「引き算」と覚えると時々ずれるので、覆い隠す(マスクする)という言葉で覚えておくのが正しいんだ。

07 / 08

これから作るものだけ

大事な注意が1つあるよ。umask は既にあるファイルには効かない

~ $ ls -l memo.txt-rw-r--r--  memo.txt        ← 644~ $ umask 077~ $ ls -l memo.txt-rw-r--r--  memo.txt        ← 変わらない

umask は「これから作るものの初期値」を決めているだけだからね。すでにあるものを変えたいなら chmod を打つしかないよ。

もう1つ。umask の設定はその端末の中だけで、閉じると元に戻るよ。ずっと効かせたいときは .profile という設定ファイルに書いておくんだ。それは章10でやるからね。

この2つを混ぜないようにしよう。

  • chmodいまあるものを変える
  • umaskこれから作るものの既定を変える

08 / 08

さあ、打ってみよう

ホームには memo.txt が1つだけあるよ(644 だよ)。あとは自分で作りながら確かめていこう。

確かめ方は前のレッスンと同じで、stat -c %a が便利だよ。

1つコツがあるよ。umask を変えたら、必ず新しく作って確かめること。変えただけでは何も起きないので、touchmkdir> で作ってみないと結果が見えないんだ。

そして問題のあいだで設定は残るけれど、問題が変わると Linux が作り直されて 022 に戻るよ。だから毎回 umask を打つところから始めてね。