python 批量登录,修改,备份,巡检并输出报告,脚本

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()

代码说明

  1. SwitchInfo:存储交换机的信息,包括 IP 地址、端口、用户名、密码、厂商、登录方式、新名称以及是否跳过名称修改。

  2. telnet_execute 函数:处理 Telnet 连接,执行命令,备份配置,并在需要时修改交换机名称。

  3. ssh_execute 函数:处理 SSH 连接,执行命令。

  4. inspect_device 函数:根据设备厂商执行巡检命令,并保存输出到文件。

  5. save_output 函数:将命令输出保存到文件。

  6. 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 列指定是否跳过修改交换机名称。值可以是 yesno

安装依赖

确保安装了 paramiko 库:

bash
复制代码
pip install paramiko

运行脚本

将代码保存为 network_management.py,然后在终端中运行:

bash
复制代码
python network_management.py

该脚本将连接到每个交换机,备份配置文件,修改登录方式为 SSH(如果需要),更新交换机名称(如果指定),并执行巡检命令。所有输出将保存到本地文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值