使用Bash和Python統計高頻請求IP

2021-08-27 20:05:47 字數 2080 閱讀 9085

一、問題描述

對外服務的web系統有時候會遭到黑客的ddos攻擊,或者是被第三方軟體爬取頁面竊取服務,因此需要查詢統計出高頻請求的**ip,以便後續處理。

二、處理思路

為避免打草驚蛇,先對最近一段時間內的http伺服器日誌以及servlet容器的日誌進行靜態分析統計,過濾掉合法請求**後降序展示出統計結果,然後再人工鎖定可疑ip。

由於計算量不大,可以使用bash shell命令以及python對日誌檔案進行統計。如果日後計算量劇增再考慮使用hadoop mapreduce進行並行處理。

三、具體實現

1.使用grep查詢出所有請求ip:

grep -r -e -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" weblog*
-r是遞迴搜尋

-e選項表示使用grep擴充套件的正規表示式

-o選項是只顯示匹配到的字串

輸出結果形如:

log_file_name:ip_addr

2.使用python統計ip請求次數:

import sys

ipmap = {}

ipfilters = ("10.", "172.")

def isfiltered(inip):

for ip in ipfilters:

if inip.startswith(ip):

return true

return false

for line in sys.stdin:

line = line.strip()

if line:

words = line.split(":")

if words and len(words) > 1:

if isfiltered(words[1]):

continue

elif ipmap.get(words[1]):

ipmap[words[1]] += 1

else:

ipmap[words[1]] = 1

for (key, value) in ipmap.items():

print "%-16s %d" % (key,value)

從標準輸入流中按行讀取資料,過濾掉白名單中的資料,然後放到字典中進行計數,最後把統計結果列印到標準輸出流。

3.使用sort進行降序排序:

sort -k 2 -n -r
-k是選取第二列進行排序

-n是使用數字排序,不然會出現9比10大的情況

-r是降序,預設是公升序

4.輸出前n條記錄:

head -n n

5.綜合:

grep -r -e -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" weblog* | python ipcount.py | sort -k 2 -n -r | head -n 20
從100m+的日誌資料夾中得出統計結果所需時間在10秒以內,效果還算可以接受。

6.其實也可以全部用bash命令來實現:

grep -e -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" weblog* | awk '' | sed '/172\..*$/d' | sed '/10\..*$/d' | sort | uniq -c | sort -nr | head -n 20

使用bash關聯陣列統計單詞

從bash 4開始支援關聯陣列,使用前需要宣告,即 declare a map map key1 value1 map key2 value2 map key1 value1 key2 value2 獲取keys keys 獲取values values 利用關聯陣列,很容易實現單詞統計,原始碼檔案...

用 bash 指令碼統計詞頻

上週有朋友問一問題,他有乙個包含若干行ip位址的文字檔案,每個ip佔一行,需要統計每個ip在檔案中出現的次數,並且按照出現次數逆序排列。開始的時候使用了乙個 awk 指令碼來解決這個問題 bin awk f filename count ip.awk begin end 再執行 cat ip fil...

Bash 使用技巧

bash 是我們經常與之打交道的 shell 程式,本文針對其使用技巧進行了蒐羅。相信在你看過這些內容之後,定會在 bash 的世界裡游刃有餘。處理作業 首先,使用 ctrl z 快捷鍵可以讓正在執行的命令掛起。如果要讓該程序在後台執行,那麼可以執行 bg 命令。而 fg 命令則可以讓該程序重新回到...