※今回登場するコマンドでわからないものがあれば, 是非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の答えがわかる.