您的位置:首页 > 编程语言 > Python开发

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

废话不多说,上代码

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