【初心者から上級まで】Linuxの権限（パーミッション）総まとめ

# パーミッションとは
Permissionは英語で「許可」を表す。Linux用語としてのパーミッションも同じ意味であるが、実際に使ってみないとその意義や役割が分からない。それは本稿の中で挟む「演習」を実践してみてほしい。
## Linux上で扱われるパーミッションの種類
兎にも角にも、本稿のポイントは、
#### （ア）全てのファイル・ディレクトリに
#### （イ）３種類のパーミッションが
#### （ウ）３者ごとに決められる
ということだ。これだけだと良く分からないので、これをより詳細に見てみよう。
### 「３種類の」パーミッション
1. ファイルを読む権利(`r`)
    たとえば、`cat`コマンドや`more`コマンド、 `less`コマンドでファイルの中身を見る権利の事だ。
1. ファイルに書き込む権利(`w`)
    これは、ファイルを開いて内容を編集する権利のことだ。
1. ファイルを実行する権利(`x`)
    
> ( )内のアルファベットはそれぞれ、読む(**r**ead)書く(**w**rite)実行する(**ex**ecute)から来ています。

### 「３者に対する」パーミッション
* そのファイルを持っている人（ユーザ）
* そのファイルを持っているグループ
* その他の人（ユーザ）

### 「それぞれのファイル」のパーミッション
それぞれのファイルごとに、「３種類の」「３者に対する」パーミッションが存在する。
確認する方法は以下の通り。
```
$ ls -l
```
そして、下は実際の僕のLinux上の画面だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629535/cf7e6c94-404d-dbfb-2179-2a830b907b34.png)
左の方に`drwxr-xr-x` `-rwx------` `-rw-r--r--` `-rw-r--r--`という見慣れない文字列がある。これこそがパーミッションを表す記号（パーミッションコード）なのだ。次節から、それを分解して見てみよう。

# パーミッションコードの構成
まず、パーミッションコードは１０桁である。分解すると、１・３・３・３の４つの塊に更に分解できる。
### １文字目：ファイルの種類
1. ファイル(`-`)
1. シンボリック(`l`)
1. ディレクトリ(`d`)
1. キャラクタデバイス(`c`)
1. ソケット(`s`)
1. ブロックファイル(`b`)
1. FIFO(`p`)
1. その他(`?`)

### ３・３・３文字目：ユーザ・グループ・その他のユーザのパーミッション
（以下：復習）
> 「それぞれのファイルに、３種類のパーミッションが、３者ごとに決められる。」

これが基本である。

３種類のパーミッション
→ファイルを読む権利(`r`)・ファイルに書き込む権利(`w`)・ファイルを実行する権利(`x`)

３者に対するパーミッション
→①ユーザに対するパーミッション・➁グループに対するパーミッション・③その他のユーザに対するパーミッション
（以上：復習）

これをもとに、実際のパーミッションコードを読解してみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629535/bb7759a2-5986-a8bf-5b5e-484b4ceadf4e.png)
### `drwxr-xr-x`
`d`:ディレクトリである。
`rwx`: ①所有ユーザに、読む権利・書き込む権利・実行する権利がある。
`r-x`: ➁所有グループに、読む権利・実行する権利がある。
`r-x`: ③その他のユーザに、読む権利・実行する権利がある。

### `-rwx------`
`-`:ファイルである。
`rwx`: ①所有ユーザに、読む権利・書き込む権利・実行する権利がある。
`---`: ➁所有ユーザを除く所有グループには、三つの内いずれの権利もない。
`---`: ③その他のユーザには、三つの内いずれの権利もない。
### `-rw-r--r--`
`-`: ファイルである。
`rw-`: ①所有ユーザに、読む権利・書き込む権利がある。
`r--`: ➁所有グループに、読む権利のみある。
`r--`: ③その他のユーザに、読む権利のみある。

### `-rw-r--r--`
`-`: ファイルである。
`rw-`: ①所有ユーザに、読む権利・書き込む権利がある。
`r--`: ➁所有グループに、読む権利のみある。
`r--`: ③その他のユーザに、読む権利のみある。

# 2種類の数字版パーミッションコード(2進数/8進数)
以上まででパーミッションコードの構造が分かった。また、実際にどのような形式でコードが出力されるかも理解した。
ここから、そのパーミッションコードを業務で使うための事項を抑える。具体的には、ファイルやディレクトリのパーミッションコードを確認したり変更したりする段階に入る。そのためには、2進数バージョンと8進数バージョンという、2種類のパーミッションコードを理解する必要がある。
数字版のパーミッションコードでは、最初の一文字目(`d` `-` `c` `l`など)は無視し、残りの9文字の有無で数値化する。

## 2進数バージョン
`r` `w` `x` があったら1、なかったら(`-`)0。
### `drwxr-xr-x`
`d`: 数字版パーミッションコードでは、最初の文字は無視。
`rwx`: 111
`r-x`: 101
`r-x`: 101

### `drwxr-xr-x`
`d`: 数字版パーミッションコードでは、最初の文字は無視。
`rwx`: 111
`r-x`: 101
`r-x`: 101

### `-rwx------`
`-`: 数字版パーミッションコードでは、最初の文字は無視。
`rwx`: 111
`---`: 000
`---`: 000
### `-rw-r--r--`
`-`: 数字版パーミッションコードでは、最初の文字は無視。
`rw-`: 110
`r--`: 100
`r--`: 100

### `-rw-r--r--`
`-`: 数字版パーミッションコードでは、最初の文字は無視。
`rw-`: 110
`r--`: 100
`r--`: 100


## 8進数バージョン
8進数バージョンでは、2進数バージョンを全て8進数化する。
### `-rwx------`
`-`: 数字版パーミッションコードでは、最初の文字は無視。
`rwx`: 111 →7
`r-x`: 101 →5
`r-x`: 101 →5
### `-rw-r--r--`
`-`: 数字版パーミッションコードでは、最初の文字は無視。
`rw-`: 110 →6
`r--`: 100 →4
`r--`: 100 →4

### `-rw-r--r--`
`-`: 数字版パーミッションコードでは、最初の文字は無視。
`rw-`: 110 →6
`r--`: 100 →4
`r--`: 100 →4

次に、それらがどのように必要なのか実感するため、まずは業務で使うコマンドを俯瞰しよう。

### パーミッションコードを確認する
```
$ ls -l [ファイル・ディレクトリ名]
```
これは先ほども確認した。例えば、`main.py`というファイルのパーミッションを知りたい時は、
```
$ ls -l main.py
```
とすればよい。引数無しの以下のコマンド
```
$ ls -l
```
を実行すると、カレントディレクトリすべてのファイル・フォルダのパーミッションコードが列挙されて表示される。
### パーミッションコードを変更する
```
$ chmod [8進数パーミッションコード] [ファイル・ディレクトリ名]
```
これにより、`[ファイル・ディレクトリ名]`で指定したファイル・ディレクトリの権限設定を、`[8進数パーミッションコード]`のようにすることができる。

例えば、`main.py`というファイルの、所有ユーザと所有グループには「読む・書き換える・実行する」権利を与え、その他のユーザには「読む・実行する」権利を与えるコマンドは以下の通り。
```
$ chmod 775 main.py
```
> 775 → 7-7-5 → 111-111-101 → rwxrwxr-x

# 最後に
やや詰め込み過ぎた感はあったが、Linuxの権限について必要な事項は完全に網羅した。是非とも、実際に自分のLinux環境で色々触り、業務でも使ってみてほしい。
P.S. umaskについても言及する必要がありそうなので、近いうちにこの記事を編集する形で付け足す。