LPIC102チートシート

# 概要
LPIC102に合格するためのチートシート

https://www.lpi.org/ja/our-certifications/lpic-1-overview/

試験概要

- バージョン：5.0
- 試験時間：90分
- 問題数：60問
- 合格点：500点（200~800点満点）

出題分野（数字は重要度を示す）
- 105 シェル，シェルスクリプト（8）
    - 105.1 シェル環境をカスタマイズして使用する（4）
    - 105.2 簡単なスクリプトをカスタマイズする（4）
- 106 ユーザーインターフェースとデスクトップ（4）
    - 106.1 X11のインストールと設定（2）
    - 106.2 グラフィカルデスクトップ（1）
    - 106.3 アクセシビリティ（1）
- 107 管理タスク（12）
    - 107.1 ユーザーおよびグループアカウントと関連するシステムファイルを管理する（5）
    - 107.2 ジョブのスケジュール設定によるシステム管理タスクの自動化（4）
    - 107.3 ローカリゼーションと国際化（3）
- 108 必須システムサービス（12）
    - 108.1 システム時刻を管理する（3）
    - 108.2 システムロギング（4）
    - 108.3 メール転送エージェント(MTA)の基本（3）
    - 108.4 プリンタの管理と印刷（2）
- 109 ネットワークの基礎（14）
    - 109.1 インターネットプロトコルの基礎（4）
    - 109.2 基本的なネットワーク構成（4）
    - 109.3 基本的なネットワークのトラブルシューティング（4）
    - 109.4 クライアント側のDNSを設定する（2）
- 110 セキュリティ（10）
    - 110.1 セキュリティ管理タスクを実行する（3）
    - 110.2 ホストのセキュリティを設定する（3）
    - 110.3 暗号化によるデータの保護（4）


# 105 シェル，シェルスクリプト（8）
## 105.1 シェル環境をカスタマイズして使用する（4）
コマンド
- `set`：オプション機能を有効化(`-o`)・無効化(`+o`)する．
    - 引数なしで実行した場合，定義済みのシェル変数や環境変数，シェル関数を表示する
    - `-o allexport`：新規作成した変数を自動的に環境変数にする
    - `-o noclobber`：リダイレクトで既存のファイルの上書きを不可にする
- `unset`：変数を削除する
- `export`：シェル変数を環境変数にする（`export VAL`）（`$`はつけない）
- `env`：すべての環境変数を表示する
- `printenv`：指定した環境変数の値を表示（`printenv PATH`）
    - 引数なしはすべての環境変数を表示する
- `alias`：コマンドに任意の別名をつける（`alias ls='ls -la'`）
    - `\`をつけて実行すると一時的にaliasを解除する（`\ls`）
- `unalias`：エイリアスを削除
- `function`：シェル関数を定義する（`function func1() {処理内容}`）
- `declare`：変数を宣言する．

bash起動時に実行される環境設定ファイル
- `/etc/bash.bashrc`：Debian系で非ログイン状態のbash起動時に読み込む
- `/etc/bashrc`：RedHat系で非ログイン状態のbash起動時に読み込む
- `~/.bashrc`：bash起動時に読み込む
- `~/.bash_logout`：ログアウト時に読み込む
- ログイン時に読み込むファイルの順番
    ```
    /etc/profile -> ~/.bash_profile -> ~/.bash_login -> ~/.profile
    ```

## 105.2 簡単なスクリプトをカスタマイズする（4）
コマンド
- `test`：条件式に基づいて真は0，偽は1の終了ステータスを返す（`test $NUM1 -eq $NUM2`）
- `seq`：連続した値を生成
    ```
    seq　開始する数値　終了する数値
    seq　終了する数値(1から開始)
    seq　開始する数値 増加する値 終了する数値
    ```

特殊なシェル変数
- `$$`：シェルのPID
- `$?`：最後に実行したコマンドの終了値．（正常終了の場合0を返す）
- `$#`：引数の個数
- `$*`：区切り文字（デフォルトは空白）で区切られたすべての引数
- `$0`：実行ファイル名
- `$1`,`$2`：N番目の引数

