用Python实现快速ping扫描

10

所以,我正在尝试使用Python编写类似于Bash脚本的结果。

Bash脚本的代码:

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

我想做的事情是以相似的速度获得相同的结果。我使用每个版本的Python脚本都遇到了问题,与批处理脚本仅需几秒钟完成相比,Python脚本需要很长时间才能完成。

批处理文件大约需要2秒钟扫描/24网络,而我最好的Python脚本只能达到5-8分钟。

Python脚本的最新版本:

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

我已经尝试了几种不同的Python方法,但是速度远远赶不上Bash脚本。

有什么建议吗?


你能具体一些吗?"很长时间"相对于"几秒钟"有多长? - Greg Hewgill
4
在bash脚本末尾加上“&”符号可使进程在后台运行。而您的Python脚本则按顺序逐个地运行这些进程。 - Blender
批处理文件大约需要2秒钟来扫描一个/24网络,而使用Python脚本最好的情况下需要5-8分钟。 - digital_alchemy
2
@Blender:哈!我错过了那个&。是的,那显然是一个关键点。 - Greg Hewgill
这是一段同时ping所有IP地址的代码(这里不需要使用multiprocessing)。这是一个代码示例,限制并发ping数量 - jfs
1个回答

21

多进程编程

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

jobs.put(None) 的目的是什么?@mojo - Isaias
@Isaias,每个None都表示没有更多的作业了。如果您修改工作进程代码,可能可以结束队列并获得类似的结果。 - mojo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接