批量ip段/子网转换
#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段/子网转换的更多相关文章
- 一键批量ping任意ip段的存活主机
=======================by me===================================== @echo offecho.color FC for /f %%i ...
- 批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量,大于指定次数的IP
批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量 大概的思路是利用sh,从日志中提取出来对应的IP地址,然后再交由python进行对比,判断,最终将需要添加至iptables列表中的IP写入到 ...
- [原创]开源跨平台大型网络端口扫描器K8PortScan(支持批量A段/B段/C段/IP列表)
0x000 K8PortScan Python版Cscan端口扫描器 Code: https://github.com/k8gege/K8PortScan K8portScan 1.0 Date: 2 ...
- 八 ip和子网详解
IP和子网掩码我们都知道,IP是由四段数字组成,在此,我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255 B类IP段 128.0.0.0 到191.255. ...
- 【转】 ip段/数字,如192.168.0.1/24是什么意思?
http://blog.csdn.net/aerchi/article/details/39396423 ip段/数字,如192.168.0.1/24是什么意思? ip段/数字,如192.168.0. ...
- [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?
IP地址.子网掩码.网络号.主机号.网络地址.主机地址以及ip段/数字-如192.168.0.1/24是什么意思? 2016年03月26日 23:38:50 JeanCheng 阅读数:105674 ...
- 获取China大陆IP段的范围
这里有几个网站提供了大陆的IP段范围.别问我要这个列表干什么,我也不知道. http://www.ip2location.com/blockvisitorsbycountry.aspx老牌网站,国内很 ...
- 【转】IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段
背景知识 IP地址 IP地址被用来当做Internet上的电脑的身份编号.大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信.我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就 ...
- PHP实现IP–数字互相转换
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- Netty入门(三):EventLoop
前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel IO相关: 1.Java基础(一):I/O多路复用模型及Linux中的应用 上文提到,早 ...
- promise详解 : 实现promise(附实现代码)
promise then 的特点 : then 函数的返回值是一个 promise, 可以继续调用 then 函数 回调函数 resolve 和 reject 的参数 value /reason, 可 ...
- 如何区别php,jsp,asp,aspx随笔
PHP是一种跨平台的服务器端的嵌入式脚本语言.它大量地借用C.Java 和 Perl 语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面.它支持目前绝大多数数据库.还有一点, ...
- Appium自动化测试(1)-安装&环境
需要链接appium自动化测试教程 http://www.cnblogs.com/fnng/p/4540731.htmlappium中文文档:https://github.com/appium/app ...
- 程序员被老板要求两个月做个APP,要不比京东差,网友:做一个快捷方式,直接链到京东
隔行如隔山,这句话说得一点都没错.做一个程序员,很多人都会羡慕,也有很多人会望而却步. 作为一个外行人,你别看程序员每天坐在电脑前敲敲键盘打打代码,以为很简单,其实啊也只有程序员自己明白,任何一个看似 ...
- MySQL学习02(操作数据库)
操作数据库 结构化查询语句分类 名称 解释 命令 DDL(数据库定义语言) 定义和管理数据对象,例如数据库和数据表 create.drop.alter DML(数据操作语言) 用于操作数据库对象中所包 ...
- DVWA(六):XSS-Reflected 反射型XSS全等级详解
XSS 概念: 由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. XSS类型: Reflected(反射型):只是简单的 ...
- 软件开发目录规范 ATM框架构建
软件开发的目录规范 建立文件夹 为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要.软件的目录规范并无硬性标准,只要清晰可读即可 以ATM购物车项目为例: 首 ...
- SQL 练习33
查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名 SELECT Student.SId,Student.Sname,Cname,score from Student,Course,S ...
- SpringBoot集成websocket(Spring方式)
SpringWebSocketConfig配置 package com.meeno.chemical.socket.task.config; import com.meeno.chemical.soc ...