簡體   English   中英

使用Python腳本導出IP地址

[英]Exporting IP Addresses using Python Script

我正在嘗試創建一個腳本,該腳本將從出現的30次(相同地址)中提取IP地址(從文本文檔中提取)。 找到后,我嘗試將這些IP地址導出到單獨的文本文檔中。

這是我到目前為止所得到的:

import re

appears = 0

myLog = open('auth.log', 'r')

for line in myLog:
    if re.match(("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"), line):
        attempts +=1

print 'The number of times this IP Address appears is', appears

當我運行腳本時,在日志文件中找不到任何IP地址,其中有數百個,但是什么也沒有找到。 正則表達式或不同事物的組合是否有問題?

我有沒有機會創建正則表達式來搜索以下內容:

> Failed password for bin from 211.167.103.172

很抱歉,如果這有點模糊,它是Python的新手,仍然習慣了。

這里有兩個問題。 第一個是正則表達式開頭的插入號( ^ )。 這意味着“從字符串的開頭開始搜索此模式”。 如果您的日志文件看起來像Failed password for xxx.xxx.xxx.xxx ,則開頭的文本將使正則表達式無效。 另一個問題是.match函數。 這將在字符串的開頭開始搜索,就好像您在前面插入了插入符號一樣。 將其替換為.search ,您應該會很好:

if re.search(("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"), line):


另一件事: appears變量是在for循環之外設置的,因此,每次迭代一行時,都會重置該變量。 我將為每個IP聲明一個計數字典,並在循環遍歷時增加值:

 import re ip_counts = {} myLog = open('auth.log', 'r') for line in myLog: match = re.search(("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$"), line) if match: ip = match.group() if ip not in ip_counts: ip_counts[ip] = 1 else: ip_counts[ip] += 1 for ip in ip_counts: count = ip_counts[ip] if count > 30: print('IP {} had {} attempts.'.format(ip, count)) 

朱拉走上正軌。 您也可以將正則表達式升級到以下內容:

(Failed).*?(password).*?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

它僅包括您要查找的行,而不包括所有帶有ip地址的行。

但是我離正規表達式專家還很遠,這可能並不完美。

你可以去這里玩正則表達式。

這是一個簡化的表達式版本:

import re
from collections import Counter

e = re.compile(r'((\d{1,3}\.){3}\d{1,3})')

with open('log.txt') as f:
    ips = Counter([e.search(line).group() for line in f if e.search(line)])

thirty_plus = [ip for ip,count in ips.most_common() if count > 30]

with open('results.txt', 'w') as f:
   f.write('\n'.join(thirty_plus))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM