Linuxのディレクトリのパーミッションの意味

#はじめに
Linuxのファイルやディレクトリには「誰に、どのような操作を許可するか」という権限の情報が設定されていて、これを`パーミッション`と呼ぶ。

ファイルに`パーミッション`があることは知っていたが、ディレクトにも設定されていることを知らなかったので、まとめることにする。

##ファイルのパーミッション
まず、`ls -l /bin/cat`で`catコマンド`の情報を表示する。

```
$ ls -l /bin/cat
-rwxr-xr-x 1 root root 35064 Jan 18  2018 /bin/cat
```

####ファイルタイプ
行頭の`-`はファイルタイプを表す。

|記号  |意味  |
|:-:|---|
| - |通常ファイル  |
| d |ディレクトリ  |
| l |シンボリックリンク  |

####ファイルモード
ファイルタイプの後ろの9文字（`rwxr-xr-x`）はファイルモードと呼ばれ、これによりファイルのパーミッションを表している。

9文字は`3文字ごとに1つのブロック`になっており、それぞれ「オーナー」「グループ」「その他のグループ」に分けられる。

|オーナー|グループ|その他のグループ  |
|:-:|:-:|:-:|
| rwx |r-x  |r-x |

###「rwx」の意味
rwxはそれぞれ「読み取り」「書き込み」「実行」の意味である。

|記号  |意味  |
|:-:|---|
| r |読み取り(read)  |
| w |書き込み(write)|
| x |実行(excute)  |

#### /bin/cat再確認
```
$ ls -l /bin/cat
-rwxr-xr-x 1 root root 35064 Jan 18  2018 /bin/cat
```
上記`/bin/cat`だが、rootユーザー以外の書き込みが禁止されている。
書き込もうとしたら`'readonly' option is set (add ! to override)`上書きするなと怒られた。

##ディレクトリのパーミッション
本題のディレクトリのパーミッションを確認する。

`lsコマンド`でディレクトリのパーミッションを確認するためには`-l`オプションに加えてディレクトリ自身の情報を表示する`-d`オプションを使う必要がある。

```
$ ls -ld Code/
drwxrwxr-x 4 vagrant vagrant 4096 Apr  8 14:54 Code/
```

###ディレクトリのパーミッションの意味
ディレクトリのパーミッションもファイルと同じように「r」「w」「x」という記号を利用するが、**それぞれの記号の意味は、ファイルの場合とは異なることがある（特に「x」）。 ~~全く違う意味を持つ。~~**　
※@angel_p_57様のご指摘により修正しています。コメント欄をご確認ください。


|記号  |意味  |
|:-:|---|
| r |読み取り(ディレクトリに含まれるファイル一覧の取得)  |
| w |書き込み(ディレクトリの下にあるファイル・ディレクトリの作成、削除)|
| x |実行(ディレクトリをカレントディレクトリにする)  |

###「r」読み取り(ディレクトリに含まれるファイル一覧の取得)の確認


ここで一度ファイルを作ってテストしてみる。

```
$ mkdir permissionTest            //permissionTestというディレクトリ作成
$ touch permissionTest/file1.txt  //permissionTest配下にfile1.txtというファイルを作成
$ ls -ld permissionTest/          //permissionTestのディレクトリを確認

drwxrwxr-x 2 vagrant vagrant 4096 Apr 23 11:50 permissionTest/

$ ls -l permissionTest/　　　　　　　　//permissionTest配下のファイルを確認

-rw-rw-r--  1 vagrant vagrant    0 Apr 23 11:50 file1.txt     //成功
```

permissionTestディレクトリのパーミッションを読み取り不可にし、アクセスしてみる。

```
$ chmod a-r permissionTest/  //全てのユーザーの読み取り禁止
$ ls -ld permissionTest/     

d-wx-wx--x 2 vagrant vagrant 4096 Apr 23 11:50 permissionTest/    //読み取り禁止になった。

$ ls  permissionTest/
ls: cannot open directory 'permissionTest/': Permission denied

```
**許可がないのでアクセスできない。**

###「w」書き込み(ディレクトリの下にあるファイル・ディレクトリの作成、削除)の確認

ディレクトリに書き込み(w)が設定されている場合、その配下のファイルに書き込み制限があっても、作成・削除ができる。

**これは、ファイルが削除できるかどうかはディレクトリのパーミッションで決まり、ファイルのパーミッションは関係ないことを意味する。**

ファイルの書き込み制限を行い、ファイルを削除できるか確認してみる。

```
$ chmod a-w file1.txt  //ファイルの書き込み権限を削除
$ ll file.txt          //ファイルのパーミッションを確認

-r--r--r--  1 vagrant vagrant    0 Apr 23 11:50 file1.txt  //書き込み権限削除の確認

$ rm  file1.txt　　//ファイル削除
rm: remove write-protected regular empty file 'file1.txt'?  yes 削除しますか？
```
もちろん削除できてしまう。

###「x」実行(ディレクトリをカレントディレクトリにする) の確認

「x」実行が設定されていないディレクトリにはアクセスできないことを確認する。

```
$ chmod a-x permissionTest/  //permissionTestの実行権限を制限
$ ls -ld permissionTest/     //permissionTestのパーミッションを確認

drw-rw-r-- 2 vagrant vagrant 4096 Apr 23 11:50 permissionTest/　//確認

v$ cd permissionTest/                           //permissionTest/へアクセス
-bash: cd: permissionTest/: Permission denied   //できない。
```

##まとめ
|記号  |ファイルの場合 | ディレクトリの場合 |
|:-:|---|---|
| r |ファイルの読み取り|ディレクトリに含まれるファイル一覧の取得  |
| w |ファイルへの書き込み|ディレクトリの下にあるファイル・ディレクトリの作成、削除|
| x |ファイルの実行|ディレクトリをカレントディレクトリにする |

##参考
新しいLinuxの教科書