Linuxのお勉強メモ

# この記事 is 何？
- エンジニア歴13年で何故か避けて通れて来てしまったLinuxの知識が必要な時が来てしまった。
- 現場だけだとキャッチアップしきれない（というか、知らずにコマンドミスってインシデント発生が怖すぎる）ので、自主学習する。
- やったことをメモに残しておく。アウトプット大事。
- 記事を分けるのが面倒くさいので、何も気にせず追記や修正をします。

# （いちおう）編集履歴
- 2020/01/18：新規作成
- 2020/01/19：ディレクトリ操作とファイル操作を追記
- 2020/01/20：権限変更について追記

# 1. 事前準備
特に理由もなくCentOSを使うことにした。
コマンドが気軽に試せればいいし。
また、いつぶっ壊してもいいようにDockerを利用することにした。
Dockerのお勉強にもなるので一石二鳥。やったぜ。

## (1) やったこと
以下のサイトを参考にして環境構築。
https://www.orangeitems.com/entry/2018/06/18/153510

自分のPCはwindows10HomeだったのでHyper-Vが使えなかった。
さらに以下のサイトも参考にして環境構築した。
https://qiita.com/idani/items/fb7681d79eeb48c05144

---

Windowsのコンソールに戻りたい時もあるかもしれないので、バックグラウンドで動かしとく。

```
$ docker run -i -d -t centos bin/bash
5e2e721950e466cfd1583d8db34e72908a848209ff7f0aef71357b3884a257d6
```

起動でけた。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5e2e721950e4        centos              "bin/bash"          7 seconds ago       Up 6 seconds                            fervent_jones
```

centOSちゃんコンニチハ｡

```
$ docker attach 5e2e721950e4 
[root@5e2e721950e4 /]#
```


# 2. お勉強メモ
## (1) とりあえず、どんなディレクトリがあるのか見てみよう。

```
[root@5e2e721950e4 /]# pwd
/
[root@5e2e721950e4 /]# ls -la
total 56
drwxr-xr-x   1 root root 4096 Jan 18 07:46 .
drwxr-xr-x   1 root root 4096 Jan 18 07:46 ..
-rwxr-xr-x   1 root root    0 Jan 18 07:46 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  360 Jan 18 07:46 dev
drwxr-xr-x   1 root root 4096 Jan 18 07:46 etc
drwxr-xr-x   2 root root 4096 May 11  2019 home
lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64
drwx------   2 root root 4096 Jan 13 21:48 lost+found
drwxr-xr-x   2 root root 4096 May 11  2019 media
drwxr-xr-x   2 root root 4096 May 11  2019 mnt
drwxr-xr-x   2 root root 4096 May 11  2019 opt
dr-xr-xr-x 131 root root    0 Jan 18 07:46 proc
dr-xr-x---   2 root root 4096 Jan 13 21:49 root
drwxr-xr-x  11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx   1 root root    8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 May 11  2019 srv
dr-xr-xr-x  13 root root    0 Jan 18 07:46 sys
drwxrwxrwt   7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x  12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x  20 root root 4096 Jan 13 21:49 var
```
内容はこんな感じらしい。先人に超感謝。
https://qiita.com/twipg/items/d8d7a0797a392bc4b75e

### ここまでの疑問

- `#` is 何？
    - コマンドの先頭についてる#は`今はrootユーザーだと`という印。
    - 一般ユーザーの場合は`$`になる。

- `->` is 何？
    - シンボリックリンクが張られている状態。
    - ハードリンクと言うものもあるようだ。
    - ~~ファイル操作のお勉強するときに実際に試そう。~~
    - ググったら分かったので割愛。
        - 参考にしたURL：http://wordpress.ideacompo.com/?p=10717

## (2) ディレクトリやファイル操作をしてみよう。
ディレクトリやファイルを作ったり消したりしてみる。

### ディレクトリの操作
#### 試したコマンド

```
# ディレクトリの新規作成
mkdir 作りたいディレクトリ名

# 親子階層のディレクトリを新規作成
mkdir -p 作りたいディレクトリ名/作りたいディレクトリ名

# ディレクトリのコピー
cp -r コピー元ディレクトリ コピー先ディレクトリ

# 中身が空のディレクトリの削除
rmdir 削除したいディレクトリ

# 中身があるディレクトリの削除
rm -rf 削除したいディレクトリ
```

カレントディレクトリに新しいディレクトリを作ってみる。

```
[root@6b65b4917285 tmp]# pwd
/tmp
[root@6b65b4917285 tmp]# mkdir directory1
```

directory1が出来てた。

```
[root@6b65b4917285 tmp]# ls -l
total 12
drwxr-xr-x 2 root root 4096 Jan 19 05:47 directory1
```

親子階層のディレクトリを作ってみようとしたら怒られた。
親ディレクトリが無いと作れないらしい。

```
[root@b12193fa42d0 tmp]# mkdir dir1/subdir1
mkdir: cannot create directory 'dir1/subdir1': No such file or directory
```

`-p`オプションを指定すると、親子ディレクトリを同時に作れる。

```
[root@b12193fa42d0 tmp]# mkdir -p dir1/subdir1
[root@b12193fa42d0 tmp]# ls -l dir1/
total 4
drwxr-xr-x 2 root root 4096 Jan 19 07:25 subdir1
```

ディレクトリをコピーしてみようとしたら、`-r`オプションつけろって怒られた。

```
[root@b12193fa42d0 tmp]# cp directory1 directory_copy
cp: -r not specified; omitting directory 'directory1'
```

`-r`オプションをつけたらコピーできた。

```
[root@b12193fa42d0 tmp]# cp -r directory1 directory_copy
[root@b12193fa42d0 tmp]# ls -l
total 24
drwxr-xr-x 3 root root 4096 Jan 19 07:25  dir1
drwxr-xr-x 2 root root 4096 Jan 19 07:35  directory1
drwxr-xr-x 2 root root 4096 Jan 19 07:42  directory_copy    # ディレクトリがコピーされた。
```

ディレクトリを削除してみる。

```
[root@b12193fa42d0 tmp]# ls -l
total 24
drwxr-xr-x 3 root root 4096 Jan 19 07:25  dir1
drwxr-xr-x 2 root root 4096 Jan 19 07:35  directory1    # こいつを消してみる。
drwxr-xr-x 2 root root 4096 Jan 19 07:42  directory_copy
[root@b12193fa42d0 tmp]# rmdir directory1
# 消えた。
[root@b12193fa42d0 tmp]# ls -l
total 20
drwxr-xr-x 3 root root 4096 Jan 19 07:25  dir1
drwxr-xr-x 2 root root 4096 Jan 19 07:42  directory_copy
```

中身があるディレクトリを消そうとしたら怒られた。

```
[root@b12193fa42d0 tmp]# rmdir dir1
rmdir: failed to remove 'dir1': Directory not empty
```

`rm -r`で消せた。（ただし、いろいろ確認される。）

```
[root@b12193fa42d0 tmp]# rm -r dir1
rm: descend into directory 'dir1'? y
rm: remove directory 'dir1/subdir1'? y
rm: remove directory 'dir1'? y
[root@b12193fa42d0 tmp]# ls -l
total 16
drwxr-xr-x 2 root root 4096 Jan 19 07:42  directory_copy
```

`rm -rf`だと確認無しで消える。

```
[root@b12193fa42d0 tmp]# rm -rf dir1
[root@b12193fa42d0 tmp]# ls -l
total 16
drwxr-xr-x 2 root root 4096 Jan 19 07:42  directory_copy
```

### ファイル操作
#### 試したコマンド

```
# ファイルの新規作成
touch 作りたいファイル名

# ファイル作ってそのまま編集（viで開く）
vi 作りたいファイル名

# ファイルのコピー
cp コピー元ファイル コピー先ファイル

# ファイルの削除
rm -rf 削除したいディレクトリ
```

カレントディレクトリに新しいファイルを作ってみる。

