2

假设你有这样的东西(从这里复制):

#!/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 完成。我可以将循环内部每次都按照 in 的线放入背景&中:

for ip in 192.168.0.{0..255}; do 
ping -c 1 $ip &
done
4

2 回答 2

5

您应该做的第一件事是将范围更改range(0, 256)为包含 0-255。

其次,您正在查看 Python 的线程,它可能有点类似于抽象级别的 Bash 进程守护进程。

导入多处理并创建一个池:

from multiprocessing.pool import ThreadPool
pool = ThreadPool(20)  # However many you wish to run in parallel

因此,使用 ping 查找,这是 for 循环中的所有内容,并将其变成一个函数。

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()是等待所有线程返回的内容。

于 2013-09-16T12:49:24.500 回答
0

您可以使用threadingormultiprocessing模块来运行异步/非阻塞 IO 调用。

阅读关于 SO 的差异:

python中的多进程或线程?

于 2013-09-16T12:50:25.343 回答