chmod 755 とは何か——どんなパーミッションも読めるようになる
755 の三桁は魔法ではなく、「誰が読み・書き・実行できるか」を表すコードだ。755・644・700 を一目で読み、実行ビットがディレクトリでは別の意味になる理由まで押さえる。
Stack Overflow で見つけた一行 chmod 755 deploy.sh で、とりあえず動いた。だが 755 は意味の見えない三桁で、次にスクリプトが動かなかったり、Web サーバーが 403 を返したりすれば、また数字を写して運任せに戻ってしまう。朗報は、この三桁は呪文ではなく、一目で読めるコードだということだ。読めるようになれば、755・644・700 は写すだけの数字ではなく、自分で下す判断に変わる。
三つのクラス、三つのパーミッション
Unix のファイルとディレクトリは、三つのクラスのユーザーごとにパーミッションを持つ。
- 所有者(
u)——たいていは作成した本人 - グループ(
g)——アクセスを共有するユーザーの集まり - その他(
o)——それ以外の全員
クラスごとに、三つのパーミッションが独立にオン・オフされる。
- 読み取り(
r)——中身を見る - 書き込み(
w)——中身を変える - 実行(
x)——プログラムとして動かす(ディレクトリでは意味が変わる。ここは覚えておいてほしい)
ls -l を打てば、これらが一度に並ぶ。
-rwxr-xr-x 1 alice devs 482 Jul 29 09:14 deploy.sh
この -rwxr-xr-x がパーミッション全体だ。先頭の一文字のあと、三つずつの組で読む。
- 先頭の
-はファイル種別であってパーミッションではない(-通常ファイル、dディレクトリ、lシンボリックリンク)——ここは誤読が多い rwx——所有者は読み・書き・実行ができるr-x——グループは読みと実行はできるが、書けないr-x——その他も同じで、読みと実行はできて書けない
ハイフン - はそのビットがオフという意味だ。つまり -rwxr-xr-x はまさに chmod 755 が生む結果——ただしこれは通常ファイルの姿で、同じパーミッションがディレクトリに付けば drwxr-xr-x と表示され、先頭は - ではなく d になる。では中身を見ていこう。
各桁は足し算だ——4・2・1
755 の三桁は、順に三つのクラス——所有者・グループ・その他——に対応する。各桁は、そのクラスの三つのパーミッションを、決まった値の足し算で表す。
| パーミッション | 値 |
|---|---|
読み取り(r) | 4 |
書き込み(w) | 2 |
実行(x) | 1 |
オンにしたいパーミッションの値を足せば、0 から 7 までの一桁になる。
| 数字 | 足し算 | パーミッション |
|---|---|---|
| 7 | 4 + 2 + 1 | rwx |
| 6 | 4 + 2 | rw- |
| 5 | 4 + 1 | r-x |
| 4 | 4 | r-- |
| 0 | — | --- |
だから 755 は左から順にこう読める。
- 7 → 所有者:4 + 2 + 1 =
rwx - 5 → グループ:4 + 1 =
r-x - 5 → その他:4 + 1 =
r-x
所有者は何でもでき、グループとその他は読みと実行はできるが変更はできない。これが chmod 755 だ。次に 644。
- 6 → 所有者:4 + 2 =
rw- - 4 → グループ:
r-- - 4 → その他:
r--
所有者は読み書きでき、ほかは読むだけ。どれにも実行ビットがない——通常のデータファイルにはちょうどよく、動かしたいスクリプトにはまさに不都合だ。
組み合わせを覚える必要はない。Chmod 権限計算ツール で各クラスの読み・書き・実行を切り替えれば、八進数と rwxr-xr-x の文字列が同時に変わり、この対応は手が覚えていく。
実際に出くわす数値
現実の大半は、ひと握りの数値で足りる。それぞれの意味と使いどころはこうだ。目の前のファイルにどちらを与えるか、プロジェクト全体にどう適用するかで迷うなら、chmod 644 と 755 の選び方がその判断を掘り下げている。
| 八進数 | 記号 | 主な用途 |
|---|---|---|
644 | rw-r--r-- | 通常ファイル——文書、設定、ソースコード |
755 | rwxr-xr-x | ディレクトリと、誰でも動かせるスクリプトやバイナリ |
700 | rwx------ | 非公開のディレクトリやスクリプト——所有者だけ |
600 | rw------- | 非公開ファイル——SSH 秘密鍵はこれにすべき |
750 | rwxr-x--- | 所有者は全開、グループは利用可、その他は締め出し |
775 | rwxrwxr-x | グループも書ける——共有プロジェクトのディレクトリ |
この表の大半は、二つのパターンで説明がつく。データファイルは 644(非公開なら 600)——所有者は読み書き、ほかは読みだけか何もなし、実行はなし。たどったり動かしたりするもの、つまりディレクトリとプログラムは 755(絞りたければ 750/700)——644 と同じ考えに実行ビットを足す。実行がなければ、それらが存在する意味の一つが果たせないからだ。ここで、多くの解説が飛ばす疑問が出てくる。
実行ビットはディレクトリでは別物
ファイルにとって x は明快だ——プログラムとして動かす許可。ディレクトリの x は「動かす」こととは無関係で、これが分かると、フォルダに付いた 755 の意味がようやく通る。
ディレクトリでは、
rは中の名前を一覧できる(ls)xはそのディレクトリをたどれる——cdで入り、通り抜け、すでに知っている名前でファイルに達するwは——ただしxと揃って初めて——項目の作成・改名・削除ができる
意外なのは、r と x がどれほど無関係かだ。r はあるが x がないディレクトリでは、名前は見えても、ファイルそのものは読めず、stat すらできない。x はあるが r がないディレクトリでは、正確な名前をすでに知っていれば中のファイルを開けるが、ls は失敗する。そしてディレクトリの中身を変えること、つまりファイルの作成や削除には、ファイル側ではなくそのディレクトリに w と x の両方が要る。実際には r と x は揃っていてほしい。だから他人が通り抜ける必要のあるディレクトリはたいてい 644 ではなく 755 になる。実行ビットを外せば、誰もそのフォルダに入れなくなる。
初めてだと必ず引っかかる波及効果もある。/var/www/site/index.html に達するには、パス上のすべてのディレクトリ——/・/var・/var/www・/var/www/site——に x が要る。祖先のどれか一つでも実行ビットを欠けば、その下のすべてに手が届かなくなる。ファイル自身がどれほど開いていても関係ない。鎖全体を一度に見たいなら ls -ld / /var /var/www /var/www/site を打ち、x が抜けている行を探せばいい。これは「ファイルだけ見ても腑に落ちない」 permission denied のよくある原因だ——正しく見えるのに拒まれるパーミッションは、それ自体で一つの切り分けに値する。その手順はchmod しても Permission denied のまま?で層ごとに追っている。
記号による指定——もう一つの言い方
八進数は九つのビットを一度に設定する。記号による指定は、特定のビットだけを動かし、文のように読める。
chmod +x deploy.sh # 実行を付ける——動かせるようにする(下の umask の注記も参照)
chmod u+x deploy.sh # 所有者だけに実行を付ける。ほかはそのまま
chmod go-w file # グループとその他から書き込みを外す
chmod u=rw,go=r file # 正確に設定:所有者 rw、グループとその他 r(= 644)
部品は、誰(u 所有者、g グループ、o その他、a 全員)、演算子(+ 付ける、- 外す、= その通りに設定)、パーミッション(r・w・x)だ。一つ細かい点がある。誰を省いた素の chmod +x は三つのクラス全部を狙うが、あなたの umask で絞られるため、実行ビットが必ずしも全部立つとは限らない。確実にしたければクラスを書く——u+x、a+x。ファイルのモードを一から丸ごと決めたいときは八進数、一つのビットだけをほかに触れず動かしたいときは記号を選ぶ。計算ツール は両方向に対応する——記号の文字列を入れて八進数を読み、あるいは八進数を組み立てて記号を読む。ただしツールが変換するのはパーミッションのビットで、あなたの環境の umask は読み取れない。だから素の +x はクラスを明示して——u+x、a+x——入れれば、実際に走らせるコマンドと結果が揃う。
システムをまたいでパーミッションを読む
モードの設定そのものは、Linux でも macOS でも各 BSD でも同じだ。ただし、上の二つのコマンドを同じものと読んではいけない。chmod 755 は基本モードを丸ごと一度に設定し、chmod u+x は所有者の実行ビットだけを変えて残りはそのままにする。現在のモードを読み戻すところが、システムごとに分かれる。
ls -lはどこでも-rwxr-xr-xの形を出す——くり返すが、先頭の一文字はファイル種別でパーミッションではない。- 八進数を直接得るには——GNU/Linux は
stat -c '%a' file、macOS/BSD はstat -f '%Lp' file。(Linux のstat -c '%A'は記号形式を出す。) - Windows はまったく別のモデルだ。NTFS は Unix のモードビットではなく ACL に依るので、ネイティブの Windows ツールは
755を解釈しない。WSL では、Linux ファイルシステム上のファイルは普通に振る舞うが、マウントした Windows ドライブ(/mnt/c)では、結果は DrvFS の metadata オプションと背後の Windows ACL 次第だ——そこでのchmodはネイティブな Linux ファイルシステムのchmodと必ずしも同じではなく、777と表示されても ACL は越えられない。
755 が語らないこと
三桁だけでは分からない点が、あと三つある。どれもよくある混乱の元だ。
-
四桁目、先頭の桁。
755は本当は0755だ。先頭の0は特殊ビットのための枠で、解読の仕方はほかと同じだ。数字 ビット 例 4setuid——ファイル所有者としてプログラムを動かす 実行ファイルの 47552setgid——ファイルのグループとして動かす。ディレクトリでは新規項目がそのグループを継ぐ 共有ディレクトリの 27751sticky——共有ディレクトリで項目を改名・削除できるのは、その項目の所有者・ディレクトリの所有者・root だけ /tmpの1777解読はこれで済む。実行時に何をするか、どう人を驚かせるかは、別に一本立てて扱う話だ。
-
所有権。 パーミッションは所有者・グループ・その他が何をできるかを決めるが、
chmodは所有者とグループが誰かは決して変えない。それはchownの仕事で、この二つの取り違えが「777にしたのにまだ動かない」の多くの正体だ。 -
まったく別の門番たち。 モードは最初の関門にすぎない。ACL、SELinux や AppArmor のポリシー、読み取り専用や
noexecのマウント、親ディレクトリに欠けたx——どれも、自身のモードが全開に見えるファイルへのアクセスを拒める。chmod 777が何も変えないことがあるのはこのためで、ここでいう「どんなパーミッションも」はモードを読むことを指し、ファイルを守るすべての層を指すのではない。その層をほどくのは、また別の切り分けだ。
読み方チェックリスト
モードが目の前に来たら、
- 三桁に分ける——所有者、グループ、その他、この順で。
- 各桁を 4(
r)+ 2(w)+ 1(x)で分解する。7はrwx、6はrw-、5はr-x、4はr--。 - 対象にとっての実行の意味を思い出す。 ファイルなら「動かす」、ディレクトリなら「入って中身に達する」。
- 四桁目を確かめる。 先頭の
1・2・4は特殊ビット——sticky、setgid、setuid。解読は同じ手順だが、実行時の振る舞いは別の話だ。 - パーミッションと所有権を切り分ける。 モードは所有者・グループ・その他がそれぞれ何をできるかを定める。
chownが変えるのはファイルの所有者とグループで、どのクラスが適用されるかは、アクセスする側の識別情報とグループ所属で決まる。
これができれば、644・755・700 は一目で読める。そして解読より確認したいとき——あるいはモードと rwxr-xr-x の文字列を並べて見たいとき——は Chmod 権限計算ツール に入れればいい。八進数を入れて記号を出し、その逆もでき、ファイルとディレクトリの違いまで示してくれる。