我正在尝试创建一个脚本,该脚本根据开始和结束IP范围的用户输入生成IP地址列表。例如,他们可以输入192.168.1.25& 192.168.1.50。然后该列表将被输入scapy以测试开放端口。我想我已经生成了这个列表,但我仍然坚持将各个IP输出到我的其余代码中。我想我正在尝试使用整个列表与列表中的项目。如果有更好的方法,这很好。我这样做主要是为了提高我对Python的理解。
谢谢!
from scapy.all import *
ip_start = raw_input('Please provide the starting IP address for your scan --> ')
start_list = ip_start.split(".")
ip_end = raw_input('Please provide the ending IP address for your scan --> ')
end_list = ip_end.split(".")
top = int(start_list[3])
bot = int(end_list[3])
octet_range = range(top,bot)
#print octet_range
for i in octet_range:
#new_ip_start = ip_start.replace(str(top),str(i))
start_list[3] = i
#print top
#print i
print type(start_list)
src_port = RandShort()
dst_port = 80
scan = sr1(IP(dst=str(start_list))/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)
答案 0 :(得分:9)
使用像nmap
这样的格式会更容易:
192.168.1.1-255
就像现在一样,你可以这样做:
octets = '192.168.1.1-255'.split('.')
parsed_ranges = [map(int, octet.split('-')) for octet in octets]
parsed_ranges
看起来像[[192], [168], [1], [1, 255]]
。从那里开始,使用itertools
生成地址很简单:
import itertools
ranges = [range(r[0], r[1] + 1) if len(r) == 2 else r for r in parsed_ranges]
addresses = itertools.product(*ranges)
这是一个简单的实现:
import itertools
def ip_range(input_string):
octets = input_string.split('.')
chunks = [map(int, octet.split('-')) for octet in octets]
ranges = [range(c[0], c[1] + 1) if len(c) == 2 else c for c in chunks]
for address in itertools.product(*ranges):
yield '.'.join(map(str, address))
结果:
>>> for address in ip_range('192.168.1-2.1-12'): print(address)
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10
192.168.1.11
192.168.1.12
192.168.2.1
192.168.2.2
192.168.2.3
192.168.2.4
192.168.2.5
192.168.2.6
192.168.2.7
192.168.2.8
192.168.2.9
192.168.2.10
192.168.2.11
192.168.2.12
答案 1 :(得分:5)
请记住,虚线的IPv4地址“x.x.x.x”只不过是一个32位整数的人类可读表示。使用它,您可以生成如下范围:
def undotIPv4 (dotted):
return sum (int (octet) << ( (3 - i) << 3) for i, octet in enumerate (dotted.split ('.') ) )
def dotIPv4 (addr):
return '.'.join (str (addr >> off & 0xff) for off in (24, 16, 8, 0) )
def rangeIPv4 (start, stop):
for addr in range (undotIPv4 (start), undotIPv4 (stop) ):
yield dotIPv4 (addr)
for x in rangeIPv4 ('1.2.3.4', '1.2.4.22'):
print (x)