python跨网段遍历枚举IP地址
2016-11-14 22:22
295 查看
从网上查了一下,遍历IP地址的脚本不是很多,大多存在以下问题:
跨网段问题处理不好,会产生逻辑错误丢失某些IP
一般都是遍历某一段的IP,例如在内网中遍历D段IP扫描存活主机
因此我就想一劳永逸的解决这一问题
首先想到的还是逻辑判断方法,奈何最忌脑子太乱写不出来,于是想到利用二进制遍历:
1.将IP地址分割,每一块转换为8位二进制代码
2.将32位二进制代码转化为十进制,结束地址的十进制减去开地址的十进制,就可以得到之间的IP个数
3.从开始地址起,对其十进制数依次加一,再将其转化为二进制,即可得到之间某一IP的二进制代码
4.将这一IP的二进制按8位分割,每8位转化为一个十进制数,加上”.”,即可得到最终的IP
废话不多说,上代码
运行结果:
跨网段问题处理不好,会产生逻辑错误丢失某些IP
一般都是遍历某一段的IP,例如在内网中遍历D段IP扫描存活主机
因此我就想一劳永逸的解决这一问题
首先想到的还是逻辑判断方法,奈何最忌脑子太乱写不出来,于是想到利用二进制遍历:
1.将IP地址分割,每一块转换为8位二进制代码
2.将32位二进制代码转化为十进制,结束地址的十进制减去开地址的十进制,就可以得到之间的IP个数
3.从开始地址起,对其十进制数依次加一,再将其转化为二进制,即可得到之间某一IP的二进制代码
4.将这一IP的二进制按8位分割,每8位转化为一个十进制数,加上”.”,即可得到最终的IP
废话不多说,上代码
import os,sys base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)] #十进制0~255转化为二进制,补0到8位 def dec2bin80(string_num): num = int(string_num) mid = [] while True: if num == 0: break num,rem = divmod(num, 2) mid.append(base[rem]) result = ''.join([str(x) for x in mid[::-1]]) length = len(result) if length < 8: result = '0' * (8 - length) + result return result #十进制0~255转化为二进制,补0到32位 def dec2bin320(string_num): num = int(string_num) mid = [] while True: if num == 0: break num,rem = divmod(num, 2) mid.append(base[rem]) result = ''.join([str(x) for x in mid[::-1]]) length = len(result) if length < 32: result = '0' * (32 - length) + result return result #十进制0~255转化为二进制,不补零 def dec2bin(string_num): num = int(string_num) mid = [] while True: if num == 0: break num,rem = divmod(num, 2) mid.append(base[rem]) return ''.join([str(x) for x in mid[::-1]]) #二进制转换为十进制 def bin2dec(string_num): return str(int(string_num, 2)) #ip列表生成 def iplist(string_startip,string_endip): #分割IP,然后将其转化为8位的二进制代码 start = string_startip.split('.') start_a = dec2bin80(start[0]) start_b = dec2bin80(start[1]) start_c = dec2bin80(start[2]) start_d = dec2bin80(start[3]) start_bin = start_a + start_b + start_c + start_d #将二进制代码转化为十进制 start_dec = bin2dec(start_bin) end = string_endip.split('.') end_a = dec2bin80(end[0]) end_b = dec2bin80(end[1]) end_c = dec2bin80(end[2]) end_d = dec2bin80(end[3]) end_bin = end_a + end_b + end_c + end_d #将二进制代码转化为十进制 end_dec = bin2dec(end_bin) #十进制相减,获取两个IP之间有多少个IP count = int(end_dec) - int(start_dec) #生成IP列表 for i in range(0,count + 1): #将十进制IP加一,再转化为二进制(32位补齐) plusone_dec = int(start_dec) + i plusone_dec = str(plusone_dec) address_bin = dec2bin320(plusone_dec) #分割IP,转化为十进制 address_a = bin2dec(address_bin[0:8]) address_b = bin2dec(address_bin[8:16]) address_c = bin2dec(address_bin[16:24]) address_d = bin2dec(address_bin[24:32]) address = address_a + '.'+ address_b +'.'+ address_c +'.'+ address_d print address iplist('2.168.255.254','2.169.1.10')
运行结果:
iplist('2.168.255.254','2.169.1.10') 2.168.255.254 2.168.255.255 2.169.0.0 2.169.0.1 2.169.0.2 2.169.0.3 2.169.0.4 2.169.0.5 2.169.0.6 2.169.0.7 2.169.0.8 2.169.0.9 2.169.0.10 2.169.0.11 2.169.0.12 2.169.0.13 2.169.0.14 2.169.0.15 2.169.0.16 2.169.0.17 2.169.0.18 2.169.0.19 2.169.0.20 2.169.0.21 2.169.0.22 2.169.0.23 2.169.0.24 2.169.0.25 2.169.0.26 2.169.0.27 2.169.0.28 2.169.0.29 2.169.0.30 2.169.0.31 2.169.0.32 2.169.0.33 2.169.0.34 2.169.0.35 2.169.0.36 2.169.0.37 2.169.0.38 2.169.0.39 2.169.0.40 2.169.0.41 2.169.0.42 2.169.0.43 2.169.0.44 2.169.0.45 2.169.0.46 2.169.0.47 2.169.0.48 2.169.0.49 2.169.0.50 2.169.0.51 2.169.0.52 2.169.0.53 2.169.0.54 2.169.0.55 2.169.0.56 2.169.0.57 2.169.0.58 2.169.0.59 2.169.0.60 2.169.0.61 2.169.0.62 2.169.0.63 2.169.0.64 2.169.0.65 2.169.0.66 2.169.0.67 2.169.0.68 2.169.0.69 2.169.0.70 2.169.0.71 2.169.0.72 2.169.0.73 2.169.0.74 2.169.0.75 2.169.0.76 2.169.0.77 2.169.0.78 2.169.0.79 2.169.0.80 2.169.0.81 2.169.0.82 2.169.0.83 2.169.0.84 2.169.0.85 2.169.0.86 2.169.0.87 2.169.0.88 2.169.0.89 2.169.0.90 2.169.0.91 2.169.0.92 2.169.0.93 2.169.0.94 2.169.0.95 2.169.0.96 2.169.0.97 2.169.0.98 2.169.0.99 2.169.0.100 2.169.0.101 2.169.0.102 2.169.0.103 2.169.0.104 2.169.0.105 2.169.0.106 2.169.0.107 2.169.0.108 2.169.0.109 2.169.0.110 2.169.0.111 2.169.0.112 2.169.0.113 2.169.0.114 2.169.0.115 2.169.0.116 2.169.0.117 2.169.0.118 2.169.0.119 2.169.0.120 2.169.0.121 2.169.0.122 2.169.0.123 2.169.0.124 2.169.0.125 2.169.0.126 2.169.0.127 2.169.0.128 2.169.0.129 2.169.0.130 2.169.0.131 2.169.0.132 2.169.0.133 2.169.0.134 2.169.0.135 2.169.0.136 2.169.0.137 2.169.0.138 2.169.0.139 2.169.0.140 2.169.0.141 2.169.0.142 2.169.0.143 2.169.0.144 2.169.0.145 2.169.0.146 2.169.0.147 2.169.0.148 2.169.0.149 2.169.0.150 2.169.0.151 2.169.0.152 2.169.0.153 2.169.0.154 2.169.0.155 2.169.0.156 2.169.0.157 2.169.0.158 2.169.0.159 2.169.0.160 2.169.0.161 2.169.0.162 2.169.0.163 2.169.0.164 2.169.0.165 2.169.0.166 2.169.0.167 2.169.0.168 2.169.0.169 2.169.0.170 2.169.0.171 2.169.0.172 2.169.0.173 2.169.0.174 2.169.0.175 2.169.0.176 2.169.0.177 2.169.0.178 2.169.0.179 2.169.0.180 2.169.0.181 2.169.0.182 2.169.0.183 2.169.0.184 2.169.0.185 2.169.0.186 2.169.0.187 2.169.0.188 2.169.0.189 2.169.0.190 2.169.0.191 2.169.0.192 2.169.0.193 2.169.0.194 2.169.0.195 2.169.0.196 2.169.0.197 2.169.0.198 2.169.0.199 2.169.0.200 2.169.0.201 2.169.0.202 2.169.0.203 2.169.0.204 2.169.0.205 2.169.0.206 2.169.0.207 2.169.0.208 2.169.0.209 2.169.0.210 2.169.0.211 2.169.0.212 2.169.0.213 2.169.0.214 2.169.0.215 2.169.0.216 2.169.0.217 2.169.0.218 2.169.0.219 2.169.0.220 2.169.0.221 2.169.0.222 2.169.0.223 2.169.0.224 2.169.0.225 2.169.0.226 2.169.0.227 2.169.0.228 2.169.0.229 2.169.0.230 2.169.0.231 2.169.0.232 2.169.0.233 2.169.0.234 2.169.0.235 2.169.0.236 2.169.0.237 2.169.0.238 2.169.0.239 2.169.0.240 2.169.0.241 2.169.0.242 2.169.0.243 2.169.0.244 2.169.0.245 2.169.0.246 2.169.0.247 2.169.0.248 2.169.0.249 2.169.0.250 2.169.0.251 2.169.0.252 2.169.0.253 2.169.0.254 2.169.0.255 2.169.1.0 2.169.1.1 2.169.1.2 2.169.1.3 2.169.1.4 2.169.1.5 2.169.1.6 2.169.1.7 2.169.1.8 2.169.1.9 2.169.1.10
相关文章推荐
- python跨网段遍历枚举IP地址(转)
- python遍历一个网段的ip地址
- Python实现根据IP地址和子网掩码算出网段的方法
- Python实现根据IP地址和子网掩码算出网段的方法
- Python实现根据IP地址和子网掩码算出网段的方法
- 让C++和Python使用同一个枚举
- c#枚举的用法及遍历方法
- 如何遍历枚举类型的对象、并获取枚举类型长度
- 获取整个局域网IP地址(同网段)
- 用Python更改IP地址(转)
- 用Python遍历文件并搜索文件内容
- 获取整个局域网IP地址(同网段)
- 如何遍历枚举类型的对象、并获取枚举类型长度
- 枚举的遍历和字符串转枚举,枚举转字符串
- Python天天美味(2) - 字符遍历的艺术
- 给Asus WL500G Deluxe无线路由器日志文件添加IP地址地理位置信息的Python小程序
- python小例子之1 -- 递归遍历目录
- 利用ip地址和子网掩码来计算该网段最多主机数的php代码
- Python-遍历目标文件夹下所有文件
- DHCP跨网段分配IP地址