#coding=utf-8
import re
import struct
from sys import argv class CIDRHelper(object):
def ipFormatChk(self, ip_str):
pattern = r"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
if re.match(pattern, ip_str):
return True
else:
return False def masklenChk(self, masklen):
if masklen > 0 and masklen < 32:
return True
else:
return False def Parse(self, ip, masklen):
if False == self.ipFormatChk(ip) or False == self.masklenChk(masklen):
exit("子网格式不对或者掩码>32") ips = ip.split(".")
binip = 0
for id in ips:
binip = binip << 8
binip += int(id) mask = (1 << 32) - 1 - ((1 << (32 - masklen)) - 1) a, b, c, d = struct.unpack('BBBB', struct.pack('>I', (binip & mask)))
A = ".".join([str(a), str(b), str(c), str(d+1)])
a, b, c, d = struct.unpack('BBBB', struct.pack('>I', (binip & mask) + (2 << (32 - masklen - 1)) - 1))
B = ".".join([str(a), str(b), str(c), str(d)])
return A + "XXXXX" + B class ipTransfer(object):
def __init__(self):
self.CIDR = CIDRHelper() def exchange_mask(self,mask):
# 计算二进制字符串中 '1' 的个数
count_bit = lambda bin_str: len([i for i in bin_str if i == '1'])
# 分割字符串格式的子网掩码为四段列表
mask_splited = mask.split('.')
# 转换各段子网掩码为二进制, 计算十进制
mask_count = [count_bit(bin(int(i))) for i in mask_splited]
return sum(mask_count) def group(self,line,mode=0):
r = re.split("\s{2,}",line)
domain = r[0].strip()
ip = r[1].strip()
if mode == 0:
return domain
elif mode == 1:
return ip if len(ip)<16 else 0 def makeCList(self,tempIp,start=1,end=255):
return [tempIp+str(temp) for temp in xrange(start,end)] def getIp(self,filename):
ipList = []
with open(filename,"r") as fp:
for l in fp.readlines():
line = self.group(l,mode=1)
if line != 0:
if line.startswith("127") or line.startswith("192.168") or line.startswith("10.") or line.startswith("172") or line.startswith("255.") or line.startswith("169.254"):
continue
else:
ip = re.match(r"\d+\.\d+\.\d+\.", line)
ips = self.makeCList(ip.group(0))
ipList+=ips return sorted(list(set(ipList))) def getDomain(self,filename):
domainList = []
with open(filename,"r") as fp:
for d in fp.readlines():
domain = self.group(d,mode=0)
domainList.append(domain) return sorted(list(set(domainList))) def getDomain_Ip(self,filename):
list1 = self.getIp(filename)
list2 = self.getDomain(filename)
ipDomain = list1+list2
return ipDomain def readfile(self,filename):
with open(filename,"r") as fp:
x = fp.readlines()
return x def makeIp(self,filename,mode=0):
iplist = []
preList = self.readfile(filename)
for line in preList:
line = line.strip()
times = len(re.findall(r"\.",line))
if "-" in line:
start = re.split("-", line)[0]
end = re.split("-", line)[1]
if times == 3:
ip = re.match(r"(\d+\.\d+\.\d+\.)(\d+)", start.strip())
start = int(ip.group(2))
end = int(end.strip())
iplist += self.makeCList(ip.group(1),start=start,end=end+1)
elif times > 3:
ipA= re.match(r"(\d+\.\d+\.\d+\.)(\d+)", start.strip())
start = int(ipA.group(2))
ipB = re.match(r"(\d+\.\d+\.\d+\.)(\d+)", end.strip())
end = int(ipB.group(2))
iplist += self.makeCList(ipA.group(1),start=start,end=end+1)
elif "/" in line:
ip = re.split("/",line)[0].strip()
netmask = re.split("/",line)[1].strip()
if netmask.startswith("255."):
exchange = self.exchange_mask(netmask)
ipres = self.CIDR.Parse(ip,int(exchange))
else:
ipres = self.CIDR.Parse(ip,int(netmask))
print "子网掩码转换结果 -> "+ipres
ipA = re.match(r"(\d+\.\d+\.\d+\.)(\d+)", ipres.split("XXXXX")[0].strip())
ipB = re.match(r"(\d+\.\d+\.\d+\.)(\d+)", ipres.split("XXXXX")[1].strip())
start = int(ipA.group(2))
end = int(ipB.group(2))
iplist += self.makeCList(ipA.group(1), start=start, end=end)
else:
if mode == 0:
iplist.append(line)
elif mode == 1:
ip = re.match(r"\d+\.\d+\.\d+\.", line)
ips = self.makeCList(ip.group(0))
iplist += ips return sorted(list(set(iplist))) def output(self,dstFile,list):
with open(dstFile,"w") as fp:
for k,v in enumerate(list):
if k+1 < len(list):
fp.write(v)
fp.write("\n")
else:
fp.write(v) if __name__ == "__main__":
LZ = ipTransfer()
# print LZ.getDomain("test.txt")
# print LZ.getIp("test.txt")
# print LZ.getDomain_Ip("test.txt")
# print LZ.makeIp("ip.txt")
if len(argv)<4:
exit( "Usage : Welcome to Lzscanner\n" \
"------------------------------------------------\n" \
"-d filename -o dstfilename --full #获取子域名和ip保存到文件\n" \
"-d filename -o dstfilename --domain #仅获取子域名保存到文件\n" \
"-d filename -o dstfilename --onlyip #仅获取ip保存到文件\n" \
"-ip filename -o dstfilename #处理子网掩码 eg.*/28, */255.255.255.240, 55.55.55.55-55.55.55.100,23.1.2.100-254\n"
"-ip filename -o dstfilename --fullip #处理ip时候单个ip也转换为c段\n" \
"------------------------------------------------")
elif len(argv)>4:
if argv[1] == "-d" and argv[3] == "-o":
print "start 处理子域名扫描结果"
filename = argv[2]
dstFilename = argv[4]
if "--full" in argv:
LZ.output(dstFilename,LZ.getDomain_Ip(filename))
elif "--domain" in argv:
LZ.output(dstFilename, LZ.getDomain(filename))
elif "--onlyip" in argv:
LZ.output(dstFilename, LZ.getIp(filename))
print "success 处理完成"
elif argv[1] == "-ip" and argv[3] == "-o":
print "start 处理ip段"
filename = argv[2]
dstFilename = argv[4]
if len(argv) == 5:
LZ.output(dstFilename,LZ.makeIp(filename))
elif len(argv) == 6:
LZ.output(dstFilename,LZ.makeIp(filename,mode=1)) print "success 处理完成"
else:
print "ipTransfer用法错误"

  