```
[root@b12193fa42d0 tmp]# touch file.txt
[root@b12193fa42d0 tmp]# ls -l file.txt
-rw-r--r-- 1 root root 0 Jan 19 08:04 file.txt
```

viでも作れる。

```
[root@b12193fa42d0 tmp]# vi file2.txt
# viが開くので、適当に編集して保存。
# 保存しないとファイルは作られない。
[root@b12193fa42d0 tmp]# ls -l file2.txt
-rw-r--r-- 1 root root 5 Jan 19 08:09 file2.txt
```

同じディレクトリ内でファイルをコピーしてみる

```
[root@b12193fa42d0 tmp]# ls -l
total 16
drwxr-xr-x 2 root root 4096 Jan 19 07:42 directory_copy
-rw-r--r-- 1 root root    0 Jan 19 08:04 file.txt    # こいつをコピーする。
-rw-r--r-- 1 root root    5 Jan 19 08:09 file2.txt
-rwx------ 1 root root  671 Jan 13 21:49 ks-script-_srt3u3c
-rwx------ 1 root root 1379 Jan 13 21:49 ks-script-gpqu_kuo
[root@b12193fa42d0 tmp]# cp file.txt file_copy.txt
[root@b12193fa42d0 tmp]# ls -l
total 16
drwxr-xr-x 2 root root 4096 Jan 19 07:42 directory_copy
-rw-r--r-- 1 root root    0 Jan 19 08:04 file.txt
-rw-r--r-- 1 root root    5 Jan 19 08:09 file2.txt
-rw-r--r-- 1 root root    0 Jan 19 08:14 file_copy.txt    # コピーできてる。
```

別のディレクトリにコピーしてみる。

```
[root@b12193fa42d0 tmp]# ls -l
total 20
drwxr-xr-x 2 root root 4096 Jan 19 08:17 dir
drwxr-xr-x 2 root root 4096 Jan 19 07:42 directory_copy
-rw-r--r-- 1 root root    0 Jan 19 08:04 file.txt    # こいつをdir/配下にコピーする。
-rw-r--r-- 1 root root    5 Jan 19 08:09 file2.txt
-rw-r--r-- 1 root root    0 Jan 19 08:14 file_copy.txt
[root@b12193fa42d0 tmp]# cp file.txt  dir/copy.txt
[root@b12193fa42d0 tmp]# ls -l dir/copy.txt
-rw-r--r-- 1 root root 0 Jan 19 08:17 dir/copy.txt    # コピーできてる。
```

ファイルを削除してみる

```
[root@b12193fa42d0 tmp]# ls -l
total 20
drwxr-xr-x 2 root root 4096 Jan 19 08:17 dir
drwxr-xr-x 2 root root 4096 Jan 19 07:42 directory_copy
-rw-r--r-- 1 root root    0 Jan 19 08:04 file.txt
-rw-r--r-- 1 root root    5 Jan 19 08:09 file2.txt
-rw-r--r-- 1 root root    0 Jan 19 08:14 file_copy.txt
[root@b12193fa42d0 tmp]# rm file2.txt
rm: remove regular file 'file2.txt'? y    # 消していいか確認される。
# 消えた。
[root@b12193fa42d0 tmp]# ls -l
total 16
drwxr-xr-x 2 root root 4096 Jan 19 08:17 dir
drwxr-xr-x 2 root root 4096 Jan 19 07:42 directory_copy
-rw-r--r-- 1 root root    0 Jan 19 08:04 file.txt
-rw-r--r-- 1 root root    0 Jan 19 08:14 file_copy.txt
```

`-rf`オプションを付けると確認無しで消せる。

```
[root@b12193fa42d0 tmp]# rm -rf file_copy.txt
[root@b12193fa42d0 tmp]# ls -l
total 16
drwxr-xr-x 2 root root 4096 Jan 19 08:17 dir
drwxr-xr-x 2 root root 4096 Jan 19 07:42 directory_copy
-rw-r--r-- 1 root root    0 Jan 19 08:04 file.txt
```

