Linuxコマンド - ls -lとchmodによってファイルやディレクトリの権限管理を行う

## この記事について
この記事の中では以下について記載しております。

* Linux上でのファイルやディレクトリの権限管理を行うための基本的な考え方
    * ユーザ・グループ
    * 3つの操作（読み・書き・実行）に対する権限設定
* 権限の状態を確認するための `ls -l` コマンド表示結果の見方
    * `-rwxr--r-- 1 textusr testgrp 1260 Aug 1 128 hoge.txt` の意味が分かるようになる
* 権限管理を行う際に使用するchmodコマンドの使い方
    * `chmod 765 hoge.txt` の意味が分かるようになる

## 対象読者
* Linuxを使用して管理者として開発に関わる方
* Linuxにおける権限管理の基本を学びたい方

## 環境
utunbu 20.04.1

## 前提知識
### ユーザ・グループ
各個人が保有するPCのOSとして使用されることの多い「Windows」「macOS」とは異なり、LinuxはサーバOSとして用いられることが多いため、同じLinuxのシステム上で複数人で作業を行うことが多くなります。
そこで、**誰が何の操作を行えるようにするのか**を設定するために、ユーザ・グループといった設定を行うことが重要となります。
そのユーザやグループは以下のように表現できます。

* ユーザ…Linuxにログインして、作業を行うためのアカウント
* グループ…複数のユーザをまとめて管理するためのもの  
参考：[全体像がすぐにわかる！Linuxグループの設定方法まとめ](https://eng-entrance.com/linux-group)  

例：

* ユーザ…太郎君、花子さん
* グループ…本社、営業部（太郎君や花子さんは本社、営業部のどちらか一方もしくは両方に属し得る）  
ユーザ・グループの具体的な設定方法は[こちら](https://qiita.com/umeshu4488/items/eb5cd6db669380fae774)より確認できます。

### 3つの操作（読み・書き・実行）に対する権限設定
Linux上では各ファイル・ディレクトリに対して、以下3つの操作それぞれに権限を設定することができます。

* 読み込み…ファイルの中身の表示、ディレクトリへの移動（ `r` …read）
* 書き込み…ファイルの中身の変更・削除、ディレクトリ内でのファイル追加・削除など（ `w` …write）
* 実行…（ファイルが実行可能である場合に）ファイルに記述されたプログラムの実行（ `x` …execute）

読み込み・書き込み・実行はそれぞれ、 `r` ・ `w` ・ `x` で表現されます。

## 権限の確認（`ls -l` コマンド）
### コマンドの説明
* `ls` …現在のディレクトリ直下のファイルやディレクトリの表示を行う  
（Windowsコマンドで言う `dir` コマンド）
* `ls -l` …**権限設定も併せて**現在のディレクトリ直下のファイルやディレクトリの表示を行う  
※`-l` の `l` はlongを表す=長い（詳細な）情報の表示を表します。

例：
このようなディレクトリ構造をしたtestディレクトリが存在する

```
test
┣hoge.txt
┣index.html
┗testchild
```
`taro` ユーザは `head` グループを主グループとする

```
taro@example:~$ groups taro
taro : head
```

* testディレクトリ上で `ls` を実行

```
taro@example:~$ ls
hoge.txt  index.html  testchild
```

* testディレクトリ上で `ls -l` を実行

```
taro@example:~$ ls -l
total 4
-rw-r----- 1 taro head    0 Jul 23 15:33 hoge.txt
-rw-r--r-- 1 taro head    0 Jul 23 15:33 index.html
drwxr-xr-x 2 taro head 4096 Jul 23 15:33 testchild
```

### `ls -l` コマンド表示結果の見方
以下の画像の沿って説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234275/98cc4650-92c2-398a-d456-6b6097ef860a.png)

1. 赤線…形式（ファイルなのか、ディレクトリなのかなど）
    * ファイル… `-`
    * ディレクトリ… `d`
    * シンボリックリンク… `l`

1. 青線（1つ目）…ファイルなどを作成したユーザ（ここで言う `taro`）が持っている権限
    * 3つの文字が並んでおり、左から `読み込み（read）・書き込み（write）・実行（execute）` を表す
    * `-` は、権限がないことを表す
    * 例： `rw-` = `読み込み（read）・書き込み（write）` の権限は持っているが、 `実行（execute）` の権限は持っていない

1. 黄線（1つ目）…ファイルなどを作成したユーザが属する主グループ（ここで言う `head`）が持っている権限
例：`hanako` という別ユーザが `head` グループに属している場合は、 `hanako` の権限も `r--` （読み込みのみ可能）となります。

1. 緑線…その他ユーザが持っている権限
画像の例では、その他ユーザの権限は `---` であるため、読み込み・書き込み・実行の全てが出来ません。

1. 緑線横の数字…リンクされている数、サブディレクトリの数
参考：[【一通り理解】Linuxパーミッションの基本とその設定方法](https://eng-entrance.com/linux-permission-basic#ls_-l)

1. 青線（2つ目）…ファイルやディレクトリを作成したユーザ

1. 黄線（2つ目）…ファイルやディレクトリを作成したユーザが属する主グループ

1. 日時の前の数字…ファイルやディレクトリのサイズを表す（空のファイルであればサイズ0となる）

1. 日時…ファイルやディレクトリの最終更新日時

1. ファイル名

## 権限の設定（`chmod` コマンド）
設定したい形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234275/8dff1b5c-d873-91c5-21fa-ed460955cc86.png)
### `chmod` の使い方その1
以下3者それぞれに対して権限設定を記述します。

* `u` …user：作成したユーザの権限
* `g` …group：作成したユーザが属するグループの権限
* `o` …other：その他ユーザの権限

```
taro@example:~$ chmod u=rwx,g=rw,o=rx hoge.txt
```
設定した権限の確認

```
taro@example:~$ ls -l
total 4
-rwxrw-r-x 1 taro head 4 Jul 23 16:19 hoge.txt
```

### `chmod` の使い方その2
権限の状態を数値に置き換えて権限設定を記述します。
#### 数値変換の手順
1. 以下のように各権限を2の累乗で表現（権限を付けないときは「0」とする）
    * 読み込み（`r`）…2^2（=4）
    * 書き込み（`w`）…2^1（=2）
    * 実行（`x`）…2^0（=1）
1. 読み込み・書き込み・実行の各数値を合計する
1. 1・2の数値変換を「作成ユーザの権限」「作成ユーザの属するグループの権限」「その他ユーザの権限」について行う

`設定したい形` の権限を設定するための数値変換の方法を記述します。

* 作成したユーザの権限：**7**  
→「読み込み（2^2=4）・書き込み（2^1=2）・実行（2^0=1）」の合計値
* 作成ユーザの属するグループの権限：**6**  
→「読み込み（2^2=4）・書き込み（2^1=2）・実行（0）」の合計値
* その他ユーザの権限：**5**  
→「読み込み（2^2=4）・書き込み（0）・実行（2^0=1）」の合計値

```
taro@example:~$ chmod 765 hoge.txt
```
設定した権限の確認

```
taro@example:~$ ls -l
total 4
-rwxrw-r-x 1 taro head 4 Jul 23 16:19 hoge.txt
```
`hanako` ユーザが、 `taro` ユーザと同じ `head` グループに属する時、`hanako` ユーザへの `hoge.txt` に対する権限設定は以下となる （`rw-` が効いている）

* **読み込み・書き込みは行える**
* **実行は行えない**

`ubuntu` ユーザが、`head` グループに属していない時、 `ubuntu` ユーザへの`hoge.txt` に対する権限設定は以下となる （`r-x` が効いている）

* **読み込み・実行は行える**
* **書き込みは行えない**

    * `head` グループに属していないユーザ `ubuntu` で**ファイル編集**しようとするとエラーとなる

    ```
    testuser@example:~$ su ubuntu
    ubuntu@example:/home/testuser$ vi hoge.txt
    （hoge.txtファイルを編集後、「:wq」を入力）
    E45: 'readonly' option is set (add ! to override)
    ```
    * `head` グループに属していないユーザ `ubuntu` で**ファイル削除**しようとするとエラーとなる

    ```
    ubuntu@example:/home/testuser$ rm hoge.txt
    rm: remove write-protected regular file 'hoge.txt'? y
    rm: cannot remove 'hoge.txt': Permission denied
    ```

## 参考
* [全体像がすぐにわかる！Linuxグループの設定方法まとめ](https://eng-entrance.com/linux-group)
* [【一通り理解】Linuxパーミッションの基本とその設定方法](https://eng-entrance.com/linux-permission-basic#ls_-l)
* [ドットインストール UNIXコマンド入門](https://dotinstall.com/lessons/basic_unix_v3)