Apacheのログから特定のIPアドレスを指定して解析する(Debian)

最近はLinux系の記事といえば「Shell」に関連したものになっていますが、やつぱね、shellはね、余分な手続きもいらないしね、行数少なくて色々できるので即効性あるし、Linuxの管理をする上で避けては通れないものだけど、Shellいいと思います。と、余計な話はここまでにして、

僕は、「不正アクセスやサーバの稼働状況を知るため」に、アナライザを使用して定時刻にApacheのアクセス解析をしているのですが、
解析結果はIPアドレスを名前変換して「ホスト名」として出しています。
ホスト名変換しないようにも出来るんだけど、IPアドレスじゃ味気ないし、感覚的にわからないし、、

で、アナライザの結果を見て気になる動きをしている「ホスト名」のアクセスを調べたい時がたまにあったりします。そんな時のために1つシェルを公開してみようかと思います。

 

【どんなことをするシェルなのか】
ホスト名を指定してシェルを実行→Apacheアクセスログからどのページにアクセスをしたかを表示する。

【処理概要】

  1. digでドメイン情報を取得する
  2. 上の結果からIPアドレスを取得する
  3. Apacheのアクセスログを上のIPアドレスでgrepする
  4. 余分な表示をしないようにする

 

シェル本体(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

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です