繁体   English   中英

规范化IP地址

[英]Normalizing IP addresses

在我开始写自己的东西之前,任何人都知道可以规范化一组IP地址的库。 我管理的应用程序访问基于我们客户提供的一系列IP地址。 通常情况下这很小,但有时这个列表是1,000多个可怕的IP地址。

例如

#INPUT                  #TO             #OUTPUT
192.168.0-10.*          ->        192.168.0.0-192.168.10.255
192.168.15.0-64         ->        192.168.15.0-192.168.15.64
192.10-15.*.*           ->        192.10.0.0-192.15.255.255
192.168.1.1             ->        192.168.1.1-192.168.1.1
#YES, last case needed too, 
#the scripit I have to convert to a CIDR range needs  start and stop

这最好是在python中完成,但java或某种shell脚本也可以。 在病房之后,我已经编写了一个脚本,我已经编写了转换到CIDR范围并将它们存储在我们的权限表中。 我真的只是尝试每年手动做几次。 我认为现在是时候自动化这一点,只是不想在这里重新发明轮子。 看来这可能是一个常见的问题

javascript中的regexp解决方案(它是windows的控制台语言;-)

function(addr) {
    addr.replace(/(\d+)-(\d+)/, "\$1").replace(/\*/, "0") + '-' +
    addr.replace(/(\d+)-(\d+)/, "\$2").replace(/\*/, "255")
}

python中的功能解决方案(python是我的外语)

pairs = [s == '*' ? (0, 255) : s.split('-')[0,-1] for s in addr.split('.')];
[s[0] for s in pairs].join('.')+'-'+[s[1] for s in pairs].join('.')

你真的考虑,2行代码谷歌搜索,然后询问SO?

我想你应该看看Python IP工具:

http://code.google.com/p/python-iptools/

似乎拥有你需要的大部分东西,你可以随时扩展它,如果它有什么不做....

这两个答案都很有帮助,但都没有回答我的问题。 如果有一个图书馆已经存在这样做了。 我还没找到一个。 包含一个专注于IP的其他库的方法可能是一种有价值的方法。 在询问这个问题之前,我发现了Adam的Iptools。

我的输出确实发生了一些变化。 我最终返回了一个CIDR地址,而不是一个范围。 一些事情可以简化,并清理干净。 一些错误检查也会有所帮助。 但这就是我用过的,生锈的蟒蛇和一切。

def normalize(ip):
    if '/' in ip: 
        return [ip]

    ocets = [ocet.replace(' ','') for ocet in ip.split('.')]
    if len(ocets) == 4: ocets += ocets
    if len(ocets) == 7: 
        if (re.search('-',ocets[3])):
            for i,v in enumerate(ocets[3:]):
                if i == 0:
                    last = ocets[4]
                    ocets[3],ocets[4] = ocets[3].split('-')
                else:
                    if 4+i < len(ocets):
                        newVal = last
                        last = ocets[4+i]
                        ocets[4+i] = newVal
                    else: 
                        ocets.append(last)

    if len(ocets) != 8: 
        return 'ERROR WITH: %s not right size %d' % ('.'.join(ocets),len(ocets))
    for i,ocet in enumerate(ocets):
        if (re.search('\*',ocet)): 
            ocets[i] = '0'
            ocets[i+4] = '255'        


        if (re.search('-',ocets[i])): 
            ocets[i],ocets[i+4] = ocets[i].split('-')[0:2]
    newIP = netaddr.iprange_to_cidrs('.'.join(ocets[0:4]) ,'.'.join(ocets[4:]))
    return newIP

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM