添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关于使用python批量操作网络设备,这里本人目前只接触了两个模块,netmiko和pratmiko,后面的脚本也都将基于这两个模块。

一、netmiko模块

1、使用netmiko模块连接操作设备

import netmiko #导入netmiko模块 import time #导入time模块 #使用with语句打开用于ssh连接所需要的相关信息(用户名,密码,ip地址,需要配置的命令),这个打开了两个文件用户信息文件,命令文件,分别命名为devices_file,cmd_file with open ( "ip_user_pass.txt" , "r" ) as devices_file , open ( "cmdlist.txt" , "r" ) as cmd_file : #将用户信息文件按行读取赋值给devices devices = devices_file . readlines ( ) #将命令文件按行读取赋值给cmdlist cmdlist = cmd_file . readlines ( ) #使用循环将用户名,密码,IP地址,分别赋值给username,password,ip_address变量,并依次登陆 for line in devices : line = line . strip ( "\n" ) ip_address = line . split ( "," ) [ 0 ] #split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串 username = line . split ( "," ) [ 1 ] password = line . split ( "," ) [ 2 ] #创建一个名为SW2的字典,该字典包含“device_type”“ip”“username”和“password”4个必选的键,如果设备类型是netmiko不支持的类型,不清楚还能不能连接 SW2 = { 'device_type' : 'huawei' , 'ip' : ip_address , 'username' : username , 'password' : password , connect = netmiko . ConnectHandler ( ** SW2 ) #函数ConnectHandler()。该函数用来实现SSH登录网络设备,是Netmiko最重要的函数。 print ( "Successfully connect to" + SW2 [ 'ip' ] ) #config_commands = ['dis arp'] #output = connect.send_config_set(config_commands) #rint(output) #使用循环将cmdlist中的命令依次输入 for cmd in cmdlist : output2 = connect . send_config_set ( cmd ) #send_config_set()则可向设备一次输入多个命令 print ( output2 ) time . sleep ( 1 ) print ( "*" * 50 + "分割线" + "*" * 50 ) #result = connect.send_command('dis int LoopBack 0') #print(result)

脚本运行结果如下:

2、ssh_netmiko_多线程

使用netmiko实现多线程操作网络设备

