chmod パーミッション計算

Unix のファイル権限を 8 進数 (755)、記号 (rwxr-xr-x)、チェックボックスで相互変換。setuid、setgid、sticky ビットにも対応。

よく使うモード
クラス読み取り書き込み実行
所有者
グループ
その他
8 進数
記号
8 進数コマンド
chmod 644 file
記号コマンド
chmod u=rw,g=r,o=r file
ls -l 形式
-rw-r--r--

このツールの役割

Unix システムのすべてのファイルは、誰が読み・変え・実行できるかを決める一組の権限を持ちます。chmod コマンドがそれを設定し、まったく異なる二つの綴り — 3 桁の 8 進数と文字の並び — でそれらの権限を受け付けます。両者はまったく同じものを記述します。このツールは両方の綴りと、チェックボックスのグリッドを同期して保つので、手元にあるどちらからでも始めて、必要なほうをコピーできます。

完全にブラウザ内で動き、純粋な計算です: サーバーはなく、入力した内容はどこにも送られません。これは計算機と参照であって、本物のマシンで権限を変える手段ではありません — そのためには生成される chmod コマンドをコピーして自分で実行します。

三つのグループ、三つの権限

権限は 3 つずつの 3 グループとして整理されます。三つのグループはファイルの所有者、それを所有するグループ、そしてそれ以外の全員 — 「その他」です。各グループの中に三つの権限があります: 読み取り・書き込み・実行です。

  • 読み取り (r) — ファイルの内容を見る、あるいはディレクトリの項目を一覧する。
  • 書き込み (w) — ファイルを変える、あるいはディレクトリで項目を追加・削除する。
  • 実行 (x) — ファイルをプログラムとして実行する、あるいはディレクトリに入ってその中のファイルに到達する。

実行はディレクトリとファイルとで違うことを意味し、それが人を捕らえます: 読めるが実行できないディレクトリは、中に何があるかの名前は見せますが、そのどれも開かせません。

8 進数はどう働くか

各グループの三つの権限は、固定値を足し合わせて一つの 8 進数の桁に詰め込まれます: 読み取りは 4、書き込みは 2、実行は 1 です。読み書き実行は 4+2+1 = 7、読み実行は 4+1 = 5、読み書きは 4+2 = 6 です。三つのグループが三つの桁を与えます。

755
7 = 4+2+1   # 所有者: 読み取り + 書き込み + 実行
5 = 4+0+1   # グループ: 読み取り + 実行
5 = 4+0+1   # その他: 読み取り + 実行

だから 755 は「所有者は何でもでき、それ以外の全員は読んで実行できるが変えられない」で、プログラムやディレクトリのふつうのモードです。644 — 所有者は読み書き、それ以外は読み取り専用 — はふつうのファイルのふつうのモードです。パターンになじめば、よく使うモードはひと目で読めます。

記号の並び

もう一つの綴りは ls -l が表示するものです: 9 文字、グループごとに 3 つ、それぞれが自分の文字か横棒です。755 は rwxr-xr-x、644 は rw-r--r-- です。8 進数の数とまったく同じ情報を運び、ただ、頭の中で桁を足すのではなく各権限が見えるように並べられています。

ls -l の行は前に 10 文字目を持ちます — ディレクトリの d、通常ファイルの横棒、シンボリックリンクの l です。その先頭の文字はファイルの種類であって権限ではなく、chmod はそれを変えられません。ここに ls -l の権限フィールド全体を貼り付けられ、種類の文字は単に無視されます。

特殊ビット: setuid、setgid、sticky

9 つのふつうのビットの上に、三つの特殊なものがあり、前に付く任意の 4 桁目の 8 進数として書かれます — setuid (4)、setgid (2)、sticky ビット (1) です。それらは自分の列を持ちません。代わりにそれぞれが記号の並びの実行スロットを兼用し、それが人を戸惑わせる大文字の源です。

  • 実行ファイルの setuid は、それを起動したユーザーではなくファイルの所有者として実行させます。これが passwd に、直接書けないシステムファイルを更新させる方法であり — バグのある setuid プログラムが深刻な穴である理由です。
  • 実行ファイルの setgid はそれをファイルのグループとして実行します。ディレクトリでは、より有用で安全なことをします: 中に作られる新しいファイルが、作成者のではなくそのディレクトリのグループを継承します。
  • ディレクトリの sticky ビットは、全員がディレクトリに書けても、ファイルの所有者だけがそれを削除・改名できることを意味します。これが /tmp を共有だが安全に保つものです。素のファイルでは何もしません。

