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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 12:23   75   0

对获取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。所以在比较时,需要将这段剔除,否则读取的数值将会比原本的多很多。

代码效果展示:

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

输出文件获取的内容:

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP