使用python多线程批量ping

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

特点

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

代码

 1import subprocess
 2import multiprocessing
 3import  time
 4
 5def check_alive(ip):
 6    result = subprocess.call(f'ping -w 1000 -n 2 {ip}', stdout=subprocess.PIPE, shell=True)
 7    # 等待超时时间1000ms , 测试次数 2次
 8    if result == 0:
 9        h = subprocess.getoutput('ping ' + ip)
10        returnnum = h.split('平均 = ')[1]
11        print(f'{ip}\t\033[32m[ok]\033[0m\t{returnnum}\t'.replace("\n","") )
12    else:
13        print(f'{ip}\t\033[31m[bad]\033[0m'.replace("\n",""))
14
15
16if __name__ == '__main__':
17    print('结果使用tab分隔,可以拷贝到excel中,通过数据透视进行ip排序等')
18    # 获取所有当前目录下的txt文件并存入 txtfile_list
19    import os
20    path = "."
21    file_name_list = os.listdir(path)
22    txtfile_list = []
23    for x in file_name_list:
24        if x.__contains__('.'):
25            if x.split('.')[1] == "txt":
26                txtfile_list.append(x)
27    print(txtfile_list)
28
29    MUTIPROCESS = True
30
31    for x in txtfile_list:
32        print(f"scaning {x} :")
33        # input("enter 开始ping")
34        with open(x, 'r') as f:  # xxx.txt 内容应该包含ip地址,每行一个,可以写备注因为下面会
35            print(f'ipaddress\t[ok]\tlatency\t'.replace("\n", ""))
36            for line in f:
37                # 识别ip地址
38                if len(line.split('.')) == 4:
39                    if MUTIPROCESS: # 多线程模式
40                        p = multiprocessing.Process(target=check_alive, args=(line,))
41                        p.start()
42                    else: #单线程模式
43                        check_alive(line)
44                # 展示非ip行内容
45                # else:   print(line)
46
47        # 等待多线程数量为0(ping均结束)后开启下一个txt的扫描
48        while True:
49            if len(multiprocessing.active_children()) == 0:
50                # print('thread count: '+ str(len(multiprocessing.active_children())) +' ,scan complete\n\n')
51                print("------------")
52                break
53            time.sleep(3)

使用效果

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

image image

尾巴

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

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

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

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


使用Netch加速apex
战地5键盘不灵的解决办法