繁体   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