条件式（真）
- ファイル
    - `-d パス`：パスが存在しディレクトリ
    - `-e パス`：パスが存在する
    - `-f パス`：パスが存在しファイル
    - `-x パス`：パスが存在し実行可能
- 文字列
    - `-n 文字列`：文字列の長さが0より大きい
    - `-z 文字列`：文字列の長さが0
    - `文字列1 = 文字列2`：文字列1が文字列2に等しい
    - `文字列1 != 文字列2`：文字列1と文字列2が異なる
- 数値
    - `数値1 -eq 数値2`：数値1＝数値2
    - `数値1 -ne 数値2`：数値1!＝数値2
    - `数値1 -gt 数値2`：数値1>数値2
    - `数値1 -le 数値2`：数値1<=数値2

構文
- for
    ```
    for i in 1 2 3
    do
      echo $i
    done
    ```
- while
   ```
   while [ $n -le 5 ]
   do 
     処理
   done
   ```
- if 
  ```
  if test -d /var/log
  then
    echo "true"
  else
    echo "false"
  fi
  ```
- case
```
　case $FRUIT in
    apple)
      echo "You chose an apple."
      ;;
    banana)
      echo "You chose a banana."
      ;;
    *)
      echo "Unknown fruit."
      ;;
  esac
```


# 106 ユーザーインターフェースとデスクトップ（4）
## 106.1 X11のインストールと設定（2）
コマンド
- `xhost`：Xサーバへのアクセスを許可する（`xhost +192.168.1.20`）

X Window System（通称はXまたはX11）：GUI環境を提供するシステム
- `/etc/X11/xorg.conf`：Xの設定ファイル
  - ServerLayout：入出力デバイスに関する設定
  - InputDevice：キーボードやマウスなどの入力デバイスの設定
  - Device：ビデオカードの設定
  - Screen：ディスプレイの表示色数や画面サイズの設定
- 環境変数`DISPLAY`：Xサーバを指定するための環境変数
- Wayland：Xに代わる新しい表示プロトコル

## 106.2 グラフィカルデスクトップ（1）
デスクトップ環境
- GNOME：Red Hat Enterprise Linux、CentOS、Ubuntu、Fedoraなどで標準
- KDE：openSUSE、Kubuntuなどで標準
- Xfce：メモリやCPUの消費量が少なく軽量

ディスプレイマネージャー：ランレベルが5の時ユーザにグラフィカルログイン画面（GUI環境のログイン）を提供する
- XDM：X.Org標準
- GDM：GNOME標準
- KDM：KDM標準
- LightDM：Ubuntu標準

ウィンドウマネージャー：ウィンドウの概観、アイコンやカーソル、メニューなどを提供するXクライアントのアプリケーション
- twm：最小限の機能
- kwin：KDE標準

リモートアクセスのプロトコル
- VNC：LinuxやWindows、macOSなど異なるOS間で接続できる
- SPICE：オープンソースとして開発されている画面転送プロトコル．VNCがサポートしていない多くの機能をサポー
- RDP：Windows標準
- XDMCP：XサーバとXクライアント間を制御する

## 106.3 アクセシビリティ（1）
アクセシビリティ：ユーザーを支援するための機能
- 音声認識
- スクリーンリーダー：スクリーンに表示された文字を読み上げる（emacspeak）
- オンスクリーンキーボード：キーボードをスクリーンに表示（gok）
- キーボードアクセシビリティ：キー入力のサポート
  - スティッキーキー：キーの同時押しをサポート
  - スローキー：キーを押し続けないと認識しない
  - バウンスキー：同じキーの入力を一定時間無視
  - トグルキー：NumLockやCapsLockが切り替わるとビープ音が鳴る


# 107 管理タスク（12）
## 107.1 ユーザーおよびグループアカウントと関連するシステムファイルを管理する（5）
コマンド
- `useradd`：ユーザの登録
  - `-c`：コメント指定
  - `-d`：ホームディレクトリを指定
  - `-e`：アカウントの失効日を指定
  - `-f`：パスワードが切れてからアカウントが使えなくなるまでの日数を指定
  - `-g`：1次グループを指定
  - `-G`：2次グループを指定
- `usermod`：ユーザ情報の変更
- `userdel`：ユーザの削除
- `groupadd`：グループの登録
- `id`：ユーザのUIDやGIDを表示
- `groups`：ユーザの所属するグループを表示
- `passwd`：ユーザのパスワードを変更
- `chage`：パスワードの有効期限を変更
- `getent`：パスワードとグループのデータベースからエントリを抽出する

ファイル
- `/etc/passwd`：ユーザーのアカウント情報を格納．7つのフィールド
  ```
  user1:X:1001:100::/home/user1:/bin/bash
  ユーザー名：パスワード：UID：グループID：コメント(省略可)：ホームディレクトリ：ログインシェル
  ```
- `/etc/group`：グループに関する情報を格納．4つのフィールド
  ```
  group1:X:100:
  グループ名：グループパスワード：GID：グループメンバーのリスト
  ```
- `/etc/shadow`：暗号化されているパスワード（シャドウパスワード）や、パスワードの有効期限に関する情報が格納．9つのフィールド
- 
- `/etc/gshadow`：暗号化されたグループパスワードなどを格納．4つのフィールド
- `/etc/skel`：ユーザーのホームディレクトリに配置するファイルやディレクトリを格納

## 107.2 ジョブのスケジュール設定によるシステム管理タスクの自動化（4）
コマンド
- `crontab`：コマンドを定期実行する（`crontab -e hoge`）
  - `-e`：設定ファイルを編集
  - `-l`：設定ファイルを表示
  - `-r`：設定ファイルを削除
- `at`：1度だけ実行するジョブを予約する（at 23:00）
  - `-l`：予約中のジョブを表示（`atq`と同様）
  - `-d　ジョブ番号`：指定した予約中のジョブを削除（`atrm`と同様）
- `batch`：システムの負荷が低いときに指定コマンドを実行

crontabの書式
```
* * * * * command
[分] [時] [日] [月] [曜日（0,7=日曜～6=土曜）]
```
- `*`：すべての値に一致
- `-`：範囲の指定（`1-3`）
- `,`：複数の値（`1,2,3`）
- `/`：間隔の指定（*/2は時間の場合2時間毎） 

ファイル
1. 「`/etc/cron.allow`」ファイルがあれば，記述のあるユーザのみがcronを利用可能
2. 1がなければ「`/etc/cron.deny`」を参照し，記述の無いユーザがcronを利用可能
3. 1,2のファイルが両方なければrootユーザのみが利用可能

## 107.3 ローカリゼーションと国際化（3）
コマンド
- `locale`：ロケール情報を表示
  - `-a`：利用可能なロケールをすべて表示
  - `-m`：利用可能なエンコーディングをすべて表示
- `iconv`：文字コードを変換する（`iconv -f UTF-8 -t EUC-JP example.txt > example-EUC.txt`） 
  - `-l`：扱える文字コードを表示
  - `-f`：変換前の文字コードを指定
  - `-t`：変換後の文字コードを指定
- `tzselect`：タイムゾーン値を確認する
- `tzconfig`：/etc/localtimeと/etc/timezoneファイルをまとめて設定できる

ロケール変数
- `LC_CTYPE`：文字の分類，文字の種類の規定
- `LC_NUMERIC`：数値の書式
- `LC_MESSAGES`：出力メッセージの言語
- `LC_MONETARY`：通貨の書式
- `LC_ALL`：指定した値が全てカテゴリを上書きしカテゴリごとの設定ができない
- `LANG`：指定した値が全てのカテゴリを上書きするがカテゴリごとの設定はできる

