最近はLinux系の記事といえば「Shell」に関連したものになっていますが、やつぱね、shellはね、余分な手続きもいらないしね、行数少なくて色々できるので即効性あるし、Linuxの管理をする上で避けては通れないものだけど、Shellいいと思います。と、余計な話はここまでにして、
僕は、「不正アクセスやサーバの稼働状況を知るため」に、アナライザを使用して定時刻にApacheのアクセス解析をしているのですが、
解析結果はIPアドレスを名前変換して「ホスト名」として出しています。
ホスト名変換しないようにも出来るんだけど、IPアドレスじゃ味気ないし、感覚的にわからないし、、
で、アナライザの結果を見て気になる動きをしている「ホスト名」のアクセスを調べたい時がたまにあったりします。そんな時のために1つシェルを公開してみようかと思います。
【どんなことをするシェルなのか】
ホスト名を指定してシェルを実行→Apacheアクセスログからどのページにアクセスをしたかを表示する。
【処理概要】
- digでドメイン情報を取得する
- 上の結果からIPアドレスを取得する
- Apacheのアクセスログを上のIPアドレスでgrepする
- 余分な表示をしないようにする
シェル本体(host-ip_ApacheGrepLog.sh)
【シェルの説明】
- ①dig $1 +noall +answer
dig=ドメイン情報を取得
+noall +answer=ANSWER SECTIONを表示する
- ②awk ‘{print($5)}’
①の結果からタブ区切りで5番目(IPアドレス)の部分を取得する
- ③xargs -I{} grep {} /var/log/apache2/access_all.log
②で取得した複数の結果をgrepに渡して結果を出す
/var/log/apache2/access_all.logはApacheログを累積させたもの
- ④awk ‘BEGIN{FS=”\””}{print $2}’
③の結果の/区切りの2番目を表示させる
- ⑤sort
これまでの出力結果を並べ替える(重複を除くため)
- ⑥uniq
⑤の出力結果から重複を除く
- ⑦egrep -v “表示しなくて良い文字列1|表示しなくて良い文字列2”
これまでの結果から表示しなくていい行を除く
【実行方法】
./host-ip_ApacheGrepLog.sh abcd.gate.com
(いちいち打つの面倒くさいんで、aliasを設定しておく)
【実行結果】
GET /debian/1703/ HTTP/1.1
GET /debian/2400/ HTTP/1.1
GET /debian/47/ HTTP/1.1
GET /debian/47/flashfreemind.css HTTP/1.1
GET /debian/609/ HTTP/1.1
GET /debian/627/ HTTP/1.1
GET /debian/914/ HTTP/1.1
:
: