chmodを理解する

## そもそも`chmod`とは
[IBM Documentation](https://www.ibm.com/docs/ja/aix/7.3?topic=c-chmod-command)では、chmodコマンドについて次のように説明されています。
> chmod コマンドは、指定されたファイルまたはディレクトリーのモード・ビットと拡張アクセス制御リスト (ACL) を変更します。 

つまり、ファイルやディレクトリーの権限を設定するコマンドということです。

> The chmod (CHange MODe) command is used to change permissions for a file or directory on a Unix machine. 
(wikipedia)

 `chmod`は`Change Mode`の略です。ファイルやディレクトリーのモードを変更することを覚えるとわかりやすいです。


Linuxでは、ファイルやディレクトリーに対して「誰が何をできるのか」という権限を設定するために使用します。

:::note
この記事は、WikipediaとIBM Documentationの内容をもとに作成しています。
:::

## ファイルの権限を確認する
`ls -l {ファイル名}` と入力すると、以下のような内容が表示されます。内容を確認していきましょう！
```bash
$ ls -l findPhoneNumbers.sh
-rwxr-xr--  1 dgerman  staff  823 Dec 16 15:03 findPhoneNumbers.sh
```

### 先頭に表示される文字列の読み方
上記の例では、`-rwxr-xr--` と謎の文字列が出力されました。この読み方を理解するには、Linuxのファイル権限について理解する必要があります。

### 3つの権限
Linuxには、3つの権限が存在します。

|| r | w | x |
|:-:|:-:|:-:|:-:|
|覚え方| Read | Write | eXecute |
|できること| ファイルの読み取り | ファイルの書き込み | ファイルの実行 |

:::note
ディレクトリーがx(eXecute)できる場合は、そのディレクトリー内に入ることができるという意味です。
:::

なので、前項で触れた`-rwxr-xr--`という文字列は、`read` `write` `execute` `read` `execute` `read` と言っていることが理解できると思います。なぜ`read`が3つの必要なのか、`-`とはどういった意味なのかは、Linuxの3つのユーザーについて知ると理解ができます。

### 3つのユーザー
3つのユーザーは下記のように分かれます。
|| u | g | o |
|:-:|:-:|:-:|:-:|
|覚え方| User | Group | Other |
|対象| ファイルの所有者 | 所有者の属するグループ | それ以外の全てのユーザー |

実は、先ほどの`-rwxr-xr--`という文字列は、このユーザーの権限が順番に表示されていました。

図にまとめると、このようになります。

![meaning-of-ls-l-output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790952/05c1feb0-f444-8738-a3a9-6c2703582761.png)


`-`は付与されていない権限を示すので、上記の図は、
- Userに、`Read` `Write` `eXecute` 権限を付与し、
- Groupに、`Read` `eXecute`権限を付与し、
- Otherに、`Read` 権限を付与しています

なお、先頭の`-`の箇所はファイルの種類を示しています。今回の`-`は通常ファイルを意味しています。
その他にも`d`のディレクトリなどがありますが、この記事では割愛します。

これで、ファイル権限の読み方を理解していただけたと思います。
それではよく見る`chmod 777`などのコマンドがどういう意味か理解して行きましょう！

## ファイルの実行権限を変更する
冒頭でもお話しした通り、ファイルの実行権限を変更するには、`chmod`コマンドを利用します。

`chmod`コマンドは、
- シンボリックモード
- オクタルモード

の2つの方法で使用できます。

### シンボリックモード

シンボリックモードでは、権限を文字で表現します。
下記の例を見てみましょう。

```sh
chmod u+r file.txt
chmod g-w file.txt
chmod o=x file.txt
```

一見難しいように見えますが、これらはすでに紹介した内容と下記の内容を合わせると理解することができます。

|  |  +  |  -  |  =  |
|:-:|:-:|:-:|:-:|
| 意味 | モードの追加 | モードの削除 | モードの置き換え |

`+`で既存のモードに、新たにモードを追加するため、
```sh
chmod u+r file.txt
```
では、`User`に`Read`モードを追加するという意味になります。

```sh
chmod g-w file.txt
```
では、`Group`のモードから`Write`モードを削除していて、

```sh
chmod o=x file.txt
```
では、`Other`のモードを`eXecute`のみに置き換えています。

シンボリックモードは、一度意味を理解するとわかりやすいですが、もっと簡単に設定する方法があります！

### オクタルモード (Numerical Permission)

オクタルモードでは、各権限を数字で表現します。

- 読み取り (r) = 4
- 書き込み (w) = 2
- 実行 (x) = 1

この数字の合計値は、必ず一意になるように設計されています。

```
chmod [uの値][gの値][oの値] file.txt
```
のように表現します。

例えば、`chmod 756 file.txt`のようなケースを考えてみましょう。

![chmod-example-756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790952/249c7955-25ce-b7a9-a884-d28fecf7cd33.png)

上記の図の通り左から、

- ユーザー (7) = 読み取り (4) + 書き込み (2) + 実行 (1) = 7
- グループ (5) = 読み取り (4) + 実行 (1) = 5
- その他 (6) = 読み取り (4) + 書き込み (2) = 6

という読み方になります。

つまり、ファイルの所有者は全ての権限を持ち、グループは読み取りと実行権限を持ち、その他のユーザーは読み取りと実行権限のみを持つことになります。

### 例

そのほかのケースも考えてみましょう。

![chmod-example-777.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790952/7e2d2c36-26ad-353f-451e-fbfe77c1416d.png)

上記の通り、全てのユーザーに全ての権利を付与します。

![chmod-example-000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790952/6709f863-35cf-603e-7149-842cc180ca70.png)

逆に、全てのユーザーから全ての権限を削除する場合はこのように書きます。

このように、`chmod`コマンドを使うことで、Linuxのファイルやディレクトリーの権限を柔軟に設定・管理することができます。