需要获取交换机的设信息SN、交换机型号、交换机sysname,然后以上3个参数与交换机IP地址汇总一起形成设备信息
import re
from netmiko import ConnectHandler
from concurrent.futures import ThreadPoolExecutor, as_completed
# 定义设备信息和登录凭据
device_type = 'hp_comware'
username = 'yangwb'
password = 'Ywb@123qwe'
# 从文件中读取交换机IP地址
with open('ping_successes_20240622_091658.txt') as f:
ips = f.read().strip().splitlines()
# 定义要提取的参数正则表达式
regex_device_name = re.compile(r"DEVICE_NAME\s+:\s+(.*)", re.IGNORECASE)
regex_serial_number = re.compile(r"DEVICE_SERIAL_NUMBER\s+:\s+(.*)", re.IGNORECASE)
regex_sysname = re.compile(r"sysname\s+(.*)", re.IGNORECASE)
# 定义处理单个设备的函数
def process_device(ip):
try:
print(f"Connecting to device {ip}")
# 定义设备参数
device = {
'device_type': device_type,
'host': ip,
'username': username,
'password': password,
'secret': password, # 密码也用作enable密码
'global_delay_factor': 1, # 减少延迟因子
'timeout': 10, # 连接超时设置为10秒
'banner_timeout': 10, # 登录提示符超时
'auth_timeout': 10, # 身份验证超时
}
# 连接设备
net_connect = ConnectHandler(**device)
# 进入enable模式
net_connect.enable()
# 发送'dis dev man'命令并获取输出
output_dev_man = net_connect.send_command('dis dev man', delay_factor=0.5)
# 提取DEVICE_NAME和DEVICE_SERIAL_NUMBER
device_name_match = regex_device_name.search(output_dev_man)
serial_number_match = regex_serial_number.search(output_dev_man)
if device_name_match and serial_number_match:
device_name = device_name_match.group(1).strip()
serial_number = serial_number_match.group(1).strip()
else:
raise ValueError("DEVICE_NAME or DEVICE_SERIAL_NUMBER not found")
# 发送'dis cur'命令并获取输出
output_dis_cur = net_connect.send_command('dis cur', delay_factor=0.5)
# 提取sysname
sysname_match = regex_sysname.search(output_dis_cur)
if sysname_match:
sysname = sysname_match.group(1).strip()
else:
raise ValueError("sysname not found")
# 断开连接
net_connect.disconnect()
# 返回结果
return f"{ip},{device_name},{serial_number},{sysname}"
except Exception as e:
return f"{ip},ERROR: {str(e)}"
# 使用ThreadPoolExecutor并发处理
with ThreadPoolExecutor(max_workers=50) as executor: # 增加并发线程数
future_to_ip = {executor.submit(process_device, ip): ip for ip in ips}
with open('234.txt', 'w') as output_file:
for future in as_completed(future_to_ip):
result = future.result()
output_file.write(result + '\n')
print(f"Processed result: {result}")
print("All tasks are completed.")