2

学校のワイヤレス ネットワークのすべてのサブネットに対して ping を実行し、ネットワークの各サブネットに接続されているコンピューターの IP アドレスとホスト名を出力する小さなスクリプトを Python で作成しました。私の現在の設定では、各 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 への接続に成功した後、スクリプトが 128.119.177.0/24 の残りのホストへの ping を停止するようにします。ネットワーク上のすべてのサブネット (128.119.0.1 - 128.119.255.254) に対してこれを繰り返したいと思います。私の現在の設定を考えると、この変更を行うための最善の行動は何ですか? 私は、キューのリストのようなことを考えていました (各キューは、サブネットの 1 つに対して 255 個の IP アドレスを保持します)。1 つのスレッドが各キューを処理します (Windows 上の Python で生成できるスレッドの数に制限がない限り)。 .

編集: このタスクのために nmap (および Angry IP スキャナー) をいじりましたが、自分のスクリプトを書くことに興味がありました。

4

2 に答える 2

1

最も簡単な方法は、スレッドをサブネット全体で機能させ、ホストが見つかったときに終了することです。

未テスト

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()
于 2009-12-11T00:08:49.963 に答える
0

実行の開始時に取得したスレッド数がわかっているので、現在実行中のスレッド数を定期的にチェックして、nowThreadCount < startThreadCount かどうかを確認できます。true の場合、現在のスレッドを終了します。

PS: 最も簡単な方法は、キュー オブジェクトもクリアすることですが、ドキュメントでそれを見つけることができません。

于 2009-12-11T00:27:52.547 に答える