文字コード
- ASCII：128種類の文字（英字，記号，制御コード）
- ISO-8859：ACIIを8ビットに拡張．256種類の文字を表現
- EUC-JP：UNIX環境で標準的に利用されていた日本語文字コード
- Shift_JIS：WindowsあMac OSで標準利用される日本語文字コード
- Unicode：多言語を扱う符号化文字集合（UTF-8）

# 108 必須システムサービス（12）
##  108.1 システム時刻を管理する（3）
コマンド
- `date`：システムの時刻を取得
- `hwclock`：コンピュータに内蔵された時刻を取得
  - `-r`：ハードウェア時刻を表示（オプションなしと同様）
  - `-s, --hctosys`：ハードウェア時刻をシステム時刻に反映
  - `-w, --systohc`：システム時刻をハードウェア時刻に反映
- `ntpdate`：NTPサーバ（ntpd）からシステム時刻に反映
- `chronyc`：NTPサーバ（Chrony）からシステム時刻に反映

Chronyの設定ファイル`/etc/chrony.conf`の主な設定項目
- server：時刻を取得するNTPサーバを指定
- peer：時刻を取得するNTPサーバを指定
- pool：時刻を取得するNTPサーバのプール
- driftfile：自身の時刻のずれ具合を記録するファイルを指定
- rtcsync：システムクロックをハードウェアクロックにコピーする

## 108.2 システムロギング（4）
コマンド
- `logger`：手動でログメッセージを生成する
- `logrotate`：ログのローテーションを実行する
- `systemd-cat`：ジャーナルファイルに書き込む
- `journalctl`：ystemdの動作するシステムで、各Unitが出力するログを参照する
  - `-a (--all)` ：すべて表示
  - `-f (--follow)`：ログをリアルタイム表示
  - `-l (--full)`：すべてのログを表示

## 108.3 メール転送エージェント(MTA)の基本（3）
コマンド
- `mail`：受信メールを一覧表示する（`/var/spool/mail/`内）
- `mailq`：送信待ちのメールキューを一覧表示する（`/var/spool/mqueue/`内）
- `newaliases`：/etc/aliasesファイルの変更を反映させるコマンド

プログラム
- MTA(Mail Transfer Agent)：メール転送をおこなう
  - sendmail：古くから使われるMTA．セキュリティ面で問題あり．処理速度が遅い．
  - Postfix：処理が高速で設定が容易
  - exim：Debian系の標準．
- MDA(Mail Delivery Agent)：ローカルのメールスプールへ配送する
- MUA(Mail User Agent)：ユーザがメールを扱う

## 108.4 プリンタの管理と印刷（2）
コマンド（標準的なCUPS）
- `lp`：印刷ジョブを生成しプリントキューに登録
- `cancel`：プリントキューにある印刷ジョブを削除
- `lpstat`：プリントキューにある印刷ジョブを表示

レガシーな印刷コマンド
- `lpr`：印刷ジョブを生成しプリントキューに登録
- `lprm`：プリントキューにある印刷ジョブを削除
- `lpq`：プリントキューにある印刷ジョブを表示


# 109 ネットワークの基礎（14）
## 109.1 インターネットプロトコルの基礎（4）
通信プロトコル
- IP：インターネット通信プロトコルの中核をなす．ネットワーク機器へのアドレス付与やパケットの分割や統合を行う機能を持つ
- TCP：パケットの再送，到達確認などの制御を行う．コネクション型
- UDP：コネクションレス型のプロトコル．TCPよりデータ転送速度が速い
- ICMP：パケットが到達できなかった場合のエラーを通知する．pingやtracerouteコマンドで使用
- ARP：IPアドレスからMACアドレスを求める

IPアドレス
| クラス | 第1オクテットの範囲 | IPアドレスの範囲     | プライベートIPの範囲   |
|--------|----------------------|----------------------|------------------------|
| A      | 1 - 126              | 1.0.0.0 - 126.255.255.255  | 10.0.0.0 - 10.255.255.255   |
| B      | 128 - 191            | 128.0.0.0 - 191.255.255.255 | 172.16.0.0 - 172.31.255.255 |
| C      | 192 - 223            | 192.0.0.0 - 223.255.255.255 | 192.168.0.0 - 192.168.255.255 |

