一、問題描述
對外服務的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 命令則可以讓該程序重新回到...