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 ビットはディレクトリでは正しく、ファイルでは無意味で、どちらを持つかはあなただけが知っています。

chmod 755 の意味

ほとんどのスクリプト、プログラム、ディレクトリが行き着くモードで、グループ一つずつ読めます。各桁はそのグループの三つの権限を足し合わせたもので、読み取りは 4、書き込みは 2、実行は 1 です。だから 7 は三つ全部、5 は書き込みを外した読み取りと実行です。

  • 所有者 — 7 = 4+2+1。読み取り・書き込み・実行: あなたはファイルを編集して実行できます。
  • グループ — 5 = 4+0+1。書き込みなしの読み取りと実行: そのファイルのグループの一員は読んで実行でき、変えられません。
  • その他 — 5 = 4+0+1。同じくもう一度: マシン上のほかのすべてのアカウントが読んで実行でき、そのどれも変えられません。

書き出せば rwxr-xr-x で、コマンドは chmod 755 file、文字のほうが好みなら chmod u=rwx,g=rx,o=rx file です。ディレクトリでは同じビットが違う読みになります。そこでは実行が「入って中のものに届ける」を意味するからです: 755 は誰でも一覧でき入っていけるディレクトリで、項目を加えたり外したりできるのは所有者だけです。このツールは 755 について何も言いません。意図的です — ほかのアカウントがあなたの書いたものを実行できる、いちばん狭いモードだからです。グループにもファイルを編集させる必要があるなら、グループの書き込みを加えるモードは 775 で、777 ではありません。

chmod 644 の意味と、なぜあなたのファイルがすでにそれなのか

644 は 755 から実行ビットをすべて抜いたものです: 所有者に 6 = 4+2、続いてグループに 4 = 4+0+0、その他にもう一度 4 で、つまり rw-r--r-- です。誰も実行できず、それは読まれるだけのもの — 文書、HTML のページ、設定ファイル、ほかのプログラムがコンパイルするソースファイル — にはまさに正しいことです。一方ディレクトリでは制限的なのではなく壊れています: 実行がなければ何も入れないので、中の名前は一覧できてどれも開けません。

これは誰も触っていない新しいファイルがふつう持つモードでもあり、その理由が umask です。ファイルを作るプログラムはふつう 666 を求め、ディレクトリを作るプログラムは 777 を求めます。そのあと umask が、ファイルが存在する前に自分の指すビットを落とします。よくある umask 022 — グループとその他から書き込みを取り上げる — では 666 が 644 になり 777 が 755 になります。だからこの二つはどこにでもあり、だからこのツールが差し出す最初の二つのモードなのです。手元の値を見るにはシェルで umask と打ちます。

  • umask 022、ふつうの既定値 — 新しいファイルは 644、新しいディレクトリは 755 で出てきます。
  • umask 002、各ユーザーが自分のグループを持つ環境で設定される値 — 664 と 775 で、グループの一員も編集できます。
  • umask 077、非公開向けの設定 — 600 と 700 で、所有者以外は読むことさえできません。

その六つはすべてここの用意されたモードで、偶然ではありません: 人が実際に設定する三つの umask を、ファイルに一度、ディレクトリに一度あてたものです。六つの値ではなく三つの組として読むのが、モードを引くのをやめる一番早い道です。

chmod 711 の意味: 入ってよいが、見てはならない

711 は読み取りなしに実行を渡す、よくあるモードです: 所有者に 7 = 4+2+1、続いて 1 = 0+0+1 が二度で、つまり rwx--x--x です。ディレクトリの二つの権限をもう一度切り離したときにだけ意味が通ります — 読み取りは名前を一覧し、実行は通り抜けさせます — だから 711 のディレクトリは、欲しいものの名前をすでに知っている人なら誰でも入れて、誰にも一覧できません。

  • ディレクトリでこれは本当に役に立ちます。711 のホームディレクトリは、ウェブサーバーや共有マシンのほかのアカウントに /home/you/public/report.pdf を開かせる一方で、ls /home/you は拒まれます。所有者から隠れるものはなく、ただ外から名前を数え上げられないのです。
  • ファイルでこれはほとんど役に立ちません。シェルスクリプトを走らせるとはインタプリタがファイルを開いて読むことなので、読み取りなしの実行は失敗します。カーネル自身が読み込むコンパイル済みバイナリだけが動きます。ほかの人に走らせるスクリプトのつもりだったなら、欲しかったのは 755 です。

