Linux管理者コマンドの一覧まとめ

Linuxの管理者コマンドを今回初めて学んだので、代表的なLinuxの管理者コマンドを備忘録的にまとめてみました。

# 1. ユーザ、グループ管理
一つのPC上には複数のユーザとグループを作成することができる。複数のユーザを作成することで、それぞれに異なった権限を与えることができ、作業を効率的に進められる。

また、様々な権限をすべてのユーザ一人一人に与えていくのは規模が多くなるにつれとても大変になっていってしまうため、グループを用いて一括した処理を行っている。

## 1-1. ユーザの作成
新しくユーザーを作成したいときは`useradd`コマンドを用いる。
```bash:ユーザーの作成
root$ useradd tom
root$ passwd tom
Changing password for user user01.
New password: # 設定したいパスワードを入力
Retype new password: # パスワードの再入力
passwd: all authentication tokens updated successfully.
```
パスワードは、8文字以上のパスワードを選択する必要がある。（rootユーザは任意の値をパスワードに設定できる。）

`-u`オプションを用いてUID（ユーザID）を指定することも可能。
```shell:ユーザIDを指定
root$ useradd -u 12345 tom
```
:::note info 
**補足：UIDの範囲**
Linuxでは特定のUID番号と番号の範囲が特定の目的で使用されている。

- UDI 0：rootユーザのUID
- UID 1-200：システムプロセスに静的に割り振られたシステムアカウントUID
- UID 201-999：システムプロセスに動的に割り当てられるシステムアカウントUID
- UID 1000+：一般ユーザに割り当てられるUID

※ UID 0-999まではシステムが使用する可能性があるため、ユーザに故意的に指定をするなら1000以上が良い。
:::

また、作成したユーザは`id`コマンドを用いて確認できる。
```bash:ユーザの確認
root$ id tom
uid=12345(tom) gid=12345(tom) groups=12345(tom)
```
## 1-2. グループの作成
グループの作成には`groupadd`コマンドを用いる。
```bash:グループの作成
root$ groupadd group1
```
ユーザーをグループに追加する`-aG`オプションを用いる。
```bash:ユーザーの追加
root$ usermod -aG group1 tom
root$ id tom
uid=12345(tom) gid=12345(tom) groups=12345(tom),1003(group1)
```

## 1-3. ユーザの切り替え
上記のように作成したユーザを切り替えたいときは`su`コマンドを用いる。
```shell:ユーザーの切り替え
root$ su - tom
# 設定したパスワードを入力
tom$ 
```
上記のように`su - `のあとに作成したユーザ名を指定することで指定したユーザに切り替えることができる。

# 2. rootユーザ
しかし、上記で記載した`useradd`や`groupadd`などのコマンドは一般ユーザでは実行できない。（`su -`コマンドは実行できる。）基本的に一般ユーザは、
1. ユーザやグループの管理
1. ソフトウェアのインストールや削除
1. システムファイルとディレクトリの管理

といったタスクの権限を持ち合わせていないため、**rootユーザに切り替える必要がある。**
rootユーザとは、システムの管理のためのユーザであり、システム全体に対する権限を持つユーザである。

:::note warn

しかし、rootユーザのアカウントが侵害された場合、システムは危険にさらされ、管理制御を失う可能性があるため、rootユーザは日常的には使わず、必要な場合にのみroot権限を使用することが大切である。
:::

## 2-1. rootユーザの切り替え
rootの切り替えには以下を用いる。
```shell:rootへの切り替え
tom$ sudo -i 
# rootのパスワードを入力
root$ 
```
しかし、上記の注意書きの通り、rootユーザをむやみに使用するのはよくない。また、そのような観点から一般ユーザはrootユーザのパスワードを入手できないこともある。そんなときは、`sudo`コマンドを用いてrootの権限を一時的に取得することができる。
```shell:一般ユーザがrootの権限を取得して実行
user$ sudo useradd tom
```
上記のように実行したいコマンドの前に`sudo`コマンドを記載することでroot権限を用いて実行することができる。

