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