获取地址段的所有地址(二)

对获取IP具体地址的修改。原地址:https://blog.csdn.net/Amdy_amdy/article/details/87870018

本次修改后,支持获取的地址段类型有:

1.1.1.1/24等B C段

1.1.1.*等B C段

1.1.1.1-255

1.1.1.1-1.1.3.255(原来代码所支持的地址段)

欢迎交流,代码自取。

"""
======================
@Auther:CacheYu
@Time:2019/10/29 下午
======================
"""
#!/usr/bin/python  
#coding:utf-8
import os 
import sys 
# from IPy import IP 

inputfile=open("./1.txt","r")
outputfile=open("./ip.txt",'w') #w表示复盖,a+表示追加

#B、C段的地址以单个的形式表现-输入为/
def ipCS(line):
	ips = str(line).split('/')
	ips1 = str(ips[0]).split('.')
	ips2 = int(ips[1])
	if ips2 in range(24,32):
		s = 32-int(ips[1])
		for x in range(0,2**s-2):#输入的标准是1.1.1.1/24;如果输入的是1.1.1.0/24,则会多出来一个掩码
			iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(int(ips1[3])+x)
			print >> outputfile,"%s" %iplist
	if ips2 in range(16,24):
		s = 24-int(ips[1])
		for x in range(0,2**s):
			iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(int(ips1[2])+x)+'.'+str(ips1[3])+'/24'
			ipCS(iplist)#递归调用,代码复用
	if ips2 in range(8,16):
		s = 16-int(ips[1])
		for x in range(0,2**s):
			iplist = str(ips1[0])+'.'+str(int(ips1[1])+x)+'.'+str(ips1[2])+'.'+str(ips1[3])+'/16'
			ipCS(iplist)

#B、C段的地址以单个的形式表现-输入为*
def ipC_S(line):
	count = line.count('*')
	print(count)
	ips = line.split('.')
	while count == 0:
		break
	while count == 1:
		for i in range(0,255):
			iplist = str(ips[0])+'.'+str(ips[1])+'.'+str(ips[2])+'.'+str(i)
			print >> outputfile,"%s" %iplist
		break
	while count == 2:
		for i in range(0,256):
			iplist = str(ips[0])+'.'+str(ips[1])+'.'+str(i)+'.*'
			ipC_S(iplist)#递归调用,代码复用
		break
	while count == 3:
		for i in range(0,256):
			iplist = str(ips[0])+'.'+str(i)+'.*.*'
			ipC_S(iplist)#递归调用,代码复用
		break

#IP以单个形式表现,输入为-
def ipS(line):
		ips = str(line).split("-")
		ips1 = str(ips[0]).split(".")
		if(len(ips[1])>=4):
			ips2 = str(ips[1]).split(".")

			if(ips1[0]==ips2[0] and ips1[1]==ips2[1] and ips1[2]==ips2[2]):
				for j in range(int(ips1[3]),int(ips2[3])+1):
					iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(j)
					print >> outputfile,"%s" %iplist
			else:
				for j in range(int(ips1[3]),256):
					iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(j)
					print >> outputfile,"%s" %iplist
				for i in range(int(ips1[2])+1,int(ips2[2])):
					for j in range(0,256):
						iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(i)+'.'+str(j)
						print >> outputfile,"%s" %iplist
				for j in range(0,int(ips2[3])):
					iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips2[2])+'.'+str(j)
					print >> outputfile,"%s" %iplist
		else:
			ips2 = int(ips[1])
			for j in range(int(ips1[3]),ips2+1):
				iplist = str(ips1[0])+'.'+str(ips1[1])+'.'+str(ips1[2])+'.'+str(j)
				print >> outputfile,"%s" %iplist

if __name__ == '__main__': 	
	lines=inputfile.readlines() 
	iplist = ""
	for line in lines:	
		if '\xef\xbb\xbf' in line:#引用codecs模块,来判断前三个字节是否为BOM_UTF8。如果是,则剔除\xef\xbb\xbf字节。
			line = line.replace('\xef\xbb\xbf','')
		if '-' in line:
			ipS(line)
		if '/' in line:
			ipCS(line)
		if '*' in line:
			ipC_S(line)

	inputfile.close()
	outputfile.close()

原来的代码被封装在了ipS(line)函数内,进行了部分修改。修改的主要原因是之前写的过程中,忽略了python在读取txt的时候,python的file对象的readline以及readlines程序中,针对一些UTF-8编码的文件,开头会加入BOM来表明编码方式。也就是添加上\xef\xbb\xbf。所以在比较时,需要将这段剔除,否则读取的数值将会比原本的多很多。

代码效果展示:

输入文件内容(可以任意添加):

输出文件获取的内容:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章