Python实现批量检测ip地址连通性

 更新时间:2024年04月18日 09:18:19   作者:蜗牛其实也很努力  
这篇文章主要为大家详细介绍了如何使用Python实现批量检测ip地址连通性并以json格式显示(支持传参单IP或者网段),感兴趣的小伙伴可以了解下

实现代码

 #########################################################################
 #    File Name: check_ip_test.py
 #    Author: eight
 #    Mail: 18847097110@163.com 
 #    Created Time: Thu 11 Apr 2024 08:52:45 AM CST
 #########################################################################
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-                                                                                                                                                                                                             
 import sys
 import ipaddress
 import subprocess
 import re
 import json
 
 
 # 处理单个IP 的ping请求
 def ping_ip(ip):
     try:
         output = subprocess.check_output(['ping', '-c', '1', ip], stderr=subprocess.STDOUT, universal_newlines=True, timeout=2)
         return output
     except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
         return False
 
 
 # 处理网段的请求
 def scan_network(ip_network):
     result_list = []
     for ip in ipaddress.IPv4Network(ip_network, strict=False):
         ip_str = str(ip)
         result = ping_ip(ip_str)
         print(f"Begin Ping {ip_str}...")
         time_value = ping_test_match(ip_str)
         if result:
             #print(f"{ip_str} Network communication is normal.")
             if time_value:
                 result_list.append({'ip': ip_str, 'connection': True, 'time': f"{time_value} ms"})
             else:
                 result_list.append({'ip': ip_str, 'connection': True, 'time': '0ms'})
         else:
             #print(f"{ip_str} Network communication is not normal.")
             result_list.append({'ip': ip_str, 'connection': False})
     return result_list 
 
 
# 测试的请求及正则匹配time时间
 def ping_test_match(ip):
     try:
         ipaddress.IPv4Address(ip)
         #print("The entered address is valid. The connectivity check starts")
         ping_output = ping_ip(ip)
         if ping_output:
             #return "yes"
             time_match = re.search(r"time=([\d.]+) ms", ping_output)
             if time_match:
                 time_value = float(time_match.group(1))
                 return time_value
             else:
                 return None
         else:
             return None
     except ipaddress.AddressValueError:
         #print("The entered address is invalid")
         return None
             
 
 # 如果是单个IP,执行第一条,因为利用此方法检测ip是否是合法的,输入网段则视为不合法,所以输入网段会用except
 if __name__ == "__main__":
     ip = sys.argv[1]
     try:
         ipaddress.IPv4Address(ip)
         print(ping_test_match(ip))
     except ipaddress.AddressValueError:
         result_list = scan_network(ip)
         #print(json.dumps(result_list))
         for item in result_list:
             if "time" not in item:
                 item["time"] = "0ms"
         print(json.dumps(result_list))       

代码详解

模块解释:

  • sys:  模块,用于访问命令行参数等系统功能。
  • ipaddress: 模块,用于处理 IP 地址和网络。
  • subprocess: 模块,用于执行外部命令。
  • re:模块,用于正则表达式匹配。
  • json: 模块,用于 JSON 数据展示

代码解释:

ping_ip函数

1.接收一个 IP 地址作为参数,执行 ping 测试,使用 subprocess.check_output 函数来运行 ping 命令,然后返回命令的输出。

2.如果 ping 命令执行失败(例如,由于超时或返回非零退出代码),则会捕获 subprocess.CalledProcessError 或 subprocess.TimeoutExpired 异常,并返回 False

scan_network函数

1.scan_network 函数接收一个 IP 网段作为参数,然后遍历该网段中的所有 IP 地址。

2.对于每个 IP 地址,调用 ping_ip 函数执行 ping 测试,调用ping_test_match函数获取time时间。

3.将结果存储在 result 中。

4.最后,根据 ping 测试的结果和 ping 时间,它向 result_list 中添加一个字典,该字典包含 IP 地址、连接状态和 ping 时间

ping_test_match函数

1.调用 ping_ip 函数的结果

2.利用正则匹配  time字段

if __name__ == "__main__":

1.获取传参

2.如果是单个 IPv4 地址,则执行单个 IP 地址的 ping 测试,并打印结果。

3.如果无法转换为 IPv4 地址,则将输入视为 IP 网段,并执行ping测试,将结果以 JSON 格式打印

效果

执行命令必须传参,否则会报错

执行某个网段的测试

到此这篇关于Python实现批量检测ip地址连通性的文章就介绍到这了,更多相关Python检测ip连通性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python进行文件对比的方法

    python进行文件对比的方法

    在本篇内容里小编给分享了关于python进行文件对比的方法和步骤,需要的朋友们可以学习下。
    2018-12-12
  • python中字符串的编码与解码详析

    python中字符串的编码与解码详析

    这篇文章主要给大家介绍了关于python中字符串的编码与解码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python Socket无限发送接收数据方式

    python Socket无限发送接收数据方式

    这篇文章主要介绍了python Socket无限发送接收数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • python调用摄像头显示图像的实例

    python调用摄像头显示图像的实例

    今天小编就为大家分享一篇python调用摄像头显示图像的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 一文带你掌握Pyecharts地理数据可视化的方法

    一文带你掌握Pyecharts地理数据可视化的方法

    这篇文章主要介绍了一文带你掌握Pyecharts地理数据可视化的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python简洁优雅的推导式示例详解

    Python简洁优雅的推导式示例详解

    这篇文章主要给大家介绍了关于Python简洁优雅的推导式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python结合turtle简单开发一个烟花小工具

    Python结合turtle简单开发一个烟花小工具

    这篇文章主要为大家详细介绍了Python如何利用turtle模块实现的简单的烟花效果展示小工具,文章的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-12-12
  • 用python + openpyxl处理excel2007文档思路以及心得

    用python + openpyxl处理excel2007文档思路以及心得

    最近要帮做RA的老姐写个合并excel工作表的脚本……源数据是4000+个excel 工作表,分布在9个xlsm文件里,文件内容是中英文混杂的一些数据,需要从每张表中提取需要的部分,分门别类合并到多个大的表里。
    2014-07-07
  • Python类的详细定义与使用案例(实例讲解)

    Python类的详细定义与使用案例(实例讲解)

    这篇文章主要给大家介绍了关于Python类的详细定义与使用案例的相关资料,在Python中类表示具有相同属性和方法的对象的集合,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Python项目中安装OpenAI库简单易懂的解决方案

    Python项目中安装OpenAI库简单易懂的解决方案

    openAI库是OpenAI官方提供的Python SDK,旨在帮助开发者轻松调用OpenAI的API,实现自然语言处理(NLP)、图像生成、代码补全等AI功能,这篇文章主要介绍了Python项目中安装OpenAI库简单易懂的解决方案,需要的朋友可以参考下
    2026-03-03

最新评论