Linuxのパーミッション一覧

`ls -l`したときに出てくるパーミッションの一覧。

一部分だけの解説はいくらでも見つかるのだが、全部まとまってるものがどうも見当たらなかったので作った。
以下は特に断らない限りLinuxについて。
それ以外のOSでは異なる場合がある。

以下、`ls -l`したときに出てくる項目について↓の表記で解説する。

```
  d|rwx|rws|rwt|.
  A|BCD|EFG|HIJ|K
```

# [A|---|---|---|-]

## d

ディレクトリである。
自分自身`.`および親ディレクトリ`..`も`d`になる。

## l

シンボリックリンクである。
ハードリンクは`l`にならない。
というかハードリンクは実ファイルと区別がつかない。

## b

ブロックデバイスである。
ブロックデバイスは、HDDやメモリなど[ブロック単位でデータの読み書きを行う機器](http://itpro.nikkeibp.co.jp/article/Keyword/20081023/317625/)のこと。

## c

キャラクタデバイスである。
キャラクタデバイスは、コンソールやキーボードなどの[バイト単位でデータの読み書きを行う機器](http://itpro.nikkeibp.co.jp/article/Keyword/20081128/320380/)のこと。
標準入出力のほか、`/dev/null`や`/dev/urandom`等のファイルだかなんなんだかよくわからない奴らもだいたいこれのようだ。

## p

FIFOである。
[FIFO](https://qiita.com/richmikan@github/items/bb660a58690ac01ec295)は主にプロセス間通信で使用する名前付きパイプで、`|`のすごいやつ。

## s

ソケットである。
[ソケット](https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_71/rzab6/howdosockets.htm)は主にプロセス間、ネットワーク間でデータをやりとりするためのファイルのようなもの。

## -

上記以外、いわゆる普通のファイル。


# [-|BCD|---|---|-] / [-|---|EFG|---|-] / [-|---|---|HIJ|-]

それぞれ自分、同じグループ、第三者が持ってる権限。
BEHは読み取り権限、CFIは書き込み権限、DGJは実行権限を表す。


# [-|B--|E--|H--|-]

## r

読み取り権限がある。

ファイルに読み取り権限がある場合、ファイルの中身を読み込むことができる。
ファイルに読み取り権限があっても、そのディレクトリにも読み取り権限がなければ読み込みはできない。

ディレクトリに読み取り権限がある場合、`ls`でファイルを一覧表示することができる。

## -

読み取り権限がない。

ファイルに読み取り権限がない場合、ファイルの情報は取得できるが中身を読み込むことはできない。

ディレクトリに読み取り権限がない場合、ファイル名一覧を取得することができない。
実行権限があれば`cd`で移動や名指しで情報取得することはできる。


# [-|-C-|-F-|-I-|-]

## w

書き込み権限がある。

ファイルに書き込み権限がある場合、ファイルの上書きや更新を行える。
書き込みできるが読み込みできないファイルも作成できる。

ディレクトリに書き込み宣言がある場合、ファイルの追加や削除が行える。

## -

書き込み権限がない。

ファイルに書き込み権限がない場合は、ファイルの上書きや更新ができなくなる。
ファイルに書き込み権限がなくても、ディレクトリに書き込み権限があればファイルの削除はできる。

ディレクトリに書き込み権限がない場合、ファイルの追加や削除が行えない。
ファイルの書き込み権限があれば編集することは可能。


# [-|--D|--G|--J|-]

## x

実行権限がある。

ファイルに実行権限がある場合、そのファイルは実行することができる。
読み込み権限がなくても実行はできる。

ディレクトリに実行権限がある場合、ディレクトリに`cd`や`ls -l`を行うことができる。

## -

実行権限がない。

ファイルに実行権限がない場合は実行できない。

ディレクトリに実行権限がない場合、ディレクトリ内のファイル名一覧だけは表示できるが、ファイル情報を得ることはできず`cd`で移動することもできない。


# [-|--D|---|---|-]

## s

SUID(Set User ID)。

ファイルにSUIDがある場合、実行ユーザがファイル所有者になる。
通常は実行したユーザがコマンドの実行ユーザになるが、SUIDがついている場合はそのファイルの所有者が実行ユーザになる。
例として、`/usr/bin/passwd`は所有者が`root`ユーザで実行権限が`s`であるため、誰が実行してもrootユーザの権限で実行される。
そのため`root`ユーザしか書き込み権限のない`/etc/shadow`に書き込める、ということになる。

ディレクトリのSUIDは特に意味がないようだ。

## S

実行権限のないファイルにSUIDを付けると`s`ではなく`S`になる。
どういう効果があるかはよくわからない。


# [-|---|--G|---|-]

## s

SGID(Set Group ID)。

ファイルにSGIDがある場合、実行ユーザがファイル所有グループになる。
例として、`/usr/bin/wall`はグループが`tty`ユーザで実行権限が`s`であるため、誰が実行してもttyユーザの権限で実行される。

ディレクトリにSGIDがある場合、ディレクトリ内部で作成したファイルの所属グループがディレクトリのグループと同じになる。
所有者は作成したユーザになる。

## S

実行権限のないファイルにSGIDを付けると`s`ではなく`S`になる。
どういう効果があるかはよくわからない。


# [-|---|---|--J|-]

## t

[スティッキービット](http://itpro.nikkeibp.co.jp/article/Keyword/20070518/271475/)。

ディレクトリにスティッキービットがある場合、そのディレクトリ内のファイルは所有者本人しか削除・リネームできない。
中身の編集はできる。

ファイルのスティッキービットは特に意味がないようだ。


## T

実行権限のないディレクトリにスティッキービットを付けると`t`ではなく`T`になる。
どういう効果があるかはよくわからない。


# [-|---|---|---|K]

## .

セキュリティコンテキスト。

SELinuxによってアクセス制限用のラベルが設定されている。
`ls -Z`で詳細を閲覧可能。


## (何もなし)

セキュリティコンテキストがない。


# その他

`root`は例外で、書き込み権限のないファイルやスティッキービットのあるファイルを削除したりと、ほぼ何でもできる。

シンボリックリンクのパーミッション表示は特に意味がない。
シンボリックリンクに対してchmodすると、シンボリックリンク自体は変わらず、リンク先ファイルの権限が変更される。

# 感想

まさかJP1のマニュアル内に[ほぼ完全なリスト](http://itdoc.hitachi.co.jp/manuals/3021/3021313330/JPAS0341.HTM)があるとは思わなかった。
ほとんど書き上げた後に見つけてしまったでござるの巻き。

# 参考

[Man page of CHMOD](https://linuxjm.osdn.jp/html/gnumaniak/man1/chmod.1.html)
[SELinux コンテキスト - ファイルのラベル付け](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-SELinux_Contexts_Labeling_Files.html)
[Stray Penguin -Linux Memo-](http://www.asahi-net.or.jp/~aa4t-nngk/perm.html)
[chmod ：SUID、GUID、スティッキービットまとめ](http://qiita.com/aosho235/items/16434a490f9a05ddb0dc)