0
点赞
收藏
分享

微信扫一扫

华为、思科、华三 路由器ip地址统计小工具编码

佳简诚锄 2021-09-21 阅读 66

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

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

import re

import os

#匹配端口的正则表达式,对于正则表达式样式使⽤ Python 的原始字符串表示法;在带有 'r' 前缀的字符串字⾯值中,反斜杠不必做任何特殊处理

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

# r'interface(.*?)(!{1,2}|#{1,2})',作用是查找匹配的块,这里华为用#作为分隔符,思科用!作为分隔符替换即可r'interface(.*?)!{1,2}',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地址

def findit():

    items = os.listdir(".")

    newlist = []

    for names in items:

        if names.endswith(".txt"):

            newlist.append(names)


    for file in newlist:

        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:

                str_ip=str(ip)

                #v4add = ipv4pat.search(str_ip)

                ipv4_mask=ipv4_mapat.search(str_ip)

                v6add = ipv6pat.search(str_ip)

                #华为使用 vpn 思科使用vrf  标识为vpn 地址

                if(('vpn-instance' in str_ip) or('ip vrf' in str_ip)) > 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

if __name__ == "__main__":

    findit()

举报

相关推荐

0 条评论