※今回登場するコマンドでわからないものがあれば, 是非ChatGPTに聞いて見てください!!
1. "Saint John": what is writing to this log file?
問題
/var/log/bad/logにログを出力し続けているプロセスがあり, このプロセスを停止させよという問題.
解説
tail -f /var/log/bad.log
とすると, 確かに出力され続けるのが確認できる.
lsof /var/log/bad.log
をして, /var/log/bad.logを開いているプロセスを見つけて, PIDを取得する.
kill [PID]
でプロセスを終了させたらOK.
2. "Saskatoon": counting IPs.
問題
/home/admin/access.log内にhttpリクエストのログが取得されていて, 最も多くのリクエストを送信したIPアドレスを探せという問題.
解説
cat /home/admin/access.log
をすると, XXX.YYY.ZZZ.WWW - - 〜という行がログとして保存されていることがわかる.
cut -d ' ' -f 1 /home/admin/access.log
cutで区切り文字に空白, として-fに対して1をすることで, 各行のIPアドレスの部分だけが抽出できる.
cut -d ' ' -f 1 /home/admin/access.log | sort | uniq -c | sort
重複しているものを数えるときはuniq -cコマンドを使うが, ソートされていない出力に対して実行すると正しく値が検出できないため, 先にソートしてuniqを適用.
最後にuniqの出力結果をソートして, ケツのIPアドレスを見にいくと正解がわかる.
3. "Santiago": Find the secret combination
問題
/home/admin内の*.txtのファイルから, Aliceという単語が出現した行を探し出し,
- 全ファイルのAliceが出現した行数の合計
- 一回だけAliceが現れたファイルがあり, そのファイルのAliceの直後にある数字
1, 2の二つの数字を出力せよという問題.
回答
find /home/admin -maxdepth 1 -type f | grep .txt | xargs cat | grep Alice | wc -l
findで/home/admin内のファイルをまず見つける. -maxdepth 1 とすることで, /home/adminよりも深いディレクトリは探索しないようにする.
これにxargsでcatを行うと, 一気に全部のファイルの中身を表示させられる.
catの出力結果をgrepして, wcでAliceが出てくる行数を表示させたら1の答えがわかる.
cat [ファイル名] | grep Alice | wc -l
さっきと同じようなAliceが出てくる行数を調べる(今回はファイル一つずつ).
catでファイルの中身を表示して, grepでAliceが含まれる行を抽出して, wcで行数を表示する. *.txtを一つずつ調べると, Aliceが出てくるのが1行しかないファイルを見つけられる.
cat [1回しかないファイル] | grep Alice -A 1
見つかったファイルに対して, grep -A [数字]を使って, 条件に一致した行の後ろの, 特定の行数分も取得できて, この結果から2の答えがわかる.