Tuesday, December 28, 2010

Xác định IP trên Log Server

Giả sử log của Apache thế này:

127.0.0.1 - anonymous [25/Nov/2010:21:58:36 +0700] "GET / HTTP/1.0" 200 11 "-" "check_http/v1.4.15 (nagios-plugins 1.4.15)"

wc path/to/access.log | awk '{print $1}'


output có thể là

18681 ( đây là số dòng trong access.log tương ứng với số request apache đã nhận từ lúc cài đặt tới nay )



sau "một phút" chạy lại lệnh trên

19681 ( đây là số dòng trong access.log sau 1 phút )



trừ 2 thằng ta có được số request nhận được trong 1 phút vừa qua

19681 - 18681 = 1000 ( ví dụ thôi nhá :-) )


chạy lệnh sau

tail 'path/to/access.log' -n 1000 | awk '{print $1}' | sort | uniq -c | sort -n | tail -n 1



lệnh tail sẽ lấy từ access.log 1000 dòng "cuối cùng trong file" (là con số ta trừ ở trên ) , truyền qua cho awk để chỉ lọc ra phần IP trong cái đống đó, gom chúng lại bằng lệnh short rồi uniq -c sẽ đếm số lần xuất hiện của từng IP ( các dòng giống nhau sẽ cộng lại ) , chuyền qua cho sort -n để sắp từ nhỏ đến lớn ( lớn nhất cuối cùng ) và sau cùng là tail -n 1 là sẽ lấy 01 dòng cuối trong cái sort -n ở trên ( tức là cái IP truy cập nhiều nhất trong 1 phút qua )

output:

Code:

268 67.195.113.243



268 là số lần request chạm server được ghi nhận trong access.log , đằng sau là cái IP gửi request

Chia sẻ cùng mọi người cách của mình:

last_time=`tail -1 access_log | awk '{ print substr($4, 2, length($4)-1) }'`; standard_last_time=`echo $last_time | sed 's/\//-/g' | awk -F":" '{ print $1" "$2":"$3":"$4 }'`; pre_min=`date -d "$standard_last_time 1 minutes ago" +%d/%b/%Y:%k:%M:%S`; awk '$4 <= to && $4 >= from { print $1 }' from="[$pre_min" to="[$last_time" access_log | sort | uniq -c | sort -rn | awk '$1 >=200 { print $0 }'

Chôm của quanta 1 chút mình được lệnh sau:

pre_min=`date -d '1 minutes ago' +%d/%b/%Y:%H:%M`; grep -n -m 1 $pre_min access_log | cut -d":" -f1 | xargs -iline_num tail -n +line_num access_log | awk ' $4 <= to && $4 >= from { print $1 }' from="[$pre_min:00" to="[$pre_min:59" | sort | uniq -c | sort -rn

Lệnh này sẽ liệt kê số lần xuất hiện của 1 IP trong access_log chính xác trong khoảng thời gian 1 phút trước.

Có thể linh hoạt thêm 1 chút nếu khai báo thêm 1 biến cur_min. Ví dụ lệnh sau sẽ liệt kê số lấn xuất hiện của 1 IP trong access_log trong 10 phút trước

pre_min=`date -d '11 minutes ago' +%d/%b/%Y:%H:%M`; cur_min=`date -d '1 minutes ago' +%d/%b/%Y:%H:%M`; grep -n -m 1 $pre_min access_log | cut -d":" -f1 | xargs -iline_num tail -n +line_num access_log | awk ' $4 <= to && $4 >= from { print $1 }' from="[$pre_min:00" to="[$cur_min:59" | sort | uniq -c | sort -nr

No comments:

Post a Comment