8

Scapy モジュールを使用して内部 IP 範囲に ping を実行し、どの IP がオンラインであるかを判断する Python スクリプトを作成しようとしています。私はこれまでのところこれを持っています:

#!/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 を実行する方法について、他のアイデアはありますか?

4

3 に答える 3

7

reply以下の図のようになっていないことを確認する必要がありNoneTypeます...応答を待っているタイムアウトが発生した場合にsr1()戻ります。toNoneも追加する必要があります。デフォルトのタイムアウトは、目的にとっては非常にばかげています。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
于 2011-10-19T02:44:41.887 に答える
2

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

于 2012-04-21T19:03:31.330 に答える