⏱ 約 75 分 · 修了演習
Part 1Chapter 08/Part 1 集大成

修了演習 ── check-logins スクリプトを完成させる

あなたの手で書く 2 行のシェルスクリプトが、Linux 学習の最小単位を 1 周回します。chmodPATH$()> ── Part 1 で覚えた道具を全部使って、1 本のレポートを生み出します。

所要時間約 75 分(通常章の 1.5 倍 / 11 ステップ)
章タイプlab
前提知識Chapter 1-7 全部(SSH / ファイル操作 / grep・パイプ / vim / 環境変数 / 権限)
使用機材踏み台 workstation01 + 演習用サーバ learner01
関連章前: Chapter 7「ユーザとパーミッション」/ 次: Part 2「ネットワーク基礎」

Part 1 の知識を 1 本のシナリオで使い切る

Chapter 1 〜 7 の道具を 1 本のシナリオ に組み立てる修了演習です。/var/log/auth.log を読む自作スクリプト check-logins(v1 → v2 の 2 段階)を作って、結果をファイルに保存します。所要 75 分。

bash · ゴール
$ check-logins > ~/report.txt
$ cat ~/report.txt
Failed logins on 2026年  5月 17日 日曜日 11:13:47 JST: 4
Successful logins: 7
Part 1 の修了演習: この章を終えると「サーバの上に、自分専用の小さな自動化ツールを作って動かす」というサーバ管理の最小単位を 1 周回せます。Part 3 以降で扱う cron(定期実行)シェルスクリプト の入り口に立てます。
Chapter 1 〜 7 のどこを使うか(再演マップ)

check-logins はたった 2 行の小さなシェルスクリプトですが、これを作るために Chapter 1 〜 7 で習ったことを 1 つも飛ばさず 通り抜けます。v1 = version 1(最初に書く版)/ v2 = version 2(改修版) の 2 段階で育てます。

使う章何を再演するか
Ch1ssh student@learner01 で接続する
Ch2cd ~ / ls -la で現状把握
Ch3mkdir ~/bin / touch でファイル作成、後半で cp バックアップ → rm の現場の作法
Ch4grep "Failed password" /var/log/auth.log | wc -l の集計
Ch5vim で v1 を書き、後半で dd / yy / :N を使って v2 に修正
Ch6echo $PATH で確認、~/.bashrcexport PATH を追記、source で反映
Ch7chmod +x で実行権限を付ける、adm グループで /var/log/auth.log を読む

スクリプトとは、複数の Linux コマンドを 1 つのファイルにまとめて、まとめて実行できるようにしたもの。中身は vim で書いたただのテキストファイル ── でも #!/bin/bashchmod +x があれば 自分専用のコマンド として動き出します。新概念は リダイレクト > ひとつだけ(演習中の callout で説明します)。

この章を終えるとできること

自作ツールを動かす 4 動作 を手に覚えます。

$ mkdir ~/bin
$ touch check-logins
$ vim check-logins
① 作る
mkdir / touch / vim で
スクリプトを書く
mkdir · touch · vim
$ chmod +x check-logins
$ echo $PATH
$ source ~/.bashrc
② 通す
chmod +x + PATH 設定で
どこからでも呼べる
chmod +x · PATH
$ cp v1 v1.bak
$ vim v1
$ rm v1.bak
③ 直す
cp バックアップ → 修正
→ rm で不要分を削除
cp · vim · rm
$ check-logins > report.txt
$ cat report.txt
Failed: 4 / OK: 7
④ 残す
> リダイレクトで
レポートをファイル化
> report.txt

この 4 動作を 1 セッションで通せると、「Permission denied」「command not found」「cannot open auth.log」 という Part 1 で覚えた 3 大エラー に出会っても、原因が即座に切り分けられて、自分で直せます。

試してみよう:check-logins を一から作って、レポートに残す

Chapter 1 〜 7 のすべてを使って、自作スクリプト → PATH 通し → 改修 → レポート化 までを 1 セッションで通します。

演習環境

出発地点踏み台 workstation01alice でログイン中)
接続先演習用サーバ learner01
ログインユーザーstudent
前提Chapter 1-7 の演習完了(adm は学習環境で student に事前付与済み/その種明かしは Ch7)
所要時間約 75 分(11 ステップ)
🛟 演習の安全範囲

