Linuxの権限システム - ファイル権限

# ファイル権限説明

役割定義
| 役割     | 命令中の文字 | 備考                     |
|--------|-----------|------------------------|
| 所有者   | u         | 属主                     |
| グループ  | g         | 属組                     |
| その他のユーザ | o         | その他のユーザ                |
| 全員     | a         | 所有者、グループ、およびその他のユーザを含む |

代入表記
| 命令中の文字 | 備考                                 |
|-----------|------------------------------------|
| +         | 指定された権限を追加する                     |
| -         | 指定された権限を削除する                     |
| =         | 指定された権限以外のすべてを削除し、与えられた権限のみ設定する |

権限表示方法
| 権限      | 命令中の文字 | 八進数数字表示 | 備考         |
|---------|-----------|------------|------------|
| 読み取り可能 | r         | 4          | 読み取り権限   |
| 書き込み可能 | w         | 2          | 書き込み権限   |
| 実行可能   | x         | 1          | 実行権限     |

一般的な表現方法
| コマンド   | 説明                                      |
|---------|-----------------------------------------|
| `u+r`   | ファイルの所有者に読み取り権限を追加します。                 |
| `g-x`   | ファイルの所有グループから実行権限を削除します。              |
| `ug=rx` | ファイルの所有者と所有グループの権限を読み取りと実行のみに設定します。 |
| `o=`    | その他のユーザーの全ての権限を削除します。                    |
| `a=rwx` | すべてのユーザーに対して読み取り、書き込み、実行の権限を設定します。  |

注意：
ユーザーの最終的な権限は、左から右へ順に一致することで決まります。つまり、所有者、所有グループ、その他の順になります。一度権限が一致すると、それ以上右側の権限を確認することはありません。
r および w の権限は root ユーザーには効果がありません。読み書きの権限がないファイルでも、root ユーザーは読み書きできます。
所有者、所属グループ、またはその他のいずれかが x 権限を持っている場合、root は実行できます。

権限の作用
| 権限 | ファイルに対する効果                       | ディレクトリに対する効果                                                                                     |
|----|----------------------------------------|----------------------------------------------------------------------------------------------------------|
| `r` | ファイル内容の閲覧可能                       | ディレクトリ内のファイル名を読み取り可能。ただし、ファイルのメタデータは閲覧不可                                               |
| `w` | ファイル内容の変更可能                       | ディレクトリ内でのファイル作成や削除が可能                                                                               |
| `x` | 実行可能。プロセスとして起動する                 | ディレクトリに入ることが可能。ファイルのメタデータの閲覧、ファイル内容の閲覧が可能。ディレクトリの最小要求権限 |

数学法の権限
| 文字表示 | 二進数表記 | 八進数表記 | 備考           |
|---------|----------|----------|--------------|
| `---`   | `000`    | `0`      | 無任何権限       |
| `--x`   | `001`    | `1`      | 実行可能        |
| `-w-`   | `010`    | `2`      | 可写           |
| `-wx`   | `011`    | `3`      | 可写・実行可能   |
| `r--`   | `100`    | `4`      | 読取可能        |
| `r-x`   | `101`    | `5`      | 読取・実行可能   |
| `rw-`   | `110`    | `6`      | 読取・書込み可能 |
| `rwx`   | `111`    | `7`      | 全ての権限がある |

例：
| 文字表示   | 八進数数字表記 | 備考                                       |
|------------|-------------|------------------------------------------|
| `rw-r-----` | `640`       | 属主（オーナー）可読写、属组（グループ）可読、他のユーザー無任何権限 |
| `rw-r--r--` | `644`       | 属主（オーナー）可読写、属组（グループ）可読、他のユーザー可読           |
| `rwxr-xr-x` | `755`       | 属主（オーナー）可読写可実行、属组（グループ）可読可実行、他のユーザー可読可実行 |

```markdown
# Linuxでのファイル権限の変更(chmod)

Linuxでは、ファイルやディレクトリに設定されているアクセス権を`chmod`コマンドで変更することができます。


## `chmod` コマンドの使用法

フォーマット：

```shell
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
```

### 主なオプション

- `-c`|--changes # `-v`オプションと同様ですが、更新に成功した情報のみを表示
- `-f`|--silent|--quiet # エラー情報を表示しない
- `-v`|--verbose # 処理過程を表示
- `--no-preserve-root` # 「/」を通常のディレクトリとして扱い、操作を行います（デフォルト設定）
- `--preserve-root` # 「/」ディレクトリでの再帰的操作を禁止
- `--reference=RFILE` # 参照ファイルの権限をコピー
- `-R`|--recursive # 再帰的に操作

### MODEの設定

`MODE` は以下の形式で指定します。

```
who opt permission
```

- `who` : u | g | o | a
- `opt` : + | - | =
- `permission` : r | w | x

### 例：権限の変更

ファイルの権限を変更します。

```shell
# 全ユーザーからすべての権限を削除
chmod a= f1

# 所有者に読み取り権限を、グループに書き込み権限を、その他のユーザーに実行権限を設定
chmod u=r,g=w,o=x f2

# 所有者に書き込み権限を追加、グループから実行権限を削除、その他のユーザーから読み取り権限を削除
chmod u+w,g-x,o-r f3

# すべてのユーザーにすべての権限を設定
chmod a=rwx f4
```

### 数値による権限設定

```shell
# a1を所有者とグループが読み書き、その他のユーザーが読み取りのみの権限に設定(644)
chmod 644 a1

# a2のすべての権限を削除(000)
chmod 0 a2

# a3にすべてのユーザーに対しすべての権限を付与(777)
chmod 777 a3
```

誤った形式の場合の例：

```shell
chmod u+4 a1
# 出力: chmod: invalid mode: ‘u+4’
# Try 'chmod --help' for more information.
```

再帰的操作の例：

```shell
# dir1ディレクトリとその中の全ファイルとディレクトリにその他のユーザーにすべての権限を付与
chmod o+rwx -R dir1/

# 大文字のXを使用し、実行権限を子ディレクトリにのみ加える
chmod o+X -R dir1/
```

## 新規ファイルとディレクトリのデフォルト権限

Linuxでは、新規に作成されるファイルやディレクトリにはデフォルトの権限が設定され、このデフォルト権限は`umask`値によって変わります。

### `umask` コマンド

`umask` は新規作成されるファイルやディレクトリのデフォルトの権限を設定します。

```shell
# 現在のumask値を表示
umask 

# umask値を設定
umask 022
```

`umask` 値によって、新規作成されるファイルの権限が`666 - umask`、新規ディレクトリの権限が`777 - umask`となります。

非特権ユーザーのデフォルト`umask`は`002`、rootユーザーのデフォルト`umask`は`022`です。

### `umask`値の永続設定

- 全体設定：`/etc/bashrc`で設定
- 個人設定：`~/.bashrc`で設定

`umask`値の一時的な変更例：

```shell
# umask値を`666`に設定してファイルを作成。このコマンドの実行後、元のumask値に戻ります。
(umask 666; touch /data/f1.txt)
```