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中类的继承的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 精心整理总结的Python自动化测试面试题

    精心整理总结的Python自动化测试面试题

    简单来说,自动化测试框架包含了所有的测试工作所需的测试框架,下面这篇文章主要给大家介绍了关于Python自动化测试面试题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Python中在脚本中引用其他文件函数的实现方法

    Python中在脚本中引用其他文件函数的实现方法

    下面小编就为大家带来一篇Python中在脚本中引用其他文件函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • python获取指定目录下所有文件名列表的方法

    python获取指定目录下所有文件名列表的方法

    这篇文章主要介绍了python获取指定目录下所有文件名列表的方法,涉及Python目录及文件操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • python语法学习之super(),继承与派生

    python语法学习之super(),继承与派生

    这篇文章主要介绍了python语法学习之super(),继承与派生,继承是一种创建新类的方式,具体的super()派生的相关详细内容需要的小伙伴可以参考下面文章内容
    2022-05-05
  • Python变量作用域LEGB用法解析

    Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python3读取和处理超大文件的操作详解

    Python3读取和处理超大文件的操作详解

    在日常工作中,文件对象是我们常接触到的可迭代类型之一,一般用 for 循环遍历一个文件对象,可以逐行读取它的内容,但这种方式在碰到大文件时,可能会出现一些奇怪的效率问题,所以本文给大家介绍了Python3读取和处理超大文件的操作,需要的朋友可以参考下
    2024-04-04
  • pytorch 两个GPU同时训练的解决方案

    pytorch 两个GPU同时训练的解决方案

    这篇文章主要介绍了pytorch 两个GPU同时训练的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python 保持登录状态进行接口测试的方法示例

    Python 保持登录状态进行接口测试的方法示例

    这篇文章主要介绍了Python 保持登录状态进行接口测试的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-08-08
  • Python简单删除列表中相同元素的方法示例

    Python简单删除列表中相同元素的方法示例

    这篇文章主要介绍了Python简单删除列表中相同元素的方法,结合具体实例形式分析了Python使用list、set方法针对列表元素的去重与排序操作实现技巧,非常简单实用,需要的朋友可以参考下
    2017-06-06

最新评论