触るのは ~/bin/ 配下のファイルと ~/.bashrc の末尾 1 行、~/report.txt の 3 つだけ。すべて元に戻せる操作です。root 権限は不要adm は学習環境で事前付与済みの前提)。.bashrc を触るところで > ではなく >> を使うことだけ注意してください(STEP 06 で詳述)。

SSH 接続 ── workstation01 から learner01

bash · workstation01 から SSH
ssh student@learner01

Chapter 1 でやった踏み台から演習サーバへのジャンプを再演します。プロンプトが student@learner01:~$ に変わったら入室成功。

現状把握 ── cd ~ / ls -la

bash
cd ~
ls -la
# → 合計 32
# → drwxr-x--- 5 student student 4096  5月 17 11:13 .
# → drwxr-xr-x 6 root    root    4096  5月 12 08:47 ..
# → -rw-r--r-- 1 student student  220  3月 31  2024 .bash_logout
# → -rw-r--r-- 1 student student 3771  5月 17 11:13 .bashrc
# → drwx------ 2 student student 4096  5月 12 08:48 .cache
# → drwx------ 3 student student 4096  5月 12 08:48 .local
# → -rw-r--r-- 1 student student  807  3月 31  2024 .profile
# → drwx------ 2 student student 4096  5月 17 11:09 .ssh

~/bin が見当たらないことを確認(Chapter 2 で習った「ls -la で隠しファイルまで見る」)。

演習環境差分: Chapter 6 / Chapter 7 で ~/bin を作っていればここに bin ディレクトリも表示され、中に hello スクリプトが残っているはずです。それで問題ありません、消す必要はありません。次のステップ ③ の mkdir ~/bin だけは「既に存在します」とエラーになるのでスキップして、touch ~/bin/check-logins から進めてください。

作る ── mkdir ~/bintouch ~/bin/check-logins

bash
mkdir ~/bin                   # ★ ~/bin が既にある人はこの行をスキップ
touch ~/bin/check-logins
ls -la ~/bin/
# → 合計 8
# → drwxrwxr-x 2 student student 4096  5月 17 11:13 .
# → drwxr-x--- 6 student student 4096  5月 17 11:13 ..
# → -rw-rw-r-- 1 student student    0  5月 17 11:13 check-logins
mkdir: ディレクトリを作成できません: ファイルが存在します と出たら: Chapter 6 / Chapter 7 で既に ~/bin を作っているからです。エラーですが 害はありません(既存ディレクトリは壊れません)。そのまま次の touch から進めてください。
  • touch 直後の権限は -rw-rw-r--(Ubuntu の umask=002 の効果 / Chapter 7 で観察したのと同じ)
  • まだ x がない ことに注目してください。これが後で Permission denied を引き起こします。
  • 既存 ~/bin を使い回した人は、上記の表示に hello(Ch6/Ch7 で作ったもの)も並んでいます。それで OK。
新概念 · $() コマンド置換 次の STEP 04 で書く v1 の中に $(grep "Failed password" /var/log/auth.log | wc -l) という形が出てきます。これは コマンド置換 という記法で、括弧の中のコマンドを先に実行して、その出力結果を文字列として埋め込む 働きをします。たとえば echo "今日は $(date) です" と書くと、実行時に date が走って「今日は 2026年 5月 17日 ... です」になります。echo の文字列を 動的に組み立てる 道具で、Part 3 以降のシェルスクリプトで毎回登場します。

vim で v1 を書く

v1 = version 1(最初に書く版)。失敗ログイン数だけを表示するシンプルな 2 行スクリプトを作ります。

bash
vim ~/bin/check-logins

Chapter 5 で覚えた i で挿入モード → :wq で保存終了 だけで OK。中身:

~/bin/check-logins (v1)
#!/bin/bash
echo "Failed logins: $(grep "Failed password" /var/log/auth.log | wc -l)"

たった 2 行。#!/bin/bashシバン (shebang) といって、「このファイルは bash で実行してね」とシェルに伝える宣言です。

bash · 確認
cat ~/bin/check-logins
ls -la ~/bin/check-logins
# → -rw-rw-r-- 1 student student 86  5月 17 11:13 /home/student/bin/check-logins

実行 → Permission deniedchmod +x

bash · まずは素直に実行 → 怒られる
~/bin/check-logins
# → bash: /home/student/bin/check-logins: 許可がありません
⚠ 3 大エラー / 1 つ目

Chapter 7 で習ったとおり、x が付いていないと実行できません。これは Linux 初心者なら誰もが通る関門。落ち着いて chmod +x で実行権限を付け足します。

