2016-08-25 5 views
2

Wie kann ich ping 192.168.0.1 - 192.168.0.254 auf einmal? Der Versuch, das Skript schneller laufen zu lassen, dauert einige Minuten.Senden mehrerer Pings mit Python

import os 
import subprocess 


ip = raw_input("IP Address? ") 
print "Scanning IP Address: " + ip 

subnet = ip.split(".") 

FNULL = open(os.devnull, 'w') 

for x in range(1, 255): 
    ip2 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(x) 
    response=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT).wait() 
if response == 0: 
    print ip2, 'is up!' 
else: 
    print ip2, 'is down!' 
+0

Schauen Sie in 'Multiprocessing' Modul' Pool'. – jacob

+0

@jacob ist nicht der Pool für Multiprocessing, wenn Sie eine Reihe von Python-Prozessen starten und koordinieren möchten? Der Code startet bereits Prozesse (was Popen tut), also würden Sie nur Prozesse starten, um Prozesse zu starten, was sehr schnell interessant werden würde. – Pyonsuke

+0

@Pyonsuke Ja; aber er rief jedes Mal "warten" auf den Prozess. Mit 'multiprocessing' können Sie für jeden' ​​subprocess.Popen' einen Prozess starten und jeder kann seinen 'wait' haben. Ich sage nicht, dass es optimal ist, aber es war das Erste, was mir in den Sinn kam. – jacob

Antwort

0

Blick auf die Methode, die Sie eine Antwort erhalten verwenden:

response=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT).wait() 

Am wichtigsten ist, dass die .wait() am Ende bedeutet, dass Ihr Programm bis zum Ende des Prozesses warten wird.

Sie können auf einmal 255 Prozesse starten (obwohl Sie kleinere Stücke für den Fall der Vernunft starten möchten), indem das Ergebnis von Popen setzen (und nicht warten) in eine Liste:

processes = [] 
for ip8 in range(1, 255): 
    ip32 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(ip8) 
    process = subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip32], stdout=FNULL, stderr=subprocess.STDOUT) 
    processes.append(process) 

können Sie gehen dann durch jede und jeden Prozess und warten, bis sie fertig sind:

for process, ip8 in zip(processes, range(1, 255)): 
    ip32 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(ip8) 
    response = process.wait() 
    if response == 0: 
     print("%s is up!" % (ip32)) 
    else: 
     print("%s is down!" % (ip32)) 
2

Statt für jeden Prozess des Wartens in der Schleife beenden Sie alle Prozesse sofort beginnen und sie in einer Liste speichern:

processes = [] 

for x in range(1, 255): 
    ip2 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(x) 
    process = subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT) 
    processes.append((ip2, process)) 

Dann können Sie dann für jeden Prozess warten zu beenden und drucken Sie die Ergebnisse:

for ip2, process in processes: 
    response = process.wait() 
    if response == 0: 
     print ip2, 'is up!' 
    else: 
     print ip2, 'is down!' 
0

Oder man könnte sie alle mit einem Ping an die Subnetzbroadcastadresse pingen. Also, wenn Ihr Subnetz ist 255.255.255.0 (auch bekannt als /24) dann nur ping 192.168.0.255 und normalerweise wird jeder zurück ping.

Verwandte Themen