よくわからなくなって、そのたびに調べてしまうので、個人的メモも兼ねてまとめておきます。
それぞれのパーミッションが果たす機能
下位9ビット(上位3ビットごとに、オーナー、グループ、その他のパーミッション)
八進数表記 | 英字表記 | ファイルの場合 | ディレクトリの場合 |
---|---|---|---|
4 | r | ファイルの中身を読める | ディレクトリのファイル一覧を読める |
2 | w | ファイルに書き込みできる | ディレクトリ内のファイルの作成・削除・パーミッション変更などが可能 |
1 | x | ファイルの実行が可能 | ディレクトリ内のファイル・サブディレクトリの中身にアクセスできる |
注意点
- オーナー、グループの順に該当するかチェックしていく(オーナーのほうがパーミッションが厳しいと、本人はアクセスできないけど第三者なら、ということもありうる)
- ファイルの削除可否は、ファイル側の権限としては設定不可能
- あるディレクトリを読み書きするには、ルートからすべての実行権限が必要
上位3ビット(特殊権限)
八進数表記 | 名前 | 英字表記 | ファイルの場合 | ディレクトリの場合 |
---|---|---|---|---|
4000 | setuid | オーナーの実行ビットがs1 | 実行ファイルを、オーナーの権限で実行 | 効果なし2 |
2000 | setgid | グループの実行ビットがs1 | 効果なし2 | 中に作られるディレクトリ・ファイルのグループを、親のグループに設定 |
1000 | スティッキービット | その他の実行ビットがt1 | 効果なし2 | オーナーあるいはグループが一致しない場合、rootを除いて中のファイルの削除ができない |
数値の早見表
Linuxでは上述のように、特殊ビットを組み合わせることがあまりないので、普通のビットの組み合わせだけ一覧にしてみます。
合計値 | 英字表記 |
---|---|
7 | rwx |
6 | rw- |
5 | r-x |
4 | r-- |
3 | -wx3 |
2 | -w-3 |
1 | --x |
0 | --- |
chmod
の使い方
コマンドとしてのchmod(1)では、英字表記と数値表記の両方を使えますが、英字表記でないとできないこともあります。
- 英字表記: 現在の状態から変更する分だけ指定できる
- 数字表記: 変更後の値を決め打ちにするしかない
ディレクトリだけ実行ビットを立てたい
よくある需要で、「ディレクトリだけ実行ビットを立てたい」というのがあります。Unixコマンドに慣れていればfind . -type d -print0| xargs -0 chmod ...
というように始めてしまうかもしれませんが、じつは再帰実行向けの特殊パーミッションとして、大文字のX
があります。chmod -R g+X dir
のように書くと、dir以下のディレクトリだけ実行パーミッションを付けてくれます。
システムコールとしてのchmod
プログラムからchmod(2)のような関数・メソッドを呼ぶ場合、引数の指定には注意が必要です。うっかり、普通の整数として「666」のように書いてしまうと、それは10進数の値なので、8進法で書きなおせば1232
、つまり-w--wx-wT
というめちゃくちゃなパーミッションになってしまいます。これを避けるためには、
- 頭に0を付けた8進数リテラルで書く4(8進数であることが役に立つ、数少ない場面の1つだと思います)
- (言語機能で対応しているなら)パーミッションごとの定数や、英字表記で書く
- 8進法文字列で書いておいて、JavaScriptであれば
parseInt(値,8)
4、PHPであればoctdec
のような関数で8進法の数値に変換する
など、ひと手間必要です。
-
それぞれ、実行ビットが立っていない場合は大文字になりますが、Linuxでは(表にあるように)実行ビットなしで特殊ビットだけ設定しても何の変化もありません。 ↩
-
あくまでLinux限定の話です。他のUnix系ではそれぞれ特有な動作をすることがあります(特に、スティッキービットの元来の機能はファイルに付与するものでした)。 ↩
-
「書けるけど読めない」というのは、普通のファイルだと追記もできないことになりますが、ディレクトリやデバイスファイルなどには有用な例もあるとのことです。 ↩
-
JavaScriptのstrictモードでは、8進法の数値リテラルや文字列の暗黙的な8進法解釈が禁止されているので、
parseInt
で8進数を明記して呼び出す必要があります。 ↩