記号の並びでは、立った特殊ビットがその実行スロットを文字に変えます: setuid は所有者スロットの s、setgid はグループスロットの s、sticky はその他スロットの t です。大小が、実行も立っているかを教えます — 小文字なら立っている、大文字なら立っていない、です。

rwsr-xr-x  4755   # setuid、所有者は実行する
rwSr-xr-x  4655   # setuid、所有者は実行しない
rwxrwxrwt  1777   # sticky、その他は実行する
rwxrwxrwT  1776   # sticky、その他は実行しない

大文字の S や T はほぼ常に誤りです: 実行できないファイルに特殊ビットが立ったことを意味するので、そのビットには働きかける相手がありません。

コマンドラインでの 8 進数か記号か

chmod は両方の形式を受け付け、このツールは両方を書きます。8 進数形式はすべてのビットを一度に設定します: chmod 755 file。記号の = 形式は同じことを絶対的に行います — chmod u=rwx,g=rx,o=rx file — 各グループを列挙するので、結果はファイルが何から始まったかに依存しません。

計算機には要らないが出会うことになる三つ目の相対形式があります: chmod +x file は全員に実行を加え、chmod g-w file はグループの書き込みを外し、chmod o= file はその他のすべてを消します。その形式は全体を設定するのではなく現在のモードに対してビットを変えるもので、コマンドラインでは便利ですが、表示する単一の「結果」を持ちません。

設定しないほうがよいモード

権限ツールは、モードが悪い考えであるときもそう言うべきです。二つが絶えず現れます:

  • 777 はすべてのユーザーに読み取り・書き込み・実行を与えます。何かが「動かない」ときの反射的な修正で、ほぼ常に小さな問題を本物のセキュリティの穴と引き換えにします。正しいモードはほぼ常に狭く — たいてい 755 か 644 — です。
  • 誰でも書き込めるファイル (最後の桁が 2 を含む) は、マシンのどのアカウントにもその内容を書き換えさせます。実行・読み込み・信頼されるものには何であれ、それは入り口です。代わりにグループに書き込みを与えるか、所有者だけに保ってください。

このツールはこれらを起きたときに指摘します。対象がファイルかディレクトリかは分からないので、エラーではなく、もう一度見る価値のあることとして言い表します — sticky ビットはディレクトリでは正しく、ファイルでは無意味で、どちらを持つかはあなただけが知っています。

よくある質問

644 と 755 の違いは何ですか?
644 は所有者に読み書き、それ以外に読み取り専用で、ふつうのファイルのふつうのモードです。755 は三つのグループすべてに実行を加え、これはプログラムが実行するのに、ディレクトリが入られるのに必要なものです。文書やソースファイルには 644、スクリプトやディレクトリには 755 を使ってください。
私のモードが大文字の S や T を示したのはなぜですか?
実行権限のないグループに特殊ビットが立ったからです。小文字の s や t は特殊ビットと実行が両方立っていることを意味し、大文字の形は特殊ビットは立っているが実行はオフであることを意味し、たいていモードが意図どおりでないことを意味します — 例えば 4644 (rwSr--r--) は、誰も実行できないファイルの setuid です。
chmod 777 は実際に何をし、なぜ勧められないのですか?
所有者・グループ・それ以外の全員に読み取り・書き込み・実行を与えます — システムのすべてのアカウントへの完全なアクセスです。すべての保護を一度に取り除くので勧められません。誰でも書けるファイルは誰でも改ざんできるファイルで、誰でも書けるディレクトリは誰でもファイルを仕込めるものです。777 に手を伸ばすほぼすべての場合は、755 か 644 に正しい所有権を足せば解決します。
先頭の桁は必ずなければなりませんか?
いいえ。特殊ビットがどれも立っていないとき、モードはただの 3 桁 — 0755 ではなく 755 — で、それがこのツールが示すものです。先頭のゼロは受け付けられ同じことを意味します。先頭の 4・2・1 はそれぞれ setuid・setgid・sticky ビットを立てます。
ls -l の行をそのまま貼り付けられますか?
はい。-rwxr-xr-x や drwxr-xr-x のような 10 文字の権限フィールドを貼り付けると、このツールは先頭の種類の文字を剥がして残りを読みます。種類 (ファイル・ディレクトリ・リンク) は権限ではなく chmod は変えられないので、無視されます。
入力した内容はサーバーに送られますか?
いいえ。ツール全体がブラウザ内で動く計算です。何もアップロード・記録・保存されず、だからネットワーク接続がまったくなくても動きます。