2011-09-24 104 views
6

我正在嘗試編寫一個Python腳本,它使用Scapy模塊來ping內部IP範圍以確定哪些IP在線。我得到這個至今:用Scapy Ping IP範圍

#!/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" 

,程序會坐一會兒什麼都不做,然後,如果我用CTRL + CI殺死它得到一個錯誤信息:

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' 

但是,如果我嘗試使用一個IP地址,而不是一個範圍,它的工作原理。像這樣:

#!/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" 

任何人都知道我該如何解決這個問題?或者你有沒有其他想法可以用Scapy來ping IP範圍,以確定哪些主機在線?

+0

你的問題與分配'sr1(packet)'的返回值來回答。我不熟悉'scapy',所以我不能再提供幫助了,但是從那裏開始。 – brc

回答

5

您只需確保reply不是NoneType,如下圖所示... sr1()返回None如果您收到等待響應的超時。您還應該添加timeoutsr1(),默認超時對您而言非常荒謬。

#!/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

不會封包[IP] .src打印源IP,即如果您從10.1.1.1 ping到10.1.1.7並且失敗 - 回覆將是「超時等待10.1.1.1」而不是「超時等待10.1 .1.7" ? –

+0

已修復,謝謝你的收穫 –

2

不能顯示reply.src場,如果變量的迴歸爲空。換句話說,您需要驗證變量是否具有某個值返回(如果ping成功)。只有當變量不爲空時,纔可以使IF條件獲取.src字段。