代码
#########################################################################
# 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 格式打印
效果
执行命令必须传参,否则会报错
执行某个网段的测试