chmod 755と644の意味:数字とrwxの対応、ディレクトリのx権限
chmod 755の7や5は、読み取り・書き込み・実行のビットを足した8進数です。POSIXをもとに、数字とrwxの対応、所有者・グループ・その他の判定、ディレクトリでのr・w・xの意味、umaskとchmod -Rの注意点をまとめました。
ファイルの権限は chmod 755 deploy.sh や chmod 644 index.html のように数字で指定することがよくあります。この3桁の数字は、9個の権限ビットを8進数で書いたものです。以下で「規格」は POSIX.1-2024(IEEE Std 1003.1-2024)を指し、GNU や Linux の文書にしかない内容はそのつど明記します。実行例は、Debian 13.7 のコンテナで GNU coreutils 9.7 の chmod を一般ユーザーとして実行した結果です。
1桁は3ビット
規格の chmod の対応表では、所有者の読み取り・書き込み・実行が 0400・0200・0100、グループが 0040・0020・0010、その他のユーザーが 0004・0002・0001 です。
1桁の中で見ると読み取りが4、書き込みが2、実行が1で、立っているビットの値を足したものがその桁の数字になります。
| 数字 | ビット | ls -l の表示 |
|---|---|---|
| 7 | 4+2+1 | rwx |
| 6 | 4+2 | rw- |
| 5 | 4+1 | r-x |
| 4 | 4 | r-- |
| 0 | なし | --- |
755 は所有者7、グループ5、その他5なので rwxr-xr-x、644 は rw-r--r-- です。755 を2進数で書くと 111 101 101 で、3桁ずつ区切るとそのまま rwx の欄に対応します。8進数と2進数の変換は進数変換ツールで確かめられます。
ls -l の先頭に出る文字列の1文字目はファイルの種類です。- は通常ファイル、d はディレクトリ、l はシンボリックリンクを表します。続く3文字ずつが所有者・グループ・その他の権限です。権限ビットのほかに追加または代替のアクセス制御の仕組みがあるファイルでは、末尾にもう1文字付くことがあります。
数字で指定すると、今の権限に足すのではなく丸ごと置き換えます。数字で立っているビットが設定され、それ以外の権限ビットは消えます。実行権限があったファイルに chmod 644 をすると、実行ビットはなくなります。
3つの欄のうち1つだけを見る
どの欄が使われるかは、プロセスのユーザーIDとグループIDで決まります。
- プロセスの実効ユーザーIDがファイルの所有者と一致すれば、所有者クラスです。
- 所有者クラスでなく、実効グループIDか補助グループIDのどれかがファイルのグループと一致すれば、グループクラスです。
- どちらでもなければ、その他クラスです。
この順にクラスを1つだけ選び、そのクラスのビットだけを見ます。所有者の欄が空なら、グループやその他の欄に読み取り権限があっても、所有者はファイルを読めません。
$ echo hi > f
$ chmod 044 f
$ ls -l f
----r--r-- 1 u u 3 Oct 2 02:04 f
$ cat f
cat: f: Permission denied
ユーザー u はファイルのグループ u にも属していますが、所有者クラスと判定されるので、グループ欄の r は使われません。
特権を持つプロセスは別です。規格では、適切な特権があれば読み取り・書き込み・ディレクトリの検索が許可され、実行は3つの実行ビットのどれかが立っていれば許可されます。
Linux の path_resolution(7) によると、Linux はこの特権をケーパビリティに分けています。CAP_DAC_OVERRIDE は権限チェックを無視しますが、実行権限は実行ビットが1つ以上立っているときだけ与えます。root では上の例の読み取りが拒否されないため、権限の実験は一般ユーザーで行う必要があります。
ディレクトリでの r・w・x
同じビットでも、ディレクトリでは意味が変わります。GNU coreutils の文書では、ディレクトリの読み取りは内容の一覧表示、書き込みはファイルの作成と削除、実行はディレクトリ内のファイルへのアクセスを意味します。規格はディレクトリの x を検索(search)権限と呼びます。
path_resolution(7) によると、パスをたどるときに通るディレクトリごとに検索権限が必要で、なければ EACCES エラーになります。
そのため r と x は別々に働きます。
$ mkdir box && echo hi > box/a.txt
$ chmod 600 box # rw-:一覧は読めるが検索できない
$ ls box
a.txt
$ cat box/a.txt
cat: box/a.txt: Permission denied
$ chmod 300 box # -wx:検索はできるが一覧は読めない
$ ls box
ls: cannot open directory 'box': Permission denied
$ cat box/a.txt
hi
r だけなら名前は見えても中のファイルは開けません。x だけなら一覧は表示できませんが、既知の名前を検索できます。実際にファイルを開けるかどうかは、そのファイル自体の権限やほかのアクセス制御にも依存します。一覧を見て中のファイルにアクセスするには、r と x の両方が必要です。
同じ 600 と 300 の例は macOS 15.6.1 でも実行しました。cat が許可・拒否されるケースは同じでした。ただし 600 では ls が a.txt と一緒に ls: fts_read: Permission denied というエラーを出し、300 のときのエラー文言も異なりました。
削除できるかはディレクトリが決める
ファイルの削除に使われる unlink() は、ディレクトリエントリ、つまりファイルの名前を消す操作です。この点はファイルを削除してもディスク容量が空かない理由でも扱っています。
規格が unlink() の EACCES の条件として挙げているのは、パス上のディレクトリの検索権限と、消すエントリを含むディレクトリの書き込み権限です。ファイル自身の書き込みビットはこの条件に入っていません。ファイルが読み取り専用であることだけでは、削除は止められません。
複数のユーザーが使うディレクトリでは、S_ISVTX ビットが削除を制限します。書き込み可能なディレクトリにこのビットが立っていると、中のファイルを削除したり名前を変えたりできるのは、ファイルの所有者、ディレクトリの所有者、適切な特権を持つプロセスに限られます。ファイルへの書き込み権限しかないプロセスまで許すかどうかは実装定義です。
GNU chmod の文書はこのビットを restricted deletion flag または sticky bit と呼び、/tmp のように誰でも書き込めるディレクトリでよく使われると説明しています。ls -l では、その他の欄の最後の文字が t または T になります。t はその他に検索権限がある場合、T はない場合です。
先頭の桁
規格の対応表には先頭の桁もあります。4000 が set-user-ID、2000 が set-group-ID、1000 が S_ISVTX です。GNU chmod の通常の数値モードは1〜4桁で、省略された桁は先頭の0として扱われます。そのため 755 は 0755 と同じです。
この桁の扱いには実装による違いがあります。規格は、通常ファイルなら数字に含まれない set-user-ID と set-group-ID のビットを消すとしていますが、それ以外の種類のファイルは実装に任せています。
GNU chmod は、ディレクトリの2つの set-ID ビットを明示しない限りそのまま残します。数値モードで消すには、00755 のようにさらに先頭へ0を付けられます。実際に g+s を付けたディレクトリに chmod 755 をするとモードは 2755 のまま残り、chmod 00755 の後で 755 になりました。
シンボリックモードと umask
chmod u=rwx,go=rx は、rwx の9ビットを 755 と同じ値にそろえます。= は指定した欄をその値に合わせ、+ と - は今の権限に足したり引いたりします。
u・g・o・a を省略するときは注意が必要です。その場合、プロセスのファイルモード作成マスクである umask で立っているビットは変更されません。
umask が 022 のシェルで、モードが 444 のファイルに chmod +w をすると 644 になり、chmod a+w をすると 666 になりました。規格の chmod の説明も同じ理由で、chmod a-w file と chmod -- -w file の違いを例に挙げています。
umask はファイルを作るときにも使われます。マスクで立っているビットは新しいファイルのモードから消されます。touch は全員への読み書きである 0666 を、mkdir コマンドは 0777 を要求します。umask が 022 なら、それぞれ 644 と 755 になります。今回の実行でも同じ結果になりました。
chmod -R 755 と大文字の X
-R はディレクトリとその下にあるすべてのファイルのモードを変えます。ディレクトリに合わせて chmod -R 755 をすると、通常ファイルにも実行ビットが立ちます。
こういうときに使えるのが、シンボリックモードの大文字 X です。X は、対象がディレクトリであるか、今のモードに実行ビットが1つでも立っているときだけ実行または検索ビットとして扱われます。それ以外のファイルでは無視されます。
$ mkdir -p t/d && touch t/d/x.txt
$ chmod -R u=rwX,go=rX t
$ stat -c '%A %a %n' t t/d t/d/x.txt
drwxr-xr-x 755 t
drwxr-xr-x 755 t/d
-rw-r--r-- 644 t/d/x.txt
$ chmod -R 755 t
$ stat -c '%A %a %n' t/d/x.txt
-rwxr-xr-x 755 t/d/x.txt
上の u=rwX,go=rX では、実行ビットが1つでも立っているファイルには go=rX によってグループとその他にも実行ビットが立ちます。
-R でディレクトリのモードを中のファイルより先に変えるか後に変えるかは、実装によって違います。規格は、自分自身も入れなくなるような形で階層全体の権限を外さないよう勧めています。
この記事の範囲
規格は、実装が権限ビットのほかに追加または代替のアクセス制御を持つことを認めています。追加の仕組みは、権限ビットが許す範囲をさらに狭める方向に働きます。
GNU の文書も ACL をファイルシステムごとの属性として挙げています。ACL などの追加アクセス制御、ネットワークファイルシステム、Windows の権限モデルはこの記事では扱いません。そうした環境では、権限ビットだけで結果を判断できません。
参照した仕様とドキュメント
- POSIX.1-2024:
chmod、General Concepts(ディレクトリの保護、ファイルアクセス権限)、Definitions(所有者・グループ・その他のクラス)、<sys/stat.h>、unlink()、open()、umask()、ls、touch、mkdir - GNU Coreutils マニュアル:Mode Structure
- Linux man-pages:
chmod(1)、path_resolution(7)
リンクと内容は2026年10月2日に確認しました。