2011-09-24 28 views
6

Scapyモジュールを使用して内部IP範囲をpingしてどのIPがオンラインかを判断するPythonスクリプトを作成しようとしています。ScapyでIP範囲をpingする

#!/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でIP範囲をpingしてどのホストがオンラインになっているかを知る方法は他にもありますか?

+0

あなたの問題は、返信に 'sr1(packet)'の戻り値を割り当てることと関係があります。私はscapyに精通していないので、それ以上の助けはできませんが、そこから始めましょう。 – brc

答えて

5

replyNoneTypeでないことを確認する必要があります。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を出力しません。つまり、10.1.1.1から10.1.1.7へのpingを実行していて失敗した場合、「10.1を待っているタイムアウト」ではなく「10.1.1.1を待っているタイムアウト」となります。 .1.7 "? –

+0

修正しました –

2

変数の戻り値がnullの場合は、reply.srcフィールドを表示することはできません。つまり、変数に何らかの値が返されているかどうかを確認する必要があります(pingが成功した場合)。変数がnullでない場合にのみ、IF条件を作成して.srcフィールドを取得することができます。