判断ip列表是否在某系列子网段


判断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

http://www.cnblogs.com/superxuezhazha/p/6242173.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值