Chmod 計算ツール

所有者・グループ・その他の読み取り・書き込み・実行にチェックを入れるだけで、8 進数の chmod 値、記号表記の rwx 文字列、そのまま貼り付けられるコマンドが得られます。

チェックを入れて数値を得る。あるいは数値を入力して、実際に何が許可されるかを確認する。 パーミッションは 3 つの対象——ファイル所有者、所有グループ、その他すべて——に適用され、それぞれが読み取り・書き込み・実行を独立して持ちます。表を切り替えても 8 進数を入力しても、両者は同期します。

対象 読み取り (4) 書き込み (2) 実行 (1)
所有者 (u)
グループ (g)
その他 (o)

Unix パーミッションビットの読み方と書き方

3 つずつ 3 組のビット

すべての Unix ファイルは 9 個のパーミッションビットを持ち、3 個ずつ 3 組に分かれています。1 組目はファイル所有者、2 組目はファイルのグループ、3 組目はシステム上のその他すべてのユーザーに対応します。各組の 3 ビットは読み取り・書き込み・実行を意味し、それぞれ 4、2、1 の重みを持ちます。必要なビットの値を足すと 0 から 7 までの 1 桁の数になり、これがパーミッションを 3 桁の 8 進数で書く慣習の理由です。

755 のような数値もこの仕組みから来ています。所有者の桁は 7、つまり 4 + 2 + 1 なので読み取り・書き込み・実行がすべて可能です。グループとその他の桁はどちらも 5、つまり 4 + 1 なので、読み取りと実行はできても変更はできません。同じ値を記号で書くと rwxr-xr-x となり、これはまさに ls -l がファイル種別文字の後に表示する内容です。

この 3 つの動詞はディレクトリでは少し意味が変わります。読み取りは中の名前を一覧表示でき、書き込みはエントリの作成と削除ができ、実行はディレクトリを通り抜けて既知のパスへ到達できることを意味します。読み取りだけあって実行がないディレクトリはほぼ役に立ちません。名前は見えても、その先を開けないからです。

実際に入力する値

実務のほとんどは数種類の組み合わせで足ります。644(rw-r--r--)は文書やソースファイルの標準的なモードで、所有者が編集し他の人が読みます。755(rwxr-xr-x)はディレクトリや実行可能スクリプトの標準的なモードで、どちらも実行ビットがなければ使えません。600(rw-------)はファイルを所有者だけのものに保ち、これは OpenSSH が秘密鍵に要求する設定です。ディレクトリなら 700 が相当します。

他者に書き込みを許すモードは慎重に扱うべきです。777 はマシン上のどのアカウントからもファイルを上書き・削除できる状態にし、正解であることはまずありません。理解しないままパーミッションエラーを最速で消す手段にすぎないのです。Web サーバーがアップロードディレクトリに書き込めないときの本当の修正は、たいてい chown で所有ユーザーやグループを変えることであり、ファイルを世界に開放することではありません。

パーミッションは umask とも相互作用します。新規ファイルはデフォルトモードから umask の値を差し引いて作成され、一般的な umask は 022 です。新しく作ったファイルが 666 ではなく 644 になるのはこのためです。

setuid、setgid、スティッキービット

おなじみの 3 桁の前にはもう 1 桁を置くことができ、そこには setuid(4)、setgid(2)、スティッキービット(1)という 3 つの特殊ビットが入ります。これらはプログラムが誰の権限で動くか、ディレクトリが内部に作られたファイルをどう扱うかを変えます。

実行ファイルの setuid は、起動したユーザーではなくファイル所有者の権限でプログラムを動かします。passwd が一般ユーザーの実行でシステムファイルを更新できるのはこの仕組みによるもので、setuid バイナリが厳しく監査される理由でもあります。1 つの不具合が所有者権限への近道になるからです。setgid はグループについて同じ働きをします。ディレクトリの setgid はより穏やかな意味を持ち、内部に作られた新規ファイルがそのディレクトリのグループを継承するため、共有プロジェクトフォルダを誰が書き込んでも一貫した状態に保てます。

スティッキービットは /tmp でおなじみで、通常 1777 と書かれます。誰でもディレクトリ内にファイルを作成できる一方、削除は各ファイルの所有者だけに制限されるため、ユーザーが互いの一時ファイルを消すことはできません。ロング形式の一覧ではこれらのビットが実行文字を置き換えます。x の代わりの s は setuid か setgid が有効、大文字の S はビットは立っているが実行権限がない状態、t はスティッキービットを示します。

オープンソースに関する注記:バニラ JavaScript で実装。サードパーティライブラリは使用していません。

よくある質問

755 は具体的に何を意味しますか?
所有者は読み取り・書き込み・実行が可能で、グループとその他は読み取りと実行はできても変更はできません。ディレクトリや、他のユーザーが実行する必要のあるスクリプトの標準的なモードです。
スクリプトは読めるのに permission denied と出ます。なぜですか?
ファイルを読むことと実行することは別のビットです。スクリプトには実行しようとするユーザー向けの実行ビットが必要なので 644 では足りません。755 にするか、インタプリタ経由で明示的に実行してください。
777 が正しい選択になることはありますか?
共有マシンやインターネットに公開されたマシンではまずありません。ローカルのどのアカウントからもファイルを変更・削除できてしまうためです。サービスが書き込めない場合はモードを広げるのではなく所有者かグループを変更してください。
644 と 0644 の違いは何ですか?
標準の 9 ビットについては違いはありません。先頭の 0 は特殊ビットの桁で、0 にすると setuid、setgid、スティッキービットがクリアされます。4 桁で書くのは単なる習慣であることが多いです。
SSH が秘密鍵を受け付けないのはなぜですか?
OpenSSH は他のユーザーが読める秘密鍵を拒否します。鍵を 600 に、それを含む .ssh ディレクトリを 700 にすれば警告は消えます。
chmod は macOS と Linux で同じ挙動ですか?
数値モードは同一です。違いが出るのは拡張属性と ACL の部分で、macOS はパーミッション文字列の後に `+` を付けて示しますが、これは chmod だけでは管理できません。