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