之前用云管工具感觉很方便,操作很nice
但是不是每个企业所有的网络设备都用的云管设备。
那么有一个能自动帮忙检查所有网络设备是否在线就显得尤为重要了
import subprocess
import platform
import re
from openpyxl import load_workbook
import os
from datetime import datetime
def ensure_results_dir():
"""确保检查结果目录存在"""
results_dir = os.path.join(os.getcwd(), "检查结果")
if not os.path.exists(results_dir):
os.makedirs(results_dir)
return results_dir
def create_log_file(results_dir):
"""创建日志文件,以当前时间命名"""
now = datetime.now()
timestamp = now.strftime("%Y%m%d_%H%M%S")
log_filename = f"设备检查_{timestamp}.txt"
log_path = os.path.join(results_dir, log_filename)
return open(log_path, 'w', encoding='utf-8')
class Logger:
"""同时输出到控制台和文件的日志记录器"""
def __init__(self, log_file):
self.log_file = log_file
def log(self, message, print_to_console=True):
"""记录日志"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_message = f"[{timestamp}] {message}"
self.log_file.write(log_message + "\n")
self.log_file.flush() # 确保立即写入文件
if print_to_console:
print(log_message)
def load_devices_from_excel(file_path='网络设备.xlsx', sheet_name='Sheet1'):
"""从Excel文件加载设备列表"""
devices = []
if not os.path.exists(file_path):
raise FileNotFoundError(f"Excel文件 {file_path} 不存在!")
try:
wb = load_workbook(file_path)
sheet = wb[sheet_name]
for row in sheet.iter_rows(min_row=2, values_only=True):
if row[0] and row[4]: # 确保名称和IP都不为空
devices.append({
"name": str(row[0]).strip(),
"ip": str(row[4]).strip()
})
return devices
except Exception as e:
raise Exception(f"读取Excel文件时出错: {e}")
def ping_device(ip, count=10):
"""执行ping命令并返回成功接收的包数"""
param = '-n' if platform.system().lower() == 'windows' else '-c'
command = ['ping', param, str(count), ip]
try:
output = subprocess.run(command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, text=True, timeout=15)
# 改进的正则表达式匹配
pattern = r'已发送\s*=\s*(\d+),已接收\s*=\s*(\d+)'
match = re.search(pattern, output.stdout)
return int(match.group(2)) if match else 0
except subprocess.TimeoutExpired:
return 0
except Exception as e:
raise Exception(f"Ping {ip} 时发生错误: {e}")
def check_devices_status(devices, logger):
"""检查所有设备的状态并记录结果"""
if not devices:
logger.log("没有可检查的设备,请检查Excel文件内容!")
return
logger.log("\n设备状态检查开始")
logger.log("-" * 50)
results = []
for device in devices:
name, ip = device["name"], device["ip"]
logger.log(f"正在检查 {name} ({ip})...", print_to_console=False)
try:
received = ping_device(ip)
if received == 10:
status = f"{name} ({ip}) 设备通讯正常 (收到 {received}/10 个响应)"
elif received >= 5:
status = f"{name} ({ip}) 设备掉包 (收到 {received}/10 个响应)"
else:
status = f"{name} ({ip}) 设备异常 (收到 {received}/10 个响应)"
logger.log(status)
results.append(status)
except Exception as e:
error_msg = f"{name} ({ip}) 检查失败: {str(e)}"
logger.log(error_msg)
results.append(error_msg)
# 统计结果
logger.log("-" * 50)
logger.log(f"共检查 {len(devices)} 台设备,其中:")
logger.log(f"正常设备: {sum(1 for r in results if '正常' in r)}")
logger.log(f"掉包设备: {sum(1 for r in results if '掉包' in r)}")
logger.log(f"异常设备: {sum(1 for r in results if '异常' in r)}")
logger.log(f"检查失败: {sum(1 for r in results if '失败' in r)}")
if __name__ == "__main__":
try:
# 初始化日志系统
results_dir = ensure_results_dir()
log_file = create_log_file(results_dir)
logger = Logger(log_file)
logger.log("开始检查设备状态...")
# 从Excel加载设备列表
try:
devices = load_devices_from_excel()
logger.log(f"成功加载 {len(devices)} 台设备")
# 检查设备状态
check_devices_status(devices, logger)
except Exception as e:
logger.log(f"程序运行出错: {str(e)}")
logger.log("\n检查完成。")
finally:
# 确保日志文件被正确关闭
if 'log_file' in locals():
log_file.close()
表格详情
设备功能 | 設備型號 | 設備名稱 | VLAN | 管理IP |
核心交换机 | core_10.130.0.1 | 130 | 10.130.0.1 | |
上网行为管理 | sangfor10.130.0.2 | 130 | 10.130.0.2 |
每个设备检查开始的时候打印一个提示,开始检查,检查完毕打印一个检查结果
最终汇总 检查了几个,有问题的有几个,没问题的有几个