DevKitLab Logo DevKitLab
chmod / Unix / ファイルパーミッション / Linux

chmod 755 とは何か——どんなパーミッションも読めるようになる

755 の三桁は魔法ではなく、「誰が読み・書き・実行できるか」を表すコードだ。755・644・700 を一目で読み、実行ビットがディレクトリでは別の意味になる理由まで押さえる。

Stack Overflow で見つけた一行 chmod 755 deploy.sh で、とりあえず動いた。だが 755 は意味の見えない三桁で、次にスクリプトが動かなかったり、Web サーバーが 403 を返したりすれば、また数字を写して運任せに戻ってしまう。朗報は、この三桁は呪文ではなく、一目で読めるコードだということだ。読めるようになれば、755644700 は写すだけの数字ではなく、自分で下す判断に変わる。

三つのクラス、三つのパーミッション

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 の三桁は、順に三つのクラス——所有者・グループ・その他——に対応する。各桁は、そのクラスの三つのパーミッションを、決まった値の足し算で表す。

パーミッション
読み取り(r4
書き込み(w2
実行(x1

オンにしたいパーミッションの値を足せば、0 から 7 までの一桁になる。

数字足し算パーミッション
74 + 2 + 1rwx
64 + 2rw-
54 + 1r-x
44r--
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 の選び方がその判断を掘り下げている。

八進数記号主な用途
644rw-r--r--通常ファイル——文書、設定、ソースコード
755rwxr-xr-xディレクトリと、誰でも動かせるスクリプトやバイナリ
700rwx------非公開のディレクトリやスクリプト——所有者だけ
600rw-------非公開ファイル——SSH 秘密鍵はこれにすべき
750rwxr-x---所有者は全開、グループは利用可、その他は締め出し
775rwxrwxr-xグループも書ける——共有プロジェクトのディレクトリ

この表の大半は、二つのパターンで説明がつく。データファイルは 644(非公開なら 600)——所有者は読み書き、ほかは読みだけか何もなし、実行はなし。たどったり動かしたりするもの、つまりディレクトリとプログラムは 755(絞りたければ 750/700)——644 と同じ考えに実行ビットを足す。実行がなければ、それらが存在する意味の一つが果たせないからだ。ここで、多くの解説が飛ばす疑問が出てくる。

実行ビットはディレクトリでは別物

ファイルにとって x は明快だ——プログラムとして動かす許可。ディレクトリの x は「動かす」こととは無関係で、これが分かると、フォルダに付いた 755 の意味がようやく通る。

ディレクトリでは、

  • r は中の名前を一覧できる(ls
  • x はそのディレクトリをたどれる——cd で入り、通り抜け、すでに知っている名前でファイルに達する
  • w は——ただし x と揃って初めて——項目の作成・改名・削除ができる

意外なのは、rx がどれほど無関係かだ。r はあるが x がないディレクトリでは、名前は見えても、ファイルそのものは読めず、stat すらできない。x はあるが r がないディレクトリでは、正確な名前をすでに知っていれば中のファイルを開けるが、ls は失敗する。そしてディレクトリの中身を変えること、つまりファイルの作成や削除には、ファイル側ではなくそのディレクトリwx の両方が要る。実際には rx は揃っていてほしい。だから他人が通り抜ける必要のあるディレクトリはたいてい 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 全員)、演算子+ 付ける、- 外す、= その通りに設定)、パーミッションrwx)だ。一つ細かい点がある。を省いた素の chmod +x は三つのクラス全部を狙うが、あなたの umask で絞られるため、実行ビットが必ずしも全部立つとは限らない。確実にしたければクラスを書く——u+xa+x。ファイルのモードを一から丸ごと決めたいときは八進数、一つのビットだけをほかに触れず動かしたいときは記号を選ぶ。計算ツール は両方向に対応する——記号の文字列を入れて八進数を読み、あるいは八進数を組み立てて記号を読む。ただしツールが変換するのはパーミッションのビットで、あなたの環境の umask は読み取れない。だから素の +x はクラスを明示して——u+xa+x——入れれば、実際に走らせるコマンドと結果が揃う。

システムをまたいでパーミッションを読む

モードの設定そのものは、Linux でも macOS でも各 BSD でも同じだ。ただし、上の二つのコマンドを同じものと読んではいけない。chmod 755 は基本モードを丸ごと一度に設定し、chmod u+x は所有者の実行ビットだけを変えて残りはそのままにする。現在のモードを読み戻すところが、システムごとに分かれる。

  • ls -l はどこでも -rwxr-xr-x の形を出す——くり返すが、先頭の一文字はファイル種別でパーミッションではない。
  • 八進数を直接得るには——GNU/Linuxstat -c '%a' filemacOS/BSDstat -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 が語らないこと

三桁だけでは分からない点が、あと三つある。どれもよくある混乱の元だ。

  1. 四桁目、先頭の桁。 755 は本当は 0755 だ。先頭の 0特殊ビットのための枠で、解読の仕方はほかと同じだ。

    数字ビット
    4setuid——ファイル所有者としてプログラムを動かす実行ファイルの 4755
    2setgid——ファイルのグループとして動かす。ディレクトリでは新規項目がそのグループを継ぐ共有ディレクトリの 2775
    1sticky——共有ディレクトリで項目を改名・削除できるのは、その項目の所有者・ディレクトリの所有者・root だけ/tmp1777

    解読はこれで済む。実行時に何をするか、どう人を驚かせるかは、別に一本立てて扱う話だ。

  2. 所有権。 パーミッションは所有者・グループ・その他が何をできるかを決めるが、chmod は所有者とグループが誰かは決して変えない。それは chown の仕事で、この二つの取り違えが「777 にしたのにまだ動かない」の多くの正体だ。

  3. まったく別の門番たち。 モードは最初の関門にすぎない。ACL、SELinux や AppArmor のポリシー、読み取り専用や noexec のマウント、親ディレクトリに欠けた x——どれも、自身のモードが全開に見えるファイルへのアクセスを拒める。chmod 777 が何も変えないことがあるのはこのためで、ここでいう「どんなパーミッションも」はモードを読むことを指し、ファイルを守るすべての層を指すのではない。その層をほどくのは、また別の切り分けだ。

読み方チェックリスト

モードが目の前に来たら、

  1. 三桁に分ける——所有者、グループ、その他、この順で。
  2. 各桁を 4(r)+ 2(w)+ 1(x)で分解する。 7rwx6rw-5r-x4r--
  3. 対象にとっての実行の意味を思い出す。 ファイルなら「動かす」、ディレクトリなら「入って中身に達する」。
  4. 四桁目を確かめる。 先頭の 124 は特殊ビット——sticky、setgid、setuid。解読は同じ手順だが、実行時の振る舞いは別の話だ。
  5. パーミッションと所有権を切り分ける。 モードは所有者・グループ・その他がそれぞれ何をできるかを定める。chown が変えるのはファイルの所有者とグループで、どのクラスが適用されるかは、アクセスする側の識別情報とグループ所属で決まる。

これができれば、644755700 は一目で読める。そして解読より確認したいとき——あるいはモードと rwxr-xr-x の文字列を並べて見たいとき——は Chmod 権限計算ツール に入れればいい。八進数を入れて記号を出し、その逆もでき、ファイルとディレクトリの違いまで示してくれる。