Python网络设备批量配置脚本详解与解析

目录

  1. 脚本概述

  2. 代码解析

  3. 导入模块

  4. 日志配置

  5. 核心函数config_device

  6. 主程序逻辑

  7. 使用说明

  8. 脚本优化建议

  9. 完整代码

脚本概述

这是一个使用Python编写的网络设备批量配置脚本,主要功能是通过SSH协议批量登录多台网络设备(如路由器、交换机等),并执行预定义的配置命令。脚本采用了多线程技术,可以同时管理多台设备,大大提高了批量操作的效率。

代码解析

导入模块

import paramiko
import getpass
import logging
import time
from concurrent.futures import ThreadPoolExecutor
  • paramiko: 用于实现SSH协议的Python库,提供SSH客户端功能

  • getpass: 安全获取用户输入的密码(虽然本脚本中未直接使用)

  • logging: Python标准日志模块,用于记录操作日志

  • time: 提供时间相关功能,这里主要用于命令执行间隔

  • ThreadPoolExecutor: 来自concurrent.futures模块,实现线程池功能

  • 日志配置

    logging.basicConfig(
        filename='network_ops.log',
        level=logging.INFO,
        format='%(asctime)s-%(levelname)s-%(message)s'
    )

    配置日志系统:

  • 日志输出到文件network_ops.log

  • 日志级别为INFO(记录一般操作信息)

  • 日志格式包含时间戳、日志级别和消息内容

  • 核心函数config_device

    def config_device(ip,username,password,commands):
        try:
            client=paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect(hostname=ip,username=username,password=password,timeout=10)
            logging.info(f'Successfully connected to {ip}')
            shell=client.invoke_shell()
            for cmd in commands:
                shell.send(cmd+'\n')
                time.sleep(1)
            output=shell.recv(65535).decode('utf-8')
            logging.info(f'{ip} output:\n{output}')
        except Exception as e:
            logging.error(f'{ip} failed:{str(e)}')
        finally:
            client.close()

    函数功能解析:

    1. 创建SSHClient对象并设置自动添加主机密钥策略

    2. 连接目标设备(IP、用户名、密码),设置10秒超时

    3. 获取交互式shell会话

    4. 循环发送每条命令,每条命令间隔1秒

    5. 接收命令输出并记录到日志

    6. 异常处理:记录连接或执行失败的原因

    7. 最终确保SSH连接被关闭

    主程序逻辑

    if __name__=='__main__':
        username=input('username:')
        password=getpass.getpass('password:')
        with open(r'C:\Users\23608\Desktop\ipadd_python.txt','r')as f:
            ips=[line.strip() for line in f.readlines()]
        with open(r'C:\Users\23608\Desktop\cmd_file.txt','r')as f:
            commands=[line.strip() for line in f.readlines()]
        with ThreadPoolExecutor(max_workers=5) as excutor:
            for ip in ips:
                excutor.submit(config_device,ip,username,password,commands)

    执行流程:

    1. 获取用户名和密码

    2. 从两个文本文件读取:

    3. ipadd_python.txt: 存储设备IP地址列表

    4. cmd_file.txt: 存储要执行的命令列表

    5. 创建最大5个线程的线程池

    6. 为每个IP提交一个配置任务到线程池

    使用说明

    1. 准备两个文本文件:

    2. ipadd_python.txt: 每行一个设备IP地址

    3. cmd_file.txt: 每行一条要执行的命令

    4. 运行脚本,输入设备的用户名和密码

    5. 查看network_ops.log文件获取执行结果

    完整代码

    import paramiko
    import getpass
    import logging
    import time
    from concurrent.futures import ThreadPoolExecutor
    
    logging.basicConfig(
        filename='network_ops.log',
        level=logging.INFO,
        format='%(asctime)s-%(levelname)s-%(message)s'
    )
    
    def config_device(ip,username,password,commands):
        try:
            client=paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect(hostname=ip,username=username,password=password,timeout=10)
            logging.info(f'Successfully connected to {ip}')
            shell=client.invoke_shell()
            for cmd in commands:
                shell.send(cmd+'\n')
                time.sleep(1)
            output=shell.recv(65535).decode('utf-8')
            logging.info(f'{ip} output:\n{output}')
        except Exception as e:
            logging.error(f'{ip} failed:{str(e)}')
        finally:
            client.close()
    
    if __name__=='__main__':
        username=input('username:')
        password=getpass.getpass('password:')
        with open(r'C:\Users\23608\Desktop\ipadd_python.txt','r')as f:
            ips=[line.strip() for line in f.readlines()]
        with open(r'C:\Users\23608\Desktop\cmd_file.txt','r')as f:
            commands=[line.strip() for line in f.readlines()]
        with ThreadPoolExecutor(max_workers=5) as excutor:
            for ip in ips:
                excutor.submit(config_device,ip,username,password,commands)

    作者:士别三日。

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python网络设备批量配置脚本详解与解析

    发表回复