#coding=utf-8
import threading        #Python 3已经内置了threading模块来实现多线程,这里引入
from queue import Queue   #多线程中需要用的队列,这里引入,多线程中需要用的队列,这里引入,通过队列传递数据,安全,不会造成多个线程访问时混乱
import netmiko
import time
#定义连接函数,使用netmiko连接设备,并输入预定义命令
def ssh_session(ip, username, password,cmdlist, output_q):
    SW2 = {
        'device_type': 'huawei',
        'ip': ip_address,
        'username': username,
        'password': password,
    connect = netmiko.ConnectHandler(**SW2)
    print("Successfully connect to" + SW2['ip'])
    config_commands = ['dis arp', 'dis ip routing-table', 'dis int brief']
    output = connect.send_config_set(config_commands)
    print(output)
    print("*" * 50 + "分割线" + "*" * 50)
    for cmd in cmdlist:
        output = connect.send_config_set(cmd)
        print(output)
        time.sleep(1)
        print("*" * 50 + "分割线" + "*" * 50)
    #result = connect.send_command('dis int LoopBack 0')
    #print(result)
print("程序于 {} 开始执行\n".format(time.strftime("%X")))
threads = []
with open("ip_user_pass.txt", "r") as devices_file, open("cmdlist.txt", "r") as cmd_file:
    devices = devices_file.readlines()
    cmdlist = cmd_file.readlines()
    for line in devices:
        line = line.strip("\n")
        ip_address = line.split(",")[0]   #split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
        username = line.split(",")[1]
        password = line.split(",")[2]
        #使用threading的Thread()函数为ssh_session函数创建一个线程并将它赋值给变量t,注意Thread()函数的target参数对应的是函数名称(即ssh_session)
        #args对应的是该ssh_session函数的参数
        t = threading.Thread(target=ssh_session, args=(ip_address, username, password, cmdlist, Queue()))
        t.start()
        threads.append(t)
for i in threads:
    i.join()    #threading的join()方法的作用是强制阻塞调用它的线程,直到该线程运行完毕或者终止(类似单线程同步)
print("程序于 {} 执行结束\n".format(time.strftime("%X")))

脚本缺少错误控制加入try语句,可以更好的应用脚本,不会因为地址和用户名密码错误导致脚本中断,另外关于脚本里的使用了队列实现线程控制,但是为什么要写成这个形式

t = threading.Thread(target=ssh_session, args=(ip_address, username, password, cmdlist, Queue())),目前我还不太了解。希望知道原理的大大能告诉我一下~

二、prarmiko模块

1、使用prarmiko模块连接网络设备操作(连接协议ssh)

需在命令行运行程序,并给四个文件参数,存放ip的文件在前,存放命令的文件在后,例如:python lab3_1.py ip.txt cmdlist.txt username.txt password.txt import paramiko import time import getpass import sys import socket #username = input("username:") #password = getpass.getpass("password:") ip_file = sys.argv[1] #sys.argv[]就是一个从程序外部获取参数的桥梁,外部取得的参数可以是多个,所以获得的是一个列表(list),其第一个元素是程序本身,随后才依次是外部给予的参数, cmd_file = sys.argv[2] #这里使用sys.argv(),即将保存的ip和命令的文件作为参数赋值给变量 user_file = sys.argv[3] pass_file = sys.argv[4] switch_with_authentication_issue = [] #认证失败的列表,用于存放用户认证失败的IP地址 switch_not_reachable = [] #连接失败的列表,用于存放连接失败的ip地址 #打开文件用户信息文件,IP地址文件 iplist = open(ip_file, "r") userlist = open(user_file, "r") passlist = open(pass_file, "r") #使用循环按行读取,文件内容,这个用zip() 函数将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象 #例如: 192.168.1.1 admin 123 for line1, line2, line3 in zip(iplist.readlines(), userlist.readlines(), passlist.readlines()): try: ip = line1.strip() username = line2.strip() password = line3.strip() ssh_client = paramiko.SSHClient() #调用paramiko的SSHClient方法连接网络设备,及本地设备为客户端 默认情况下,Paramiko会拒绝任何未知的SSH公钥(publickey),这里我们需要使用ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 来让Paramiko接受SSH服务端(也就是SW3)提供的公钥,这是任何时候使用Paramiko都要用到的标准配置。 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip, username=username, password=password) #调用connect()方法,输入连接设备所需的ip,用户名,密码 print("登录成功", ip) command = ssh_client.invoke_shell() #调用Paramiko.SSHClient()的invoke_shell()方法来唤醒shell cmdlist = open(cmd_file, "r") #读入命令文件 cmdlist.seek(0) #seek() 方法用于移动文件读取指针到指定位置,参数为0代表从文件开头开始算起。 for line in cmdlist.readlines(): command.send(line + "\n") time.sleep(5) cmdlist.close() output = command.recv(65535) print(output.decode("ascii")) except paramiko.ssh_exception.AuthenticationException: print("用户认证失败:" + ip) switch_with_authentication_issue.append(ip) except socket.error: print(ip + "连接失败") switch_not_reachable.append(ip) iplist.close() userlist.close() passlist.close() ssh_client.close print("*" * 50 + "分割线" + "*" * 50) print("\n用户认证失败的交换机:\n") for i in switch_with_authentication_issue: print(i) print("\n网络连接失败交换机:\n") for i in switch_not_reachable: print(i)

三、配置文件备份

1、使用netmiko备份,用于备份netmiko支持的设备,使用h3c设备测试此脚本,备份失败

import netmiko
import time
with open("devices.txt") as devices_file:
    devices = devices_file.readlines()
    for line in devices:
        line = line.strip("\n")
        ipaddr = line.split(",")[0]   #split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
        username = line.split(",")[1]
        password = line.split(",")[2]
        vendor = line.split(",")[3]
SW2 = {
    'device_type': vendor,
    'ip': ipaddr,
    'username': username,
    'password': password,
now = time.strftime("%Y-%m-%d", time.localtime())
connect = netmiko.ConnectHandler(**SW2)
print("Successfully connect to" + SW2['ip'])
backup_cfg = connect.send_command("dis cur")    #将命令内容赋值给变量
print(backup_cfg)
#将变量的值写入文件,文件命名按时间划分
with open( "C:\\ftp\\交换机_"  + str(now) + "_{}.txt".format(ipaddr), "w") as f:
    f.write(backup_cfg)

H3C备份失败原因:netmiko模块在huawei的连接中有取消分屏显示功能的命令,而H3C设备没有,华为设备的取消分屏显示功能可以针对用户设置,而且是临时。举个例子:一个user用户登录华为设备后执行取消分屏显示命令后对设备中其他用户没影响(其他用户还是分屏显示),当user用户退出ssh的时候该用户的分屏显示功能会自动恢复,就像定义了:进入自己家目录的环境一样方便强大。而H3C网络设备的分屏显示针对的是全局设备,而且并不是进入、退出环境那样临时性生效一样。那么如何解决这种坑呢,经过多次网上查找和多次测试,终于完美实现一次性显示完整的输出大量信息。(转载于https://blog.51cto.com/chier11/2398299?source=dra)

import netmiko
import time
with open("devices.txt") as devices_file:
    devices = devices_file.readlines()
    for line in devices:
        line = line.strip("\n")
        ipaddr = line.split(",")[0]   #split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
        username = line.split(",")[1]
        password = line.split(",")[2]
        vendor = line.split(",")[3]
SW2 = {
    'device_type': vendor,
    'ip': ipaddr,
    'username': username,
    'password': password,
now = time.strftime("%Y-%m-%d", time.localtime())
connect = netmiko.ConnectHandler(**SW2)
print("Successfully connect to" + SW2['ip'])
backup_cfg = connect.send_command("dis cur")    #将命令内容赋值给变量
if "---- More ----" in backup_cfg:
	backup_cfg += connect.send_command_timing('            \n', strip_prompt=False, strip_command=False, normalize=False)
            #遇到more,就多输入几次个空格,normalize=False表示不取消命令前后空格。
output = backup_cfg.split("\n")
print (output)
#将变量的值写入文件,文件命名按时间划分
with open( "C:\\交换机_"  + str(now) + "_{}.txt".format(ipaddr), "w") as f:
    f.write(backup_cfg)

2、使用prarmiko,基于tftp备份配置文件

首先要搭建一个tftp服务器,使用tftp相关软件即可

其次运行脚本

import paramiko
import time
with open("ip_user_pass.txt") as devices_file:
    devices = devices_file.readlines()
    for line in devices:
        line = line.strip("\n")
        ip_address = line.split(",")[0]   #split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
        username = line.split(",")[1]
        password = line.split(",")[2]
        now = time.strftime("%Y-%m-%d", time.localtime())
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname=ip_address, username=username, password=password)
        print("登陆成功:",ip_address)
        command = ssh_client.invoke_shell()
        command.send("copy startup.cfg {}_{}.cfg\n".format(now,ip_address))
        command.send("y\n")
        command.send("tftp 192.168.134.222 put {}_{}.cfg\n".format(now,ip_address))
        time.sleep(15)
        command.send("delete  {}_{}.cfg\n".format(now,ip_address))
        command.send("y\n")
        time.sleep(5)
        output = command.recv(65535)
        print(output.decode("ascii"))
    ssh_client.close

3、使用prarmiko,基于sftp备份配置文件
首先配置网络设备(H3C)为sftp服务器端

from os import chmod
import paramiko
import time
import socket
switch_with_authentication_issue = []   #认证失败的列表,用于存放用户认证失败的IP地址
switch_not_reachable = []               #连接失败的列表,用于存放连接失败的ip地址
with open("ip_user_pass.txt") as devices_file:
    devices = devices_file.readlines()
    for line in devices:
        try:
            line = line.strip("\n")
            ip_address = line.split(",")[0]   #split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
            username = line.split(",")[1]
            password = line.split(",")[2]
            ssh_client = paramiko.SSHClient()
            ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh_client.connect(hostname=ip_address, username=username, password=password)
            print("登陆成功:",ip_address)
            command = ssh_client.invoke_shell()
            command.send("sftp server enable\n")
            command.send("local-user client002\n")
            command.send("password simple aabbcc\n")
            command.send("service-type ssh\n")
            command.send("quit\n")
            command.send("ssh user client002 service-type sftp authentication-type password\n")
            command.send("save")
            command.send("y\n")
            time.sleep(5)
            output = command.recv(65535)
            print(output.decode("ascii"))
        except paramiko.ssh_exception.AuthenticationException:
            print("用户认证失败:" + ip_address)
            switch_with_authentication_issue.append(ip_address)
        except socket.error:
            print("连接失败:" + ip_address)
            switch_not_reachable.append(ip_address)
    ssh_client.close
print("*" * 50 + "分割线" + "*" * 50)
print("\n用户认证失败的交换机:\n")
for i in switch_with_authentication_issue:
    print(i)
print("\n网络连接失败交换机:\n")
for i in switch_not_reachable:
    print(i)
def sftp_get(ip, user, pwd, local_file,remote_file, port=22):
    try:
        t = paramiko.Transport(ip, port)
        t.connect(username=user, password=pwd)
        sftp = paramiko.SFTPClient.from_transport(t)
        sftp.get(remote_file, local_file)
        t.close()
    except Exception as e:
        print(e)
def sftp_put(ip, user, pwd, local_file, remote_file, port=22):
    try:
        t = paramiko.Transport(ip, port)
        t.connect(username=user, password=pwd)
        sftp = paramiko.SFTPClient.from_transport(t)
        sftp.put(local_file, remote_file)
        t.close()
    except Exception as e:
        print(e)
if __name__ == '__main__':
    不要运行的,请注释掉,前面加'#'符号
    ip = '192.168.0.101'
    user= 'admin'
    pwd= 'Admin@123'
    local_file = r"D:\test\123.txt"
    remote_file = "flash:/vrpcfg.zip"
    sftp_get(ip='192.168.0.200', user=user, pwd=pwd, remote_file=remote_file, local_file=r'D:\test\vrpcfg.zip')
    # sftp_put(ip='192.168.0.200', user=user, pwd=pwd, local_file=local_file, remote_file='flash:/123.txt')
                    关于使用python批量操作网络设备,这里本人目前只接触了两个模块,netmiko和pratmiko,后面的脚本也都将基于这两个模块。一、netmiko模块1、使用netmiko模块连接操作设备import netmiko          #导入netmiko模块import time             #导入time模块#使用with语句打开用于ssh连接所需要的相关信息(用户名,密码,ip地址,需要配置的命令),这个打开了两个文件用户信息文件,命令文件,分别命名为devices_
				
最近在学习Python语言,想着通过一些实际应用来学习可以回事理解,所以想到批量配置管理企业内部的思科交换机python是一门解释性语言比较高级有很多的基础库和第三方开发库,现在开发环境也比较热门。 环境:centos7客户端 + 思科cisco交换机 目的:批量管理配置交换机,先将所有交换机通过telnet开启配置ssh,而后通过ssh方式远程批量管理交换机.【遇到故障交换机跳过执行下...
由于公司交换机都是华为S5700系列的交换机,前一段时间,由于放假时间比较长,所以对公司的交换机配置进行了备份,由于之前考虑不周,导致花费了大量的时间对每一台交换机都进行手动备份,实在太浪费时间了。鉴于此,抽空用python做了一个批量备份的工具,顺带添加了一个批量密码核对的功能。 说明:此工具只针对华为S5700系列交换机(Telnet方式);若其它类型、型号及SSH方式的交换机需要根据实际情况进行代码修改方可使用。 测试账号:huawei 测试密码:所有交换机测试密码均为hua.
class Network_ssh(object): def __init__(self, device, host, username, password, port, command): self.device = device self.host = host self.username = username self.password = password self.port = port self.command = comman 最近一直在研究如何使用python网络设备进行配置文件备份,经过半天的研究终于实现对几十台交换机进行自动备份。 准备工作: 1.python环境搭建,我使用的是python3.9和pycharm; 2.安装os、netmiko、 time、re、multiprocessing.dummy模块; 3.准备一个放IP地址的文本文件,我这里用的是ip.txt; 4.SecureCRT.exe用来登陆设备分析参数。 import os from netmiko import ConnectHa client = paramiko.SSHClient() The authenticity of host '172.25.254.254 (172.25.254.254)' can't be established. ECDSA key fingerprint... Python 是一种高级编程语言,可以用于自动化任务,在配置 Cisco 交换机时也可以使用 Python批量配置。 首先,我们需要安装必要的 Python 模块,如 Paramiko 和 Netmiko,这些模块可以帮助我们建立 SSH 连接并发送命令。 接下来,我们需要编写 Python 脚本来批量配置 Cisco 交换机。可以将交换机的 IP 地址、用户名和密码等信息存储在一个文件中,然后使用 Python 读取这些信息并建立 SSH 连接。 在连接建立后,我们可以使用 Netmiko 提供的方法来发送配置命令。可以通过编写一个循环来遍历每个交换机的配置信息,并在每个交换机上执行特定的命令来对其进行配置。例如,可以使用命令行模式下的 "config terminal" 进入交换机的配置模式,然后发送一系列的命令来配置 VLAN、端口、IP 地址等设置。 脚本的最后一步是关闭 SSH 连接,并在操作完成后打印出执行结果。这样,我们就可以通过运行这个 Python 脚本来批量配置多个 Cisco 交换机了。 总的来说,Python 是一种功能强大的编程语言,可以方便地批量配置 Cisco 交换机。通过使用 Paramiko 和 Netmiko 这样的 Python 模块,我们可以实现 SSH 连接和命令发送。这种自动化的方法可以节省时间和精力,并确保交换机的一致性配置。 ### 回答2: Python是一种强大的编程语言,可以用于大规模自动化配置CISCO交换机使用Python编写一个脚本来批量配置CISCO交换机可以大大提高配置的效率和准确性。 首先,我们需要安装Python网络设备操作库,如Netmiko,Paramiko或NAPALM。它们使Python能够通过SSH或Telnet与CISCO交换机进行通信并执行命令。 接下来,我们可以通过读取一个文本文件来获取要配置的CISCO交换机的IP地址、用户名和密码等信息。例如,我们可以将这些信息存储在一个名为"devices.txt"的文本文件中,每行一个设备,包括设备IP地址、用户名和密码。 在脚本中,我们可以使用循环来迭代读取设备信息,并针对每个设备进行配置。 我们可以使用以下代码来连接CISCO交换机并执行配置命令: from netmiko import ConnectHandler # 读取设备信息 with open('devices.txt', 'r') as file: devices = file.readlines() # 迭代配置每个设备 for device in devices: # 拆分设备信息 ip, username, password = device.strip().split(',') # 根据设备类型,创建设备字典 device_dict = { 'device_type': 'cisco_ios', 'ip': ip, 'username': username, 'password': password, # 连接设备 connection = ConnectHandler(**device_dict) # 执行配置命令 connection.send_config_from_file('cisco_config.txt') # 保存配置更改 connection.save_config() # 断开连接 connection.disconnect() 在上述代码中,我们使用`netmiko`库中的`ConnectHandler`类来连接CISCO交换机。我们首先读取设备信息,然后通过迭代每个设备来连接并执行配置命令。在这个例子中,我简单地从一个名为"cisco_config.txt"的文件中读取配置命令,你可以根据实际需求修改。 通过运行这个脚本,我们可以批量配置CISCO交换机,从而节省时间和精力,提高工作效率。 CSDN-Ada助手: 非常棒的博客!感谢分享Docker中搭建FTP服务器的经验。我们期待看到更多关于Docker的技术博客。作为进一步学习和探索Docker的推荐,我们建议您写一篇博客,介绍如何在Docker中安装和使用Nginx服务器。期待您的新作品! 2023年博客之星「城市赛道」年中评选已开启(https://activity.csdn.net/creatActivity?id=10470&utm_source=blog_comment_city ), 博主的原力值在所在城市已经名列前茅,持续创作就有机会成为所在城市的 TOP1 博主(https://bbs.csdn.net/forums/blogstar2023?typeId=3152981&utm_source=blog_comment_city),更有丰厚奖品等你来拿~。 如何使用 testdisk 恢复已删除的文件 黄金大师傅: 估计是你的磁盘上的数据已经被覆盖过了 如何使用 testdisk 恢复已删除的文件 JUST_DOING_GOD: 大佬,为啥我用testdisk恢复的文件没有内容啊表情包 关于使用python批量操作网络设备(交换机,路由器)的知识点小结 zrover126: 运行后提示错误:D:\Anaconda3\python.exe C:/Users/root/PycharmProjects/pythonProject6/单线程.py Traceback (most recent call last): File "C:/Users/root/PycharmProjects/pythonProject6/单线程.py", line 14, in <module> username = line.split(",")[1] IndexError: list index out of range iptables,firewalld防火墙知识再回顾 大家一起学编程(python): 遇到好文章,我就是要评论,嘿,就是玩