あなたがこのようなものを手に入れたと仮定します(ここからコピーされます):
#!/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.src, "is online"
else:
print "Timeout waiting for %s" % packet[IP].src
次のホストを試す前に、各pingが終了するのを待つ必要はありません。私はの線に沿って背景にループ内部を毎回入れることができます&
で:
for ip in 192.168.0.{0..255}; do
ping -c 1 $ip &
done
最初にすべきことは、範囲をrange(0, 256)
0〜255を含むように変更することです。
次に、Pythonのスレッド化を確認しています。これは、抽象レベルでのBashプロセスのデーモン化にいくらか似ている可能性があります。
マルチプロセッシングをインポートしてプールを作成します。
from multiprocessing.pool import ThreadPool
pool = ThreadPool(20) # However many you wish to run in parallel
したがって、forループ内のすべてであるpingルックアップを取得し、それを関数にします。
def ping(ip):
packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
reply = sr1(packet, timeout=TIMEOUT)
if not (reply is None):
print reply.src, "is online"
else:
print "Timeout waiting for %s" % packet[IP].src
次に、forループで、
for ip in range(0, 256):
pool.apply_async(ping, (ip,))
pool.close()
pool.join()
pool.join()
これは、すべてのスレッドが戻るのを待つものです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加