chmod 計算機
権限をチェックしてchmod 8進数・シンボリック・コマンドを生成
チェックボックスを切り替えるか、8進数・シンボリック値を入力すると残りが自動で更新されます。
| — | 読み取り (r) | 書き込み (w) | 実行 (x) |
|---|---|---|---|
| 所有者 (u) | |||
| グループ (g) | |||
| その他 (o) |
パーミッションの概要
umask の計算
新規ファイルは666、新規ディレクトリは777からumaskのビットを除いた権限で作成されます。
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
chmod 計算機について
このツールは、Unixのファイル権限を3つの表記の間で変換します。755のような8進数、ls -lに出るrwxr-xr-xのような記号、そしてチェックボックスで切り替える個々のビットです。4755や1777のような4桁の8進数では先頭の桁をsetuid・setgid・stickyの特殊ビットとして読み、ls -lの行をファイル種別の文字ごと(-rwsr-xr-x)貼り付けることもできます。
権限の数字は暗記するより計算の仕組みを知っておくほうが早く読めます。以下では8進数の成り立ち、特殊ビットが記号でs・t・S・Tになる規則、777が危険な理由、新しいファイルの既定権限を決めるumaskを扱います。
8進数1桁=3ビット
読み取りr=4、書き込みw=2、実行x=1の合計が1桁です。7=rwx、6=rw-、5=r-x、4=r--。3桁は左から所有者、グループ、その他です。755は「所有者は全部、他は読み取りと実行」、640は「所有者は読み書き、グループは読み取り、その他はなし」です。
8進数を使うのは3ビットがちょうど1桁に収まるからです。プログラムから権限を数値で渡すとき、0o755(Python)や0755(C、Perl)の8進数表記を忘れると10進数の755が渡り、8進数では1363というstickyビット付きの妙な権限になります。
ディレクトリではr・w・xの意味が変わる
ディレクトリのrは中の名前一覧を読む権限、wは中にファイルを作る・消す・名前を変える権限、xはそのディレクトリをパスとして通過する権限です。rだけでxがなければlsで名前は見えてもファイルは開けません。
ファイルを削除できるかどうかは、ファイル自身ではなく、それを含むディレクトリのwで決まります。読み取り専用(444)のファイルでも、ディレクトリに書き込めれば削除できます。これを防ぐのが後述のstickyビットです。
特殊ビット:setuid 4、setgid 2、sticky 1
4桁の先頭が特殊ビットです。記号表記には専用の欄がなく、該当する対象の実行位置を置き換えます。実行ビットも立っていれば小文字(s、t)、立っていなければ大文字(S、T)です。大文字はたいてい設定ミスのサインで、4644はrwSr--r--となり、実行できないファイルのsetuidには意味がありません。
- setuid(4000):実行した人ではなくファイル所有者の権限で動きます。一般ユーザーがパスワードを変更できるのは、passwdがroot所有のsetuid(-rwsr-xr-x)だからです。Linuxはシェルスクリプトなどインタープリタ型スクリプトのsetuidを無視します。
- setgid(2000):ファイルではグループ権限で実行し、ディレクトリでは中に作ったファイルがディレクトリのグループを引き継ぎます。共有フォルダを2775や2770にする理由です。
- sticky(1000):ディレクトリに付けると、書き込み権限があってもファイルの所有者(またはディレクトリの所有者、root)しかそのファイルを削除・改名できません。誰でも書ける/tmpが1777(drwxrwxrwt)なのはこのためです。
777で何が開いてしまうか
「権限エラーが出たので777にしたら動いた」はよくある対処ですが、実際にはそのサーバーの全アカウント・全プロセスに書き込みを許しています。アップロード用フォルダが777なら、同じサーバーの別サイトや脆弱なプラグインが実行可能なスクリプトを置けますし、設定ファイルが666なら誰でもパスワードを書き換えられます。
権限エラーの原因の多くは「その他」の不足ではなく、所有者やグループの不一致です。Webサーバーのプロセスが書き込むフォルダなら、chownでグループを合わせて775(または2775)にするのが普通です。OpenSSHは秘密鍵がグループやその他から読める状態だと使用を拒否するため、鍵は600にします。
umaskは引き算ではなくマスク
新しいファイルの権限は、プログラムが要求した値(通常ファイル666、ディレクトリ777)からumaskで立っているビットを落としたものです。umask 022ならファイル644、ディレクトリ755です。見た目は引き算ですが実際はビットマスク(要求値 AND NOT umask)なので、umask 033でファイルを作ると666−033=633ではなく644になります。もともと立っていない実行ビットは落としようがないからです。
ツール下部の「umask の計算」にumask(例: 022、0027)を入れると、新規ファイル(666基準)と新規ディレクトリ(777基準)の権限を8進数とrwxで表示します。umaskは作成時にだけ効きます。既存のファイルはchmodで変えるまで元の権限のままです。
例
一般的な実行ファイル
- 入力
755- 結果
rwxr-xr-x / 0755
7=4+2+1、5=4+1。所有者だけが編集し、誰でも実行できます。
passwdコマンド
- 入力
-rwsr-xr-x- 結果
4755
所有者の実行位置のsはsetuid+実行です。先頭のファイル種別文字は無視して読みます。
/tmpディレクトリ
- 入力
1777- 結果
rwxrwxrwt
誰でも書けますが、t(sticky)により他人のファイルは消せません。
大文字Sが出る場合
- 入力
4644- 結果
rwSr--r--
実行ビットなしでsetuidだけが立っています。効果のない設定です。
umaskの計算
- 入力
要求666、umask 027- 結果
640(rw-r-----)
グループのw(2)、その他のrwx(7)を落とします。ディレクトリなら750です。
使い方
- 8進数(755、4755)か記号(rwxr-xr-x、ls -lの行の先頭)を入力します。
- チェックボックスでビットを切り替えると、両方の表記が同時に変わります。
- 生成されたchmodコマンドをコピーします。
よくある質問
chmod 777がよくない理由は?
システム上の全アカウント・全プロセスがそのファイルやフォルダを変更できるようになるからです。所有者やグループを直して755や775にすれば、たいていは解決します。
ls -lに大文字のSやTが出ます。
特殊ビットは立っているのに、その位置の実行ビットが立っていない状態です。
SSHの秘密鍵の権限は?
600(rw-------)が標準です。広すぎるとOpenSSHが鍵を使いません。
644と0644は違いますか?
同じです。先頭の0は特殊ビットがないことを示します。
出典
- POSIX chmod utility (The Open Group)
- POSIX umask utility (The Open Group)
- inode(7) – Linux manual page
基準日: