2019-06-12

2020-06-18  本文已影响0人  李大龙1997

适用与华为路由器配置中查找IP地址(v4 v6),能挑区分vpn地址,是ip地址备案及统计的小工具。减少ip地址手工汇总时间(以往2天手工量,现在1小时搞定),针对其他厂家设备,稍微修改即可完成汇总。针对非同行、格式化、块操作、另辟蹊径(用正则表达式),减少代码量,网上有很多正则表达式的在线网站,可以尝试匹配方案。(稍微修改可以满足思科路由器)

# -*- encoding: utf-8 -*-

import re

import os

#匹配端口的正则表达式(可以跨行匹配)

intpat = re.compile(r'interface(.*?)#{1,2}', flags=re.DOTALL)

#匹配Ipv4的正则表达式

#ipv4pat = re.compile('''((ip(\s)address(\s))(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5]\.))''',re.I)

#匹配Ipv4加掩码

ipv4_mapat = re.compile('''((ip(\s)address(\s))(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)(\s)(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d))''',re.I)

#匹配Ipv6的正则表达式

ipv6pat = re.compile('''((ipv6(\s)address(\s))(([a-f0-9]{1,4}:|){0,7}[::]{0,1}[a-f0-9]{0,4})/\d{1,3})''',re.I)

#掩码变换,有格式,不能合并行

exchange_mask = lambda mask: sum(bin(int(i)).count('1') 

for i in mask.split('.'))

def maskchange(str):

ipaddr_mask_l = str

list_ipaddr = ipaddr_mask_l .split()

ipaddr_mask_s = exchange_mask( list_ipaddr[-1])

tmp = '%d' %ipaddr_mask_s

out_addr = ' '.join(list_ipaddr[:-1])+'/'+tmp

return(out_addr)

#命令行定位到要挑出ip的文件夹,逐个文件挑出ip地址

filelist=os.listdir('.')

for file in filelist:

filename_ext=file+'11.log'

#文件名最好不要用空格和中文

with open(file,'r',encoding='utf-8') as fp,open(filename_ext,'w',encoding='utf-8') as fp1:

xx = fp.readlines()

#list转化为str,用于findall

str_con= ' '.join(xx)

zz = intpat.findall(str_con)

for ip in zz:

#v4add = ipv4pat.search(ip)

ipv4_mask=ipv4_mapat.search(ip)

v6add = ipv6pat.search(ip)

if(ip.find('vpn')) > 0:

if ipv4_mask is not None:

ipaddr_mask = ipv4_mask.group()

out_str = maskchange(ipaddr_mask)

w1='vpn '+out_str+'\n'

print('vpn ', out_str)

fp1.write(w1)

continue # 输出为vpn后不再输入为普通地址

if ipv4_mask is not None:

ipaddr_mask = ipv4_mask.group()

out_str = maskchange(ipaddr_mask)

w2= out_str+'\n'

print( out_str)

fp1.write(w2)

if v6add is not None:

v6addr=v6add.group()

w3 =v6addr+'\n'

print(v6addr)

fp1.write(w3)

#存在问题目前针对配置了辅助ip地址的,只能取到第一个主用ip

上一篇 下一篇

猜你喜欢

热点阅读