Fast ping sweep in python

匿名 (未验证) 提交于 2019-12-03 01:48:02

问题:

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?

回答1:

Multiprocessing

#!/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) 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!