サブネット
- サブネットマスク：ネットワーク部とホスト部を区別する数値．`/24`のようなCIDR表記を用いる
- ネットワークアドレス：ネットワーク自体を表すアドレス．ホスト部をすべて0にする
- ブロードキャストアドレス：全ホストにパケットを送るためのアドレス．ホスト部を1にする

IPv6の特徴
- 128ビット
- 省略表記可能
- IPアドレスの自動割り当て機能を標準で実装
- IPsec（暗号化通信）を標準で実装
```
例）
0001:5000:0001:0000:0000:0002:000A:0001 → 1:5000:1::2:A:1
2001:5000:0001:0000:0000:DA02:0000:1001 → 2001:5000:1::DA02:0:1001
2001:5000:0001:0000:0000:0000:0000:0000 → 2001:5000:1::
```

ポート番号
- ウェルノウンポート（0~1023）：システムやroot権限をmp津プロセスに割り当てられたポート番号
- レジスタードポート（1024~49151）：よく使われるプログラムに割り当てられたポート．非特権ユーザも使用可能
- ダイナミックポート（49152~65535）：自由に使用可能なポート

代表的なウェルノウンポート
- 20：FTP：ファイル転送（データ用）
- 21：FTP：ファイル転送（制御用）
- 22：SSH：リモートホストの遠隔操作（暗号化あり）
- 23：TELNET：リモートホストの遠隔操作（暗号化なし）
- 25：SMTP：電子メール送信
- 53：DNS：名前解決
- 80：HTTP：テキストや画像などのコンテンツ送受信（暗号化なし）
- 110：POP3：電子メールの受信
- 143：IMAP：電子メールの受信
- 443：HTTPS：テキストや画像などのコンテンツ送受信（暗号化あり）


## 109.2 基本的なネットワーク構成（4）
コマンド
- `ifup`：設定ファイルに基づいて指定したインタフェースを有効にする
- `ipdown`：設定ファイルに基づいて指定したインタフェースを無効にする
- `nmcli`：NetworkManagerを管理する

設定ファイル
- `/etc/hostname`：ホスト名を設定
- `/etc/sysconfig/network`：ホスト名，ネットワーク機能の有効/無効，デフォルトゲートウェイなどを設定
- `/etc/hosts`：IPアドレスとホスト名の対応付け
- `/etc/nsswitch.conf`：名前解決やサービス名解決の際の問合せ順序を指定
- `/etc/resolv.conf`：ドメイン名やDNSサーバーの指定
- `/etc/services`：サービス名とポート番号の対応付け

## 109.3 基本的なネットワークのトラブルシューティング（4）
ネットワークコマンド
- `ifconfig`：インターフェイスの設定や表示
- `ifup/ifdown`：インターフェイスの有効/無効化
- `netstat`：ローカルネットワークの情報を表示
- `route`：ルーティングテーブルの設定や表示 
- `whois`：ドメインの管理者や所有者を表示

ネットワークの疎通確認コマンド
- `ping`：ICMPパケットを使って通信確認
  - `ping6`：IPv6に対応したコマンド
- `traceroute`：リモートホストまでの経路情報を表示
- `tracepath`：リモートホストまでの経路と経路上の最大転送単位を確認

## 109.4 クライアント側のDNSを設定する（2）
ホスト名とIPアドレスの変換を行うコマンド
- nslookup
- host
  - `-t`：検索タイプを指定
  - `-v`：詳細を出力
- dig：以下のような検索タイプを指定できる（`dig yahoo.co.jp any`）
  - `a`：IPアドレス（デフォルト）
  - `any`：すべての情報
  - `mx`：メールサーバ
  - `ns`：ネームサーバ
  - `soa`：ゾーンの情報
  - `txt`：テキスト情報
- getent


# 110 セキュリティ（10）
## 110.1 セキュリティ管理タスクを実行する（3）
コマンド
- `su`：ユーザを切り替える
- `sudo`：別のユーザとしてコマンド実行．rootユーザとしてコマンド実行する場合に主に使用
- `visudo`：ユーザ権限の設定ファイルを編集する
- `last`：最近ログインしたユーザの一覧を表示する
- `ulimit`：ユーザが使用できるリソースの権限を確認する
- `who, w`：現在ログインしているユーザを表示する
- `chage`：パスワードの有効期限を変更する
 - `-l`：有効期限に関する情報を表示
 - `-m`：パスワード変更感覚の最短日数を指定（`chage -m 0 user1`）
 - `-M`：パスワードが有効な最長日数を指定（`chage -M 90 user1`）
 - `-I`：パスワード期限が切れた後にアカウントがロックされるまでの日数を指定（`chage -I 7 user1`）
 - `-W`：パスワード期限切れの前に警告を表示する日数（`chage -W 14 user1`）
 - `-E`：ユーザアカウントの有効期限を指定
- `lsof`：特定のポートを使用しているプロセスなどを表示（`lsof -i:22`）
- `fuser`：システムの特定のリソースを使用中のプロセスを検索し強制終了することができる

ファイル
`/var/log/wtmp`：最近ログインしたユーザ一覧
`/etc/sudoers`：ユーザ権限を記述した設定ファイル．sodoコマンドで参照される

## 110.2 ホストのセキュリティを設定する（3）
スーパーデーモン：受信ネットワーク接続の待ち受けを一手に引き受ける．利用頻度の低いTELNETやFTPといったサービスを必要に応じてきどうする．
- デーモン名：`inetd`, 設定ファイル：`/etc/inetd.conf`，TCPラッパーを使用してアクセス制御をする
- デーモン名：`xinetd`, 設定ファイル：`/etc/xinetd.conf`，`/etc/xinetd.d/`でアクセス制御をする
- アクセス制御
    1. `/etc/hosts.allow`に記載のホストは許可
    2. `/etc/hosts.deny`に記載のホストは拒否
    3. 両方のファイルに記載のないホストはすべて許可

## 110.3 暗号化によるデータの保護（4）
コマンド
- `ssh`：リモートホストに接続する
- `ssh-keygen`：鍵ペアを作成する
- `gpg`：GnuPGという暗号化プログラムを使用してファイルの暗号化や復号をおこなう．引数なしは復号．
  - `--gen-key`：鍵ペアを作成する
  - `--export`：公開鍵をエクスポートする
  - `--import`：公開鍵をインポートする
  - `--list-keys`：公開鍵を一覧表示する
  - `--sign`：ファイルに署名する
  - `--verify`：ファイルの署名を検証する
  - `-e`：公開鍵を使用してファイルを暗号化する

ファイル
- `/etc/ssh/ssh_config`：SSHクライアントの設定ファイル
- `/etc/ssh/sshd_config`：SSHサーバの設定ファイル
- `~/.ssh/known_hosts`：SSHクライアントの認証鍵リスト
- `~/.ssh/authorized_keys`：SSHサーバの認証鍵リスト

認証方法
- ホスト認証（公開鍵方式）：正しいホストかを確認する方式
    1. クライアントがサーバに接続
    1. サーバーは自身の公開鍵をクライアントに送信
    1. クライアント側で送信された公開鍵と~/.ssh/known_hosts内の公開鍵が一致するか検証
- ユーザ認証（公開鍵方式）：正しいユーザかを確認する方式
    1. クライアントがサーバに接続
    1. サーバは鍵の利用ができるかクライアントに確認
    1. クライアントはユーザの秘密鍵で署名を作成しサーバに送信
    1. サーバはユーザの公開鍵で署名を検証

暗号方式
- rsa
- dsa
- ecdsa
- ed25519