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

對獲取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。所以在比較時,需要將這段剔除,否則讀取的數值將會比原本的多很多。

代碼效果展示:

輸入文件內容(可以任意添加):

輸出文件獲取的內容:

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