使用python多线程批量ping

批量ping是我的工作中常常需要用到的功能了,但是手动好麻烦!我在网上找到了一个脚本,经过了一些改进现在非常好用了,为了方便自己以后复制和互联网精神,我把它放在这里!

特点

  • 多个IP并行扫描,速度很快
  • 扫描py代码所在目录下所有.txt文件,对每个txt文件内的所有IP进行扫描(会自动判断行内容是不是ip哦!目前只支持ipv4)
  • 输出上色,更容易看清
  • 输出使用tab分割,可以轻松复制到excel进行排序筛选之类的操作

代码

import subprocess
import multiprocessing
import  time

def check_alive(ip):
    result = subprocess.call(f'ping -w 1000 -n 2 {ip}', stdout=subprocess.PIPE, shell=True)
    # 等待超时时间1000ms , 测试次数 2次
    if result == 0:
        h = subprocess.getoutput('ping ' + ip)
        returnnum = h.split('平均 = ')[1]
        print(f'{ip}\t\033[32m[ok]\033[0m\t{returnnum}\t'.replace("\n","") )
    else:
        print(f'{ip}\t\033[31m[bad]\033[0m'.replace("\n",""))


if __name__ == '__main__':
    print('结果使用tab分隔,可以拷贝到excel中,通过数据透视进行ip排序等')
    # 获取所有当前目录下的txt文件并存入 txtfile_list
    import os
    path = "."
    file_name_list = os.listdir(path)
    txtfile_list = []
    for x in file_name_list:
        if x.__contains__('.'):
            if x.split('.')[1] == "txt":
                txtfile_list.append(x)
    print(txtfile_list)

    MUTIPROCESS = True

    for x in txtfile_list:
        print(f"scaning {x} :")
        # input("enter 开始ping")
        with open(x, 'r') as f:  # xxx.txt 内容应该包含ip地址,每行一个,可以写备注因为下面会
            print(f'ipaddress\t[ok]\tlatency\t'.replace("\n", ""))
            for line in f:
                # 识别ip地址
                if len(line.split('.')) == 4:
                    if MUTIPROCESS: # 多线程模式
                        p = multiprocessing.Process(target=check_alive, args=(line,))
                        p.start()
                    else: #单线程模式
                        check_alive(line)
                # 展示非ip行内容
                # else:   print(line)

        # 等待多线程数量为0(ping均结束)后开启下一个txt的扫描
        while True:
            if len(multiprocessing.active_children()) == 0:
                # print('thread count: '+ str(len(multiprocessing.active_children())) +' ,scan complete\n\n')
                print("------------")
                break
            time.sleep(3)

使用效果

为了避免信息泄露,我这里放的都是一些网络上的服务器,很少…… 不过我正常使用这个工具的时候都是搞几十个ip来扫

image image

尾巴

其实我是周末弄得啦,之前就是直接用的网上搜到的版本,但是总是感觉不好用,今天正好有空,就修改了一下。

无论是输出的排版、还是多个txt的支持之类的,我的版本都是比较好的啦!

如果说你有超级多个ip进行测试的话,你可能会发现有的时候一行输出了2个ip,然后下面还有个空行,那也是我很想解决(但是也不会弄)的东西,因为他们是并行开始ping的,没有办法知道他们测试结束的时间,如果他们的结束后print的时间正好卡在一起那就一行两个了。

不过目前也可以通过复制到excel里面然后把很明显串行的结果剪切过去来解决……但是 一点也不优雅!

comments powered by Disqus
吸引力法则,大圣灵、外星人和心灵能量
使用 Hugo 构建
主题 StackJimmy 设计