python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python检测ip连通性

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

作者:蜗牛其实也很努力

这篇文章主要为大家详细介绍了如何使用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))       

代码详解

模块解释:

代码解释:

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连通性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文