对网络子网中第一个可用主机执行 Ping 操作

发布于 2024-08-15 05:18:25 字数 1683 浏览 6 评论 0原文

我用 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 (和 Angry IP 扫描仪)来完成这项任务,但我有兴趣编写自己的脚本。

I've written a small script in Python that pings all subnets of my school's wireless network and prints out the IP addresses and hostnames of computers that are connected to each subnet of the network. My current setup is that I'm relying on creating threads to handle each of the ping requests.

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()

However, I want to modify my script so that it only seeks out the first available host in the subnet. What that means is that suppose I have the following subnet (128.119.177.0/24) and the first available host is 128.119.177.20. I want my script to stop pinging the remaining hosts in the 128.119.177.0/24 after I successfully contact 128.119.177.20. I want to repeat that for every subnet on my network (128.119.0.1 - 128.119.255.254). Given my current setup, what would be the best course of action to make this change? I was thinking of doing something like a list of Queues (where each Queue holds 255 IP addresses for one of the subnets) and having one thread process each queue (unless there is a limitation on how many threads I can spawn in Python on Windows).

EDIT: I have played around with nmap (and Angry IP scanner) for this task, but I was interested in pursuing writing my own script.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不再让梦枯萎 2024-08-22 05:18:25

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

未经测试

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()

Simplest thing would be to have a thread work through a whole subnet and exit when it finds a host.

UNTESTED

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()
泛泛之交 2024-08-22 05:18:25

由于您知道在运行开始时获得了多少个线程,因此您可以定期检查当前正在运行的线程数,以查看 nowThreadCount < 是否为 0。启动线程计数。如果为 true 则终止当前线程。

PS:最简单的方法也是清除队列对象,但我在文档中找不到。

Since you know how many threads you got in the beginning of the run, you could periodically check the current number of threads running to see if nowThreadCount < startThreadCount. If it's true terminate the current thread.

PS: Easiest way would be to just clear the queue object too, but I can't find that in the docs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文