ツールは 711 についても何も言いません。755 より広いのではなく狭いからです: 755 が与えないものを何も与えません。近い値が同じ理由で出てきます — 751 はその他に拒まれた一覧をグループに渡し、700 は通り抜けさえ取り上げ、それが一つのアカウント向けのディレクトリが欲しいものです。

777 と 1777: 一ビットの差で、同じ助言ではない

共有ディレクトリが引き寄せがちな二つのモードは一ビットだけ違い、このツールは意図してそれぞれ違う答えを返します。777 は rwxrwxrwx で、危険として指摘されて返ります。1777 は rwxrwxrwt で、ふつうの注記として返り、上の用意されたモードの一つです — /tmp が実際に持っているモードです。

  • 777 — どの桁も 4+2+1 です: 所有者、グループ、そのほか全員に読み取り・書き込み・実行。何かを守るものは残りません: どのアカウントもファイルを書き換えられ、どのアカウントもそれを持つディレクトリの項目を消したり差し替えたりできます。権限の問題への反射的な修正であり、ほぼ常に小さな問題を本当の問題に取り替えます。
  • 1777 — 同じ九ビットに sticky ビットを足したもので、項目の削除と改名をその項目自身の所有者だけに許します。その一つの制限が、全員に書き込みを開けたままのディレクトリを安全にし、それが /tmp が働く理由です: 誰でもそこにファイルを作れて、誰も他人のファイルを外せません。

この区別はその他にも実行があるところでしか成り立たず、ツールはそこに厳しいです。1666 は rw-rw-rwT で、どのグループにも実行がないところに立った sticky ビットです。その形のものは使えるディレクトリになりえないので、sticky ビットは何も守らず、モードは 666 とまったく同じに、誰でも書き込み可能として最も重く指摘されます。大文字の T が同じことを一文字で言っています。

つまり、共有しなければならないディレクトリが欲しいのは 1777、さらに言えば正しいグループを付けた 775 です。そして開かないファイルは、ほぼ常に 777 の出番ではなく所有関係の問題です。

よくある質問

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 は変えられないので、無視されます。
入力した内容はサーバーに送られますか?
いいえ。ツール全体がブラウザ内で動く計算です。何もアップロード・記録・保存されず、だからネットワーク接続がまったくなくても動きます。
chmod 711 は何をしますか?
所有者にはすべてを与え、グループとそのほか全員には実行だけを与えます — rwx--x--x です。ディレクトリではそれは、すでに知っている経路へ通り抜けられるが中身を一覧できないという意味で、共有マシンのホームディレクトリがふつう欲しいものです。ファイルでは役に立ちません: シェルスクリプトは走るためにインタプリタに読まれなければならないので、読み取りなしの実行はただ失敗します。
chmod 777 と chmod 1777 の違いは何ですか?
一ビット — 先頭の 1 として書かれる sticky ビットで、最後の文字を x から t に変えます。どちらもどのアカウントにも読み取り・書き込み・実行を与えます。1777 はそれに加えて、項目の削除と改名をその所有者だけに許します。だからこのツールは 777 をほぼ正しくないと指摘し、1777 は /tmp のような共有ディレクトリの標準的なモードと呼びます。
新しいファイルが 644、新しいディレクトリが 755 で出てくるのはなぜですか?
umask のためです。ファイルを作るプログラムは 666 を求め、ディレクトリを作るプログラムは 777 を求めますが、umask はファイルが存在する前にそこからビットを落とします。ふつうの値 022 はグループとその他から書き込みを取り上げるので、644 と 755 が残ります。自分の値はシェルで umask を実行すれば見えます: 002 なら 664 と 775、077 なら 600 と 700 です。
rwxr-xr-x はどういう意味ですか?
755 を書き出したものです。三文字ずつ読みます: rwx は所有者で、読み取り・書き込み・実行あり。r-x はグループで、読み取りと実行はあり書き込みはなし。もう一度の r-x がそのほか全員です。横棒はその権限が切れていることを意味します。この文字列をここの「記号」欄に貼れば、「8 進数」の欄に 755 が出ます。

関連するツール