判断ip列表是否在某系列子网段
ip列表:1.txt
192.168.2.2
192.168.2.3
192.168.2.4
ip子网列表:
192.168.2.1
192.168.2.1/24
192.168.2.1/255.255.255.0
192.168.2.1-192.168.255.255
# _*_ coding: utf-8 _*_ import socket,struct ''' 转换为子网地址,并检验和输出正确的子网地址
192.168.2.1 -> 192.168.2.1/255.255.255.255 192.168.2.1/24 -> 192.168.2.0/255.255.255.0 192.168.2.1/255.255.255.0 -> 192.168.2.0/255.255.255.0
'''def format_subnet(subnet_input): # 如果输入的ip,将掩码加上后输出 if subnet_input.find("/") == -1: return subnet_input + "/255.255.255.255" else: # 如果输入的是短掩码,则转换为长掩码 subnet = subnet_input.split("/") if len(subnet[1]) < 3: mask_num = int(subnet[1]) last_mask_num = mask_num % 8 last_mask_str = "" for i in range(last_mask_num): last_mask_str += "1" if len(last_mask_str) < 8: for i in range(8-len(last_mask_str)): last_mask_str += "0" last_mask_str = str(int(last_mask_str,2)) if mask_num / 8 == 0: subnet = subnet[0] + "/" + last_mask_str +"0.0.0" elif mask_num / 8 == 1: subnet = subnet[0] + "/255." + last_mask_str +".0.0" elif mask_num / 8 == 2 : subnet = subnet[0] + "/255.255." + last_mask_str +".0" elif mask_num / 8 == 3: subnet = subnet[0] + "/255.255.255." + last_mask_str elif mask_num / 8 == 4: subnet = subnet[0] + "/255.255.255.255" subnet_input = subnet # 计算出正确的子网地址并输出 subnet_array = subnet_input.split("/") subnet_true = socket.inet_ntoa(\ struct.pack("!I",struct.unpack("!I",socket.inet_aton(subnet_array[0]))[0] & \ struct.unpack("!I",socket.inet_aton(subnet_array[1]))[0]))\ + "/" + subnet_array[1] return subnet_true# 判断ip是否属于某个网段def ip_in_subnet(ip,subnet): subnet = format_subnet(str(subnet)) subnet_array = subnet.split("/") ip = format_subnet(ip + "/" + subnet_array[1]) return ip == subnetdef ip2num(ip):#ip to int num lp = [int(x) for x in ip.split('.')] return lp[0] << 24 | lp[1] << 16 | lp[2] << 8 | lp[3]def num2ip(num):# int num to ip ip = ['', '', '', ''] ip[3] = (num & 0xff) ip[2] = (num & 0xff00) >> 8 ip[1] = (num & 0xff0000) >> 16 ip[0] = (num & 0xff000000) >> 24 return '%s.%s.%s.%s' % (ip[0], ip[1], ip[2], ip[3])def iprange(ip1,ip2,ip3): # print ip1,ip2 # return ip1, ip2, 3 num1 = ip2num(ip1) num2 = ip2num(ip2) num3 = ip2num(ip3) tmp1 = num3 - num1 tmp2 = num2 - num3 if tmp1 >= 0 and tmp2 >=0 : return True a=[]b=[]c=0d=0with open("1.txt") as f: lines=f.readlines() for ip in lines: a.append(ip)with open("2.txt") as f: lines=f.readlines() for ip in lines: b.append(ip.split()[0])for i in range(len(a)): for j in range(len(b)): if len(b[j].split("-"))==2: if iprange(b[j].split("-")[0],b[j].split("-")[1],a[i].split()[1]): c=c+1 with open("res.txt","a+") as f: f.write(a[i].split()[0]+" " +a[i].split()[1] + " "+b[j]+"\n") break if ip_in_subnet(a[i].split()[1],b[j]): c=c+1 with open("res.txt","a+") as f: f.write(a[i].split()[0]+" " +a[i].split()[1] + " "+b[j]+"\n") breakprint "count:",c
参考:http://blog.csdn.net/hondsam/article/details/49638265