bash
chmod +x ~/bin/check-logins
ls -la ~/bin/check-logins
# → -rwxrwxr-x 1 student student 86  5月 17 11:13 /home/student/bin/check-logins

~/bin/check-logins
# → Failed logins: 4

x を付けた瞬間に実行できるようになりました。Chapter 7 の「chmod +x で実行ファイルになる」を、今度は自分の手で再演しました。

新概念 · リダイレクト > / >> / < コマンドの出力は通常 画面(標準出力) に表示されますが、ファイルに流し替える のがリダイレクトです。この後 STEP 06 で >>、STEP 10 で > を使います。
演算子意味
>ファイルに 上書き(既存内容は消える)
>>ファイルに 追記(既存内容の末尾に追加)
<ファイルの中身を 標準入力に流し込む(読み込み専用)

PATH を通す ── echo $PATH~/.bashrcsource

スクリプトを フルパスではなくコマンド名で 呼びたいので、PATH を通します。

bash · まず現状確認
echo $PATH
# → /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

check-logins
# → bash: check-logins: コマンドが見つかりません
⚠ 3 大エラー / 2 つ目

~/bin$PATH に含まれていないので、シェルはスクリプトを見つけられません。Chapter 6 で習った command not found の原因切り分け の出番です。

command not found が出ず check-logins が動いた人へ: Chapter 6 で ~/.bashrc に PATH を追記済みだと、ログイン時点で ~/bin$PATH に入っているため、ここはエラーになりません。それで正常です。下の「~/.bashrc へ追記」は すでに済んでいる ので、二重に足さず次の source 確認へ進んでください。

~/.bashrc の末尾に追記:

bash
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
tail -3 ~/.bashrc
# → ...
# → export PATH="$HOME/bin:$PATH"
⚠ ここは必ず >>

§ 1 で学んだとおり、>上書き なので echo '...' > ~/.bashrc と打つと ~/.bashrc の中身が 1 行だけのファイルに置き換わって全部消えます(Linux 初心者がやりがちな事故 No.1)。末尾に足したいときは必ず >> を使ってください。

vim で書いてもいい: vim ~/.bashrc で開いて Shift+G(最終行へジャンプ)→ o(下に新規行 / Ch5 で習った)→ 上の 1 行を入力 → Esc :wq でも同じ。vim で開けば既存の .bashrc を壊す心配がないので、心配なら vim 派でも OK。
2 回目は二重追記に注意: >> は実行するたびに 1 行ずつ足されます。やり直すときは先に grep PATH ~/.bashrc で確認し、既に同じ行があれば追記しないでください。重複しても動きますが、無駄なので 1 行に保つのが綺麗です。確実に 1 行だけにしたいなら次の「足す前に確認」型を使います:
grep -q '$HOME/bin' ~/.bashrc || echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
|| = 左が失敗したときだけ右を実行。「まだ無ければ足す」というイディオム)

設定を 今のシェルに反映 します:

bash
source ~/.bashrc
echo $PATH
# → /home/student/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:...

check-logins
# → Failed logins: 4

~/bin$PATH の先頭に追加され、check-loginsどこからでも呼べる ようになりました。

現場の作法 · cp でバックアップ → 修正 → 動作確認 → rm で削除 動いているスクリプトを修正するときの 鉄則の流れ: ① cp でバックアップ → ② vim で修正 → ③ 動作確認 → ④ OK なら rm でバックアップ削除。.bak は Linux 文化のバックアップ慣習。Chapter 3 で触れた rm の現場の作法」 の意味がここで回収されます。「動いた瞬間に旧版を削除」することで、ディレクトリには常に 「今動いているバージョン 1 つだけ」 が残ります。

改修の準備 ── cp でバックアップ → v2 に書き換え

v2 = version 2(改修版)。v1 に「日時」「成功ログイン数」を追加した 3 行スクリプトに育てます。

ここから 現場の作法 で v1 を v2 に育てます。まずバックアップ:

bash
cd ~/bin
cp check-logins check-logins.bak
ls -la
# → -rwxrwxr-x 1 student student   86  ... check-logins
# → -rwxrwxr-x 1 student student   86  ... check-logins.bak

vim check-logins で v2 に書き換え。新仕様:

  • 日付を入れる($(date) でコマンド置換)
  • Successful login の集計も足す
  • 出力を 2 行に整形
~/bin/check-logins (v2)
#!/bin/bash
echo "Failed logins on $(date): $(grep "Failed password" /var/log/auth.log | wc -l)"
echo "Successful logins: $(grep "Accepted " /var/log/auth.log | wc -l)"
vim のおさらい: 全部を書き直すなら gg(先頭へジャンプ)→ dG(末尾まで全削除 / d + カーソル移動 G の合体技で「動いた範囲を削除」)→ i で入力。1 行だけ修正なら :N(N 行目にジャンプ)→ dd(その行削除)→ O大文字オー = Chapter 5 で習った o(下に新規行)の 上向き版 / カーソル行の に新規行)→ 入力 → Esc :wq。Chapter 5 で覚えたキーをここで使い込みます。

動作確認 → rm で不要になったバックアップを削除

bash
check-logins
# → Failed logins on 2026年  5月 17日 日曜日 11:13:47 JST: 4
# → Successful logins: 7

新仕様で正しく動くことが確認できたら、もう check-logins.bak は不要です。現場の作法 に従って rm で削除します:

bash
rm check-logins.bak
ls -la
# → -rwxrwxr-x 1 student student  169  ... check-logins
ディレクトリには 「今動いているバージョン (check-logins) 1 つだけ」 が残りました。「動作確認できたら、もう不要な check-logins.bakrm で消す」 までで 1 回の改修作業 ── これが Chapter 3 章末で予告した「rm の現場の作法」の正体です。

集計の中身を解剖 ── grepwc -ladm グループ

v2 の中身を 1 行ずつ解剖:

bash
grep "Failed password" /var/log/auth.log | wc -l
# → 4
grep "Accepted " /var/log/auth.log | wc -l
# → 7

Chapter 4 で習った grep で探す → パイプ | で渡す → wc -l で行数を数える の組み合わせ。/var/log/auth.logroot と adm グループしか読めない ファイルです:

bash
ls -la /var/log/auth.log
# → -rw-r----- 1 syslog adm 10307  5月 17 11:13 /var/log/auth.log
groups
# → student adm
⚠ 3 大エラー / 3 つ目(自前環境で adm 未付与の人だけ)

学習環境では admstudent に事前付与済みなので、ここは普通に読めます(Ch7 の種明かしを思い出してください)。一方、自分で構築した環境で adm 未付与だと、ここで cannot open /var/log/auth.log という 3 つ目のエラーに詰まります(Part 1 で覚えた 3 大エラーの最後)。その場合の復旧は exitsudo usermod -aG adm student → 再 SSH です。

結果をファイルに残す ── > リダイレクト

bash
check-logins > ~/report.txt
ls -la ~/report.txt
# → -rw-rw-r-- 1 student student 84  5月 17 11:13 /home/student/report.txt

画面には何も出ません。画面に出るはずだったものが ~/report.txt に流れた からです(この章で学んだ唯一の新概念)。

ゴール ── cat ~/report.txt でレポート確認

bash
cat ~/report.txt
Failed logins on 2026年  5月 17日 日曜日 11:13:47 JST: 4
Successful logins: 7
ゴール到達 ✓ あなたが書いた check-logins が、~/report.txt に 2 行のレポートを吐き出しました。「§ 06 次の章へ」 で Part 1 全体を振り返ります。
🛟 エラー別 復元手順
起きたこと対処
~/bin/check-logins: 許可がありませんchmod +x ~/bin/check-logins で実行権限を付ける(STEP 05)
bash: check-logins: コマンドが見つかりません~/.bashrcexport PATH="$HOME/bin:$PATH" を追記して source ~/.bashrc、または再ログイン(STEP 06)
cannot open /var/log/auth.log: 許可がありませんgroupsadm が見えるか確認。見えなければ exit → 再 SSH で新セッションを開く(学習環境では adm 事前付与済み)
check-logins > ~/report.txt~/report.txt が空になった~/bin/check-logins 単体で出力が出るか先に確認。出ないなら chmod / PATH / adm のどれかが未解決
v2 への書き換えに失敗cp ~/bin/check-logins.bak ~/bin/check-logins でバックアップから復元(STEP 07 で cp した意味)
~/.bashrc を壊して新規ログインで打ち上げ失敗cp ~/.bashrc ~/.bashrc.bak を事前に取るのが安全策。壊した場合は nano ~/.bashrc でも開けるので余計な行を消す

詰まったら

