So, I'm trying to get similar results using python as I do with a bash script.
Code for the bash script:
    #!/bin/bash
    for ip in $(seq 1 254); do
        ping -c 1 10.10.10.$ip | grep "bytes from" | cut -d " " -f 4 | cut -d ":" -f 1 &
    done
The thing that I would like to do is get the same results with similar speed. The issue that I've had with every version of the python script is that it takes a very long time to complete compared to the few seconds the batch script takes.
The batch file takes about 2 seconds to sweep a /24 network while the the best I can get with the python script is about 5-8 minutes.
Latest version of python script:
import subprocess
cmdping = "ping -c1 10.10.10."
for x in range (2,255):
    p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
    while True:
        out = p.stderr.read(1)
        if out == '' and p.poll() != None:
            break
        if out != '':
            sys.stdout.write(out)
            sys.stdout.flush()
I've tried several different ways in python but can't get anywhere near the speed of the bash script.
Any suggestions?
To perform a ping sweep: From a Microsoft OS command line, Type for /l %i in (1,1,254) do @ping -n 1 -w 100 <first three octets of host network>. %i.
#!/usr/bin/python2
import multiprocessing
import subprocess
import os
def pinger( job_q, results_q ):
    DEVNULL = open(os.devnull,'w')
    while True:
        ip = job_q.get()
        if ip is None: break
        try:
            subprocess.check_call(['ping','-c1',ip],
                                  stdout=DEVNULL)
            results_q.put(ip)
        except:
            pass
if __name__ == '__main__':
    pool_size = 255
    jobs = multiprocessing.Queue()
    results = multiprocessing.Queue()
    pool = [ multiprocessing.Process(target=pinger, args=(jobs,results))
             for i in range(pool_size) ]
    for p in pool:
        p.start()
    for i in range(1,255):
        jobs.put('192.168.1.{0}'.format(i))
    for p in pool:
        jobs.put(None)
    for p in pool:
        p.join()
    while not results.empty():
        ip = results.get()
        print(ip)
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With