python 批量登录,修改,备份,巡检并输出报告,脚本
需求:
华为 思科 锐捷 交换机telnet 登录后修改ssh方式登录,并备份配置文件和输出巡检报告,IP地址 账号密码 登录方式都从cvs表格中调用,并且批量修改交换机的名字并指定的交换机不修改名字 以下是一个 Python 脚本示例,它实现了从 CSV 文件中读取网络设备信息,使用 Telnet 登录到交换机,备份配置文件,并将登录方式更改为 SSH。对于指定的交换机,脚本会忽略修改设备名称。它还会执行巡检命令并将结果保存到文件中。
Python 脚本
python复制代码import telnetlib import paramiko import time import csv import os # 交换机登录信息 class SwitchInfo: def __init__(self, ip, port, username, password, vendor, protocol, new_name, skip_name_change): self.ip = ip self.port = port self.username = username self.password = password self.vendor = vendor self.protocol = protocol self.new_name = new_name if new_name else None self.skip_name_change = skip_name_change.lower() == 'yes' # Telnet 登录并执行命令 def telnet_execute(switch, command, new_name=None): try: tn = telnetlib.Telnet(switch.ip, switch.port) tn.read_until(b"Username: ") tn.write(switch.username.encode('ascii') + b"\n") tn.read_until(b"Password: ") tn.write(switch.password.encode('ascii') + b"\n") if new_name and not switch.skip_name_change: tn.write(b"system-view\n") tn.write(f"sysname {new_name}\n".encode('ascii')) tn.write(b"save\n") tn.write(b"exit\n") time.sleep(5) # 等待命令完成 tn.write(command.encode('ascii') + b"\n") time.sleep(5) # 等待命令完成 output = tn.read_very_eager().decode('ascii') tn.write(b"exit\n") tn.close() return output except Exception as e: return f"Telnet error: {str(e)}" # SSH 登录并执行命令 def ssh_execute(switch, command): try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(switch.ip, port=int(switch.port), username=switch.username, password=switch.password) stdin, stdout, stderr = ssh.exec_command(command) output = stdout.read().decode('utf-8') error = stderr.read().decode('utf-8') ssh.close() if error: return f"SSH error: {error}" return output except Exception as e: return f"SSH error: {str(e)}" # 执行巡检任务 def inspect_device(switch, is_telnet): commands = { "华为": ["display version", "display ip interface brief", "display current-configuration"], "思科": ["show version", "show ip interface brief", "show running-config"], "锐捷": ["show version", "show ip interface brief", "show current-configuration"] } if switch.vendor not in commands: return f"Unsupported vendor: {switch.vendor}" results = [] for command in commands[switch.vendor]: if is_telnet: output = telnet_execute(switch, command) else: output = ssh_execute(switch, command) results.append((command, output)) save_output(switch.ip, command, output) return results # 保存输出到文件 def save_output(ip, command, output): sanitized_command = command.replace(" ", "_") filename = f"{ip}_{sanitized_command}_output.txt" with open(filename, "w") as file: file.write(output) print(f"Command output saved to: {filename}") # 主函数 def main(): switches = [] with open('switches.csv', 'r') as file: reader = csv.reader(file) for row in reader: ip, port, username, password, vendor, protocol, new_name, skip_name_change = row switches.append(SwitchInfo( ip=ip, port=port, username=username, password=password, vendor=vendor, protocol=protocol, new_name=new_name if new_name else None, skip_name_change=skip_name_change )) for switch in switches: is_telnet = switch.protocol.lower() == 'telnet' if is_telnet: # 用 Telnet 登录并备份配置 backup_output = telnet_execute(switch, "display current-configuration") save_output(switch.ip, "backup", backup_output) # 修改登录方式为 SSH telnet_execute(switch, "system-view && undo telnet server enable && ssh user root authentication-type password") else: # SSH 登录直接备份配置 backup_output = ssh_execute(switch, "show running-config") save_output(switch.ip, "backup", backup_output) # 修改交换机名称(如果不跳过) if switch.new_name and not switch.skip_name_change: if is_telnet: telnet_execute(switch, "", switch.new_name) else: ssh_execute(switch, f"system-view\nsysname {switch.new_name}\nsave\nexit") # 执行巡检 inspect_device(switch, is_telnet) if __name__ == "__main__": main()
代码说明
-
SwitchInfo
类:存储交换机的信息,包括 IP 地址、端口、用户名、密码、厂商、登录方式、新名称以及是否跳过名称修改。 -
telnet_execute
函数:处理 Telnet 连接,执行命令,备份配置,并在需要时修改交换机名称。 -
ssh_execute
函数:处理 SSH 连接,执行命令。 -
inspect_device
函数:根据设备厂商执行巡检命令,并保存输出到文件。 -
save_output
函数:将命令输出保存到文件。 -
main
函数:从 CSV 文件读取设备信息,执行登录、备份、修改登录方式、名称(如果需要)和巡检。
CSV 文件格式
你的 switches.csv
文件应包含以下内容:
csv复制代码192.168.1.1,23,admin,password,华为,telnet,NewName1,yes 192.168.1.2,22,admin,password,思科,ssh,,no 192.168.1.3,23,admin,password,锐捷,telnet,NewName3,yes
-
skip_name_change 列指定是否跳过修改交换机名称。值可以是
yes
或no
。
安装依赖
确保安装了 paramiko
库:
bash 复制代码 pip install paramiko
运行脚本
将代码保存为 network_management.py
,然后在终端中运行:
bash 复制代码 python network_management.py
该脚本将连接到每个交换机,备份配置文件,修改登录方式为 SSH(如果需要),更新交换机名称(如果指定),并执行巡检命令。所有输出将保存到本地文件。