💡 軽く方向だけ
Part 1 修了演習は Chapter 1-7 を 1 本のシナリオで使い切る 構成です。~/bin/check-logins というファイルを作る → 実行できるようにする(chmod +x)→ コマンド名で呼べるようにする(PATH)→ 中身を $(...) を使って整形 → 結果を > でファイルに保存、の順に進みます。詰まりやすいのは Permission denied / command not found / cannot open auth.log の 3 つで、Chapter 5 / 6 / 7 のどこかで習った対処法で全部解決します。
💡 具体的な手順
# 接続
ssh student@learner01

# STEP 03 作る
mkdir ~/bin
touch ~/bin/check-logins

# STEP 04 v1 を書く (vim)
vim ~/bin/check-logins
# 中身:
# #!/bin/bash
# echo "Failed logins: $(grep \"Failed password\" /var/log/auth.log | wc -l)"

# STEP 05 実行権限
chmod +x ~/bin/check-logins
~/bin/check-logins

# STEP 06 PATH 通す
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
check-logins

# STEP 07 v2 に改修
cd ~/bin
cp check-logins check-logins.bak
vim check-logins
# v2 中身:
# #!/bin/bash
# echo "Failed logins on $(date): $(grep \"Failed password\" /var/log/auth.log | wc -l)"
# echo "Successful logins: $(grep \"Accepted \" /var/log/auth.log | wc -l)"

# STEP 08 動作確認 → 不要になったバックアップを rm で削除
check-logins
rm check-logins.bak

# STEP 10-11 リダイレクトで保存 → ゴール
check-logins > ~/report.txt
cat ~/report.txt

詰まりやすい 3 大エラー(Permission denied / command not found / cannot open auth.log)の対処は 右ペインの「3 大エラー早見表」 を参照。

✅ 答えを見る

完成版 ~/bin/check-logins(v2):

#!/bin/bash
echo "Failed logins on $(date): $(grep "Failed password" /var/log/auth.log | wc -l)"
echo "Successful logins: $(grep "Accepted " /var/log/auth.log | wc -l)"

完成版 ~/.bashrc 末尾の追記行:

export PATH="$HOME/bin:$PATH"

実行例:

$ check-logins > ~/report.txt
$ cat ~/report.txt
Failed logins on 2026年  5月 17日 日曜日 11:13:47 JST: 4
Successful logins: 7

この演習で踏んだ Part 1 の全要素:

使ったコマンド・概念
Ch1ssh student@learner01
Ch2cd ~ / ls -la / 隠しファイル
Ch3mkdir / touch / cp / rm
Ch4grep / wc -l / パイプ |
Ch5vimi / :wq / dd / gg / dG
Ch6$PATH / ~/.bashrc / export / source
Ch7chmod +x / adm グループによる /var/log/auth.log アクセス
Ch8> リダイレクト / $() コマンド置換 / 現場の作法

AI に相談

AI わからないところを自由に質問できます
この章の内容を踏まえて、Linux の基礎にやさしく答えます

修了確認

Part 1 の修了演習を締めくくる確認です。2 問だけ振り返ってみましょう。

問 1 · 3 大エラーの原因と対処
check-logins を作って実行する過程で、人によっては次の 3 つのエラーに順番に出会います。それぞれの 原因対処コマンド を答えてください(3 つ目は adm が付与されていない自前環境の人だけが見るエラーです):

bash: /home/student/bin/check-logins: 許可がありません
bash: check-logins: コマンドが見つかりません
grep: /var/log/auth.log: 許可がありません
問 2 · リダイレクトとパイプの違い
次の 2 つは似ているようで違うものです。それぞれが 何をしているか を 1 行ずつ説明してください。また >>> に変えると何が変わりますか?

(a) check-logins | wc -l
(b) check-logins > ~/report.txt

次の章へ

次は Part 2「ネットワーク基礎」 に進みます。Part 1 で「サーバの中で動くこと」を覚えたあなたが、次は 「サーバ同士をつなぐ」「ルーティングを理解する」 という視点を獲得していきます。

~/bin/check-logins~/report.txt残しておいてください。Part 3 のはじめに、これを cron に登録して 毎日自動レポート に進化させます。
Part 1 修了 🎓 ── あなたは Linux 基礎の 8 章を走り抜けました。SSH で入る、ファイルを動かす、grep で探す、vim で書く、PATH で道を通す、chmod で権限を整える、> で残す。これは「サーバ管理」の最小単位 です。