#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. Netty入门(三):EventLoop

    前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel IO相关: 1.Java基础(一):I/O多路复用模型及Linux中的应用 上文提到,早 ...

  2. promise详解 : 实现promise(附实现代码)

    promise then 的特点 : then 函数的返回值是一个 promise, 可以继续调用 then 函数 回调函数 resolve 和 reject 的参数 value /reason, 可 ...

  3. 如何区别php,jsp,asp,aspx随笔

    PHP是一种跨平台的服务器端的嵌入式脚本语言.它大量地借用C.Java 和 Perl 语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面.它支持目前绝大多数数据库.还有一点, ...

  4. Appium自动化测试(1)-安装&环境

    需要链接appium自动化测试教程 http://www.cnblogs.com/fnng/p/4540731.htmlappium中文文档:https://github.com/appium/app ...

  5. 程序员被老板要求两个月做个APP,要不比京东差,网友:做一个快捷方式,直接链到京东

    隔行如隔山,这句话说得一点都没错.做一个程序员,很多人都会羡慕,也有很多人会望而却步. 作为一个外行人,你别看程序员每天坐在电脑前敲敲键盘打打代码,以为很简单,其实啊也只有程序员自己明白,任何一个看似 ...

  6. MySQL学习02(操作数据库)

    操作数据库 结构化查询语句分类 名称 解释 命令 DDL(数据库定义语言) 定义和管理数据对象,例如数据库和数据表 create.drop.alter DML(数据操作语言) 用于操作数据库对象中所包 ...

  7. DVWA(六):XSS-Reflected 反射型XSS全等级详解

    XSS 概念: 由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. XSS类型: Reflected(反射型):只是简单的 ...

  8. 软件开发目录规范 ATM框架构建

    软件开发的目录规范 建立文件夹 为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要.软件的目录规范并无硬性标准,只要清晰可读即可 以ATM购物车项目为例: 首 ...

  9. SQL 练习33

    查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名 SELECT Student.SId,Student.Sname,Cname,score from Student,Course,S ...

  10. SpringBoot集成websocket(Spring方式)

    SpringWebSocketConfig配置 package com.meeno.chemical.socket.task.config; import com.meeno.chemical.soc ...