在我开始写自己之前,有人知道可以规范化一组IP地址的库。我管理的应用程序访问基于我们客户提供的一系列IP地址。大多数情况下这个很小,但有时这个列表是1000多个可怕的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范围并将它们存储在我们的权限表中。我真的只是尝试每年手动做几次。我认为现在是时候自动化这一点了,只是不想在这里重新发明轮子。这似乎是一个常见的问题
答案 0 :(得分:2)
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?
答案 1 :(得分:1)
答案 2 :(得分:1)
这两个答案都很有帮助,但都没有回答我的问题。如果有一个图书馆已经存在这样做了。我还没找到一个。包含一个专注于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