批量ip段/子网转换的更多相关文章

  1. 一键批量ping任意ip段的存活主机

    =======================by me===================================== @echo offecho.color FC for /f %%i ...

  2. 批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量,大于指定次数的IP

    批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量 大概的思路是利用sh,从日志中提取出来对应的IP地址,然后再交由python进行对比,判断,最终将需要添加至iptables列表中的IP写入到 ...

  3. [原创]开源跨平台大型网络端口扫描器K8PortScan(支持批量A段/B段/C段/IP列表)

    0x000 K8PortScan Python版Cscan端口扫描器 Code: https://github.com/k8gege/K8PortScan K8portScan 1.0 Date: 2 ...

  4. 八 ip和子网详解

    IP和子网掩码我们都知道,IP是由四段数字组成,在此,我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255  B类IP段 128.0.0.0 到191.255. ...

  5. 【转】 ip段/数字,如192.168.0.1/24是什么意思?

    http://blog.csdn.net/aerchi/article/details/39396423 ip段/数字,如192.168.0.1/24是什么意思? ip段/数字,如192.168.0. ...

  6. [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?

    IP地址.子网掩码.网络号.主机号.网络地址.主机地址以及ip段/数字-如192.168.0.1/24是什么意思? 2016年03月26日 23:38:50 JeanCheng 阅读数:105674  ...

  7. 获取China大陆IP段的范围

    这里有几个网站提供了大陆的IP段范围.别问我要这个列表干什么,我也不知道. http://www.ip2location.com/blockvisitorsbycountry.aspx老牌网站,国内很 ...

  8. 【转】IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段

    背景知识 IP地址 IP地址被用来当做Internet上的电脑的身份编号.大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信.我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就 ...

  9. PHP实现IP–数字互相转换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. CCS box-flex属性

    box-flex==按比例分配父标签的宽度or高度空间 1.非固定分配 eg.一块地总150平方分配给三孩子,按照2:1:1分 #老大 { 房子-分配: 2; } = 75平 #老二 { 房子-分配: ...

  2. Ubuntu开启SSH端口并且搭建Vulhub环境

    1.下载好ubuntu.开启SSH: * sudo apt update * sudo apt install openssh-server * sudo systemctl status ssh 用 ...

  3. Android 已发行多年,移动 App 已经趋近饱和,那么 Android 开发还会有那么吃香吗?

    一.关于Android的前景 不断地也听见很多人在谈做Android是否还有前途.Android研发在走下坡路了.Android的工作太难找了.Android是不是已经凉了...... 对于这些其实我 ...

  4. Vue-Promise

    promise 就是一种异步编程的的解决方案 当执行网络请求的时候,代码就会出现阻塞,下面的代码要等待请求完成了在运行,所以我们一般网络请求的时候就去开启一个异步任务,一边请求一边执行其他代码 请求到 ...

  5. 守护线程_daemon

    守护线程_daemon 线程分为用户线程和守护线程 虚拟机必须确保用户线程(main)执行完毕 虚拟机不用等待守护线程(gc)执行完毕 如:后台记录操作日志,监控内存,垃圾回收等等 测试案例: pac ...

  6. 一文让你彻底掌握ArcGisJS地图管理的秘密

    使用ArcGis开发地图 引用ArcGisJS 使用ArcGisJS开发地图,首先需要引入ArcGis的Js文件和CSS文件,引入方式有两种,一种是官网JS引用,一种是本地JS引用.如下: 官网JS引 ...

  7. netty系列之:自定义编码解码器

    目录 简介 自定义编码器 自定义解码器 添加编码解码器到pipeline 计算2的N次方 总结 简介 在之前的netty系列文章中,我们讲到了如何将对象或者String转换成为ByteBuf,通过使用 ...

  8. Java 在PPT中插入OLE对象

    PPT幻灯片中支持将文档作为OLE对象插入到PPT幻灯片指定位置,在幻灯片中可直接点击该对象,打开或编辑等.下面以插入Excel工作簿文档为例,介绍如何来插入到幻灯片.   程序运行环境 编译环境:I ...

  9. Mysql报错注入之floor报错详解

    一.简述 利用 select count(*),(floor(rand(0)*2))x from table group by x,导致数据库报错,通过 concat 函数,连接注入语句与 floor ...

  10. join控制线程的执行循序 T1 -> T2 -> T3

    /** * 控制线程的执行循序 T1 -> T2 -> T3 * join实现 */ public static void join(){ Thread t1 = new Thread(( ...