2011-09-24 81 views
6

Tôi đang cố gắng viết một kịch bản Python sử dụng mô-đun Scapy để ping một dải IP nội bộ để xác định IP nào đang trực tuyến. Tôi đã có này cho đến nay:Ping một dải IP với Scapy

#!/usr/bin/python 
from scapy.all import * 
conf.verb = 0 
for ip in range(0, 256): 
    packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP() 
    reply = sr1(packet) 
    if "192.168." in reply.src: 
     print reply.src, "is online" 

Và chương trình sẽ ngồi trong một thời gian không làm gì cả, và sau đó nếu tôi giết nó bằng tổ hợp phím CTRL + CI nhận được một thông báo lỗi:

Traceback (most recent call last): 
File "sweep.py", line 7, in <module> 
if "192.168." in reply.src: 
AttributeError: 'NoneType' object has no attribute 'src' 

Tuy nhiên nếu Tôi thử nó với một địa chỉ IP duy nhất, thay vì một phạm vi, nó hoạt động. Như thế này:

#!/usr/bin/python 
from scapy.all import * 
conf.verb = 0 
packet = IP(dst="192.168.0.195", ttl=20)/ICMP() 
reply = sr1(packet) 
if "192.168." in reply.src: 
    print reply.src, "is online" 

Bất kỳ ai biết cách khắc phục sự cố này? Hay bạn có bất kỳ ý tưởng nào khác về cách tôi có thể ping một dải IP với Scapy, để xác định máy chủ nào đang trực tuyến?

+0

Sự cố của bạn phải thực hiện với việc gán giá trị trả lại của 'sr1 (gói)' để trả lời. Tôi không quen thuộc với 'scapy' nên tôi không thể cung cấp thêm sự giúp đỡ nào ngoài việc đó, nhưng bắt đầu từ đó. – brc

Trả lời

5

Bạn chỉ cần đảm bảo rằng reply không phải là NoneType như minh họa bên dưới ... sr1() trả về None nếu bạn nhận được thời gian chờ chờ phản hồi. Bạn cũng nên thêm timeout vào sr1(), thời gian chờ mặc định là vô lý cho các mục đích của bạn.

#!/usr/bin/python 
from scapy.all import * 

TIMEOUT = 2 
conf.verb = 0 
for ip in range(0, 256): 
    packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP() 
    reply = sr1(packet, timeout=TIMEOUT) 
    if not (reply is None): 
     print reply.dst, "is online" 
    else: 
     print "Timeout waiting for %s" % packet[IP].dst 
+0

sẽ không gói [IP] .src in nguồn IP tức là nếu bạn đang ping từ 10.1.1.1 đến 10.1.1.7 và không thành công - trả lời sẽ là "Hết giờ chờ 10.1.1.1" thay vì "Hết thời gian chờ 10.1 .1.7 "? –

+0

Đã sửa lỗi, cảm ơn bạn vì đã bắt –

2

Bạn không thể hiển thị trường reply.src nếu sự trở lại của biến là null. Nói cách khác, bạn cần phải xác nhận nếu biến đã trở lại với một số giá trị (nếu ping thành công). Bạn có thể tạo điều kiện IF để lấy trường .src chỉ khi biến không phải là rỗng.

Các vấn đề liên quan