Python ping网络子网中的第一个可用主机

Python ping网络子网中的第一个可用主机,python,networking,subnet,Python,Networking,Subnet,我已经用Python编写了一个小脚本,用于ping我学校无线网络的所有子网,并打印出连接到网络每个子网的计算机的IP地址和主机名。我当前的设置依赖于创建线程来处理每个ping请求 from threading import Thread import subprocess from Queue import Queue import time import socket #wraps system ping command def ping(i, q): """Pings addres

我已经用Python编写了一个小脚本,用于ping我学校无线网络的所有子网,并打印出连接到网络每个子网的计算机的IP地址和主机名。我当前的设置依赖于创建线程来处理每个ping请求

from threading import Thread
import subprocess
from Queue import Queue
import time
import socket

#wraps system ping command
def ping(i, q):
    """Pings address"""
    while True:
        ip = q.get()
        #print "Thread %s: Pinging %s" % (i, ip)
        result = subprocess.call("ping -n 1 %s" % ip, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        #Avoid flooding the network with ping requests
        time.sleep(3)
        if result == 0:

            try:
                hostname=socket.gethostbyaddr(ip)
                print "%s (%s): alive" % (ip,hostname[0])
            except:
                print "%s: alive"%ip
        q.task_done()

num_threads = 100
queue = Queue()
addresses=[]
#Append all possible IP addresses from all subnets on wireless network
for i in range(1,255):
    for j in range(1,254):
        addresses.append('128.119.%s.%s'%(str(i),str(j)))
#Spawn thread pool
for i in range(num_threads):
    worker = Thread(target=ping, args=(i, queue))
    worker.setDaemon(True)
    worker.start()
#Place work in queue
for ip in addresses:
    queue.put(ip)
#Wait until worker threads are done to exit    
queue.join()
但是,我想修改脚本,使其只查找子网中的第一个可用主机。这意味着,假设我有以下子网(128.119.177.0/24),第一个可用主机是128.119.177.20。成功联系128.119.177.20后,我希望脚本停止ping 128.119.177.0/24中的其余主机。我想对网络上的每个子网(128.119.0.1-128.119.255.254)重复这一点。考虑到我目前的设置,进行此更改的最佳行动方案是什么?我想做一些事情,比如队列列表(其中每个队列包含一个子网的255个IP地址)和让一个线程处理每个队列(除非对我在Windows上用Python生成的线程数量有限制)


编辑:我在这个任务中使用了nmap(和愤怒的IP扫描器),但我对自己编写脚本感兴趣

最简单的方法是让线程在整个子网中工作,并在找到主机时退出

未经测试

from Queue import Queue
import time
import socket

#wraps system ping command
def ping(i, q):
    """Pings address"""
    while True:
        subnet = q.get()
        # each IP addresse in subnet 
        for ip in (subnet=str(x) for x in range(1,254)):
            #print "Thread %s: Pinging %s" % (i, ip)
            result = subprocess.call("ping -n 1 %s" % ip, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
            #Avoid flooding the network with ping requests
            time.sleep(3)
            if result == 0:

                try:
                    hostname=socket.gethostbyaddr(ip)
                    print "%s (%s): alive" % (ip,hostname[0]  
                except:
                    print "%s: alive"%ip
                break
        q.task_done()

num_threads = 100
queue = Queue()

#Put all possible subnets on wireless network into a queue
for i in range(1,255):
    queue.put('128.119.%s.'%i)

#Spawn thread pool
for i in range(num_threads):
    worker = Thread(target=ping, args=(i, queue))
    worker.setDaemon(True)
    worker.start()

#Wait until worker threads are done to exit    
queue.join()

由于您知道在运行开始时获得了多少线程,因此可以定期检查当前运行的线程数,查看nowThreadCount是否
PS:最简单的方法是也清除队列对象,但我在文档中找不到。

您考虑过使用nmap吗?另外,要小心,因为虽然你所做的可能是无辜的,但它可能看起来像一个工作中的爆竹@rohanbk,同时检查你学校的网络使用政策。我在一所大学工作了好几年,这会违反使用政策,让你被禁止(甚至可能被开除)。