## (3) ファイルの権限をいじってみよう。
### `ls -l`したときの謎の英文字羅列ってなんぞ？
`-rw-r--r--`ってなによ？

```
-rw-r--r-- 1 root root    5 Jan 20 05:59 file.txt
```

こういう意味。

| 文字数 | 意味 | 値 |
| --- | --- | --- |
| 1文字目 | ファイル種別 | - : ファイル <br> d：ディレクトリ <br> l：シンボリックリンク|
| 2～4文字目 | 所有者の権限 | r：読み取り <br> w：書き込み <br> x：実行 |
| 5～7文字目 | 所有グループの権限 | r：読み取り <br> w：書き込み <br> x：実行 |
| 8～10文字目 | その他の人の権限 | r：読み取り <br> w：書き込み <br> x：実行 |

なので`-rw-r--r--`であれば、
- ファイル
- 所有者は「読み込みと書き込み」の権限を所有
- 所有グループは「読み込み」の権限を所有
- その他の人は「読み込み」の権限を所有

### 権限の付け外しをしてみる。
やり方は以下の2種類。

1. 数字で指定する。
2. アルファベットで指定する。

```
chmod 付けたい権限 ファイルパス

# 付けたい権限で指定する数値は以下の通り。
#   4：r
#   2：w
#   1：x
# rとwを付けたければ、「4+2」で6を指定する。

# アルファベットの場合は
# 1文字目：変更対象（u：ユーザー g：グループ o：その他 a：全て）
# 2文字目：変更方法（=：指定した権限に置き換える +：指定した権限を付与する -：指定した権限を消す）
# 3文字目：変更内容（r：読み込み w：書き込み x：実行）
```

ユーザーに全ての権限を権限を付けてみる。

```
# 数字で指定。
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--r-- 1 root root 5 Jan 20 05:59 file.txt
[root@2e524500bb5e tmp]# chmod 744 file.txt
[root@2e524500bb5e tmp]# ls -l file.txt
-rwxr--r-- 1 root root 5 Jan 20 05:59 file.txt

# アルファベットで指定。
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--r-- 1 root root 5 Jan 20 05:59 file.txt
[root@2e524500bb5e tmp]# chmod u+x file.txt
[root@2e524500bb5e tmp]# ls -l file.txt
-rwxr--r-- 1 root root 5 Jan 20 05:59 file.txt
```

ユーザーから実行権限を外してみる。

```
# 数字で指定。
[root@2e524500bb5e tmp]# ls -l file.txt
-rwxr--r-- 1 root root 5 Jan 20 05:59 file.txt
[root@2e524500bb5e tmp]# chmod 644 file.txt
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--r-- 1 root root 5 Jan 20 05:59 file.txt

# アルファベットで指定。
[root@2e524500bb5e tmp]# ls -l file.txt
-rwxr--r-- 1 root root 5 Jan 20 05:59 file.txt
[root@2e524500bb5e tmp]# chmod u-x file.txt
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--r-- 1 root root 5 Jan 20 05:59 file.txt
```

複数の権限を同時につけてみる。
その他の人に最強の権限（読み書き実行）を付けてみる。

```
# 数字で指定。
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--r-- 1 root root 5 Jan 20 05:59 file.txt
[root@2e524500bb5e tmp]# chmod 647 file.txt
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--rwx 1 root root 5 Jan 20 05:59 file.txt

# アルファベットで指定。
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--r-- 1 root root 5 Jan 20 05:59 file.txt
[root@2e524500bb5e tmp]# chmod o+wx file.txt
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--rwx 1 root root 5 Jan 20 05:59 file.txt

# これでもいける。（=指定して置き換え）
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--r-- 1 root root 5 Jan 20 05:59 file.txt
[root@2e524500bb5e tmp]# chmod o=rwx file.txt
[root@2e524500bb5e tmp]# ls -l file.txt
-rw-r--rwx 1 root root 5 Jan 20 05:59 file.txt
```

`個人的には`アルファベット指定の方が解りやすいかなー