# 3. ファイルアクセス権限
root権限を用いてファイルのアクセス権限を変更することができる。まず、ファイルの所有者やグループを変更には`chown`コマンドを用いる。
（ここでは、記載の関係上`sudo -i`を行った後とみなす。）
```bash:ファイルの所有権の変更
root$ mkdir /doc
root$ chown root:group1 /doc
```
上記のように設定すると/docファイルは所有者がroot、グループがgroup1になる。
## 3-1. パーミッション
また、ファイルにはパーミッションと呼ばれるアクセス権限を設定することができる。
`ls -l`コマンドでファイルやディレクトリを指定すると以下のように表示される。
```bash
root$ ls -ld /docs
drwxrws---. 2 root adm 6 Aug 19 21:22 /docs
```
ここで、`drwxrws---`がパーミッションである。パーミッションは左から1, 3, 3, 3の4つの塊に分解することができ、（ここでは、`d`、`rwx`、`rws`、`---`に分解できる。）それぞれの位置のパーミッションは以下を表している。
| 文字目 | 説明 |
|:--|:--|
| 1 | ファイルの種類（exp. `-`：ファイル、`d`：ディレクトリ） |
| 2-4 | ファイル所有者の権限 |
| 5-7 | ファイルのグループメンバーの権限 |
| 8-10 | ファイルの所有者でもファイルのグループメンバーでもないユーザの権限 |

また、権限のモードは以下のものがある。
| モード | 説明 |
|:--|:--|
| r | ファイルの読み取りアクセス権。ディレクトリの一覧表示アクセス権 |
| w | ファイルまたはディレクトリへの書き込み権 |
| x | ファイル、ディレクトリの実行権|

これらを設定するには`chmod`コマンドを用いる。
```bash:アクセス制限
root$ chmod 770 /docs
```
上記のようにパーミッションの指定には8進数方式と呼ばれる方法がある。
これはパーミッションを3桁の8進数で表すことができる方法であり、左から右にユーザー、グループ、その他を表す。各桁は以下の方法で決定される。
- ０から始める
- 読み取りパーミッションを追加するには、4を追加する
- 書き込みパーミッションを追加するには、2を追加する
- 実行パーミッションを追加するには、1を追加する
```math
770　\ → \hspace{5mm} \text{(u)user} \ : \ \frac{4}{r} \frac{2}{w} \frac{1}{x} \, \hspace{0.5cm} \text{(g)group} \ : \frac{4}{r} \frac{2}{w} \frac{1}{x} \ \hspace{0.5cm} \text{(o)other} \ : \frac{0}{-} \frac{0}{-} \frac{0}{-} 
```

# 4. システムパフォーマンスのチューニング
次に、root権限はシステムパフォーマンスのチューニングを行うこともできる。チューニングには`tuned-adm`コマンドを用いる。
```bash:チューニング
root$ tuned-adm recommend  #チューニングプロファイルの推奨値を取得
virtual-guest
root$ tuned-adm profile virtual-guest  #チューニングプロファイルの設定
```

# 5. ユーザの定期的なタスク管理
定期的なタスク管理には`crontab`を用いる。studentユーザのタスクを作成したい場合、studentユーザで設定を行うため、ユーザを切り替える。
```bash:タスク
root$ su - student
student$ crontab -e  #タスクの作成
student$ crontab -l  #タスクの表示
5 * * * Mon-Fri echo “test ok”
student$ crontab -r  #タスクの消去
```
タスクは分、時間、日、月、曜日、コマンドの順で記載する。

| タスク例 | 詳細 |
|:--|:--|
| 15 12 11 * Fri echo “test ok”  | 毎⽉ 11 ⽇と毎週⾦曜⽇の 12:15 (24 時間形式) にtest okと表示  |
| /5 9-16 * Jul 5 echo “test ok”  | 7 ⽉の毎週⾦曜⽇の 09:00 から 16:00 までの間、5 分間隔でtest okと表示 |
| 58 23 * * 1-5 echo “test ok”  | 平⽇ (⽉曜⽇〜⾦曜⽇) の深夜0時の 2 分前に毎⽇test okと表示  |


# 6. ソフトウェアのインストールと更新
ソフトウェアパッケージの検索やインストールなどといった管理を行うことができる。ソフトウェアの管理には`rpm`や`dpkg`、`yum`、`apt`、`dnf`コマンドなどたくさんのコマンドが存在するが、ここでは、Red Hat系の最新Linuxディストリビューションで使われている**RPMパッケージ**を扱うためのパッケージ管理コマンド`dnf`について記載する。

## 6-1. dnfコマンド
`dnf`コマンドには様々な種類がある。以下に一般的に使用されている`dnf`コマンドに一例を示す。
| コマンド | 詳細 |
|:--|:--|
| dnf list | インストール済みと使用可能なパッケージをリスト |
| dnf group list | インストール済みと使用可能なグループをリスト |
| dnf search KEYWORD | キーワードでパッケージを検索 |
| dnf info PACKAGENAME | パッケージの詳細を表示 |
| dnf install PACKAGENAME | パッケージのインストール |
| dnf group install GROUPNAME | パッケージグループのインストール |
| dnf update | パッケージの更新 |
| dnf remove PACKAGENAME | パッケージを削除 |
| dnf history | トランザクション経歴を表示 |

## 6-2. ソフトウェアリポジトリの有効化
リポジトリとはソフトウェアパッケージが保管されている場所であり、リポジトリにアクセスし、有効化することでソフトウェアが使用可能である。
リポジトリを有効化するにあたって、使用可能なリポジトリとそのステータスを一覧表示する。
```bash:リポジトリの表示
root$ dnf repolist all
repo id repo name status
rhel-9.0-for-x86_64-appstream-rpms RHEL 9.0 AppStream enabled
rhel-9.0-for-x86_64-baseos-rpms RHEL 9.0 BaseOS enabled
```
そして、リポジトリのURLを使用して.repoファイルを作成する。
```bash:リポジトリの追加
root$ dnf config-manager \
--add-repo="https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/"
Adding repo from: https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/
```
※作成した.repoファイルは/etc/yum.repos.d/ディレクトリ配下に置かれる。

追加したリポジトリはGPG鍵チェックを行うことで使用できるようになるが、**作成した.repoファイルの最終行に`gpgcheck=0`を追加することでGPG鍵チェックを無効にすることができる。**

# 7. rootパスワードのリセット
rootパスワードを忘れてしまったときはシステムにログインしてrootのパスワードを変更することができる。
パスワードの変更には以下の方法を用いる。

1. システムをリブートする：`$ systemctl reboot`
1. Enterキー以外のいずれかのキーを押してブートローダー（通常ログイン画面）のカウントダウンを中断
1. カーネルをrescueカーネルエントリー（名前にrescueという文字が含まれる行）に移動してeキーを押す
1. カーネルコマンドライン（Linuxから始まる行）にカーソルを移動させ、行の最後に`rd.break`を追記
1. Ctrl + x キーでブート
1. プロンプトが表示されたらEnterキーを押してメンテナンスを実行

上記の手順を行うとシェルが表示される。ここでrootパスワードのリセットを行う。
以下のコマンドを順に入力することでパスワードのリセットが完了する。
```bash: rootパスワードのリセット
sh-5.1# mount -o remount,rw /sysroo
sh-5.1# chroot /sysroot
sh-5.1# passwd root
sh-5.1# touch /.autorelabel
sh-5.1# exit
sh-5.1# exit
```
上記を入力後、新しいrootパスワードの状態でシステムがブートされる。

# 8. その他
これまでに記載したコマンドはLinuxの管理者コマンドの中でもごく一部であり、すべてのLinuxコマンドを覚えるのはほぼ不可能である。そこで、`man`コマンドを用いることでそのコマンドがどのような機能を持っているのか調べることができる。
ただし、`man`コマンドはすべて英語表記である。
```bash
root$ man 調べたいコマンド
```
また、`man`コマンドで表示された文書内を検索したいときは"/"を打ち込むことで検索状態にすることができる。
さらに、`mandb`を用いてLinuxコマンドの一覧を自分のPCにダウンロードすることでキーワード検索も行うことができる。
```bash
root$ mandb  #データベースのダウンロード
root$ man -k キーワード(userなど)
```
※`mandb`コマンドはrootユーザでしか実行することができない。