关于使用python批量操作网络设备,这里本人目前只接触了两个模块,netmiko和pratmiko,后面的脚本也都将基于这两个模块。
一、netmiko模块
1、使用netmiko模块连接操作设备
import
netmiko
import
time
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
]
username
=
line
.
split
(
","
)
[
1
]
password
=
line
.
split
(
","
)
[
2
]
SW2
=
{
'device_type'
:
'huawei'
,
'ip'
:
ip_address
,
'username'
:
username
,
'password'
:
password
,
connect
=
netmiko
.
ConnectHandler
(
**
SW2
)
print
(
"Successfully connect to"
+
SW2
[
'ip'
]
)
for
cmd
in
cmdlist
:
output2
=
connect
.
send_config_set
(
cmd
)
print
(
output2
)
time
.
sleep
(
1
)
print
(
"*"
*
50
+
"分割线"
+
"*"
*
50
)
脚本运行结果如下:
2、ssh_netmiko_多线程
使用netmiko实现多线程操作网络设备
import threading
from queue import Queue
import netmiko
import time
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)
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]
username = line.split(",")[1]
password = line.split(",")[2]
t = threading.Thread(target=ssh_session, args=(ip_address, username, password, cmdlist, Queue()))
t.start()
threads.append(t)
for i in threads:
i.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
ip_file = sys.argv[1]
cmd_file = sys.argv[2]
user_file = sys.argv[3]
pass_file = sys.argv[4]
switch_with_authentication_issue = []
switch_not_reachable = []
iplist = open(ip_file, "r")
userlist = open(user_file, "r")
passlist = open(pass_file, "r")
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会拒绝任何未知的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)
print("登录成功", ip)
command = ssh_client.invoke_shell()
cmdlist = open(cmd_file, "r")
cmdlist.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]
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]
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)
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]
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 = []
switch_not_reachable = []
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]
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')
关于使用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助手:
如何使用 testdisk 恢复已删除的文件
黄金大师傅:
如何使用 testdisk 恢复已删除的文件
JUST_DOING_GOD:
关于使用python批量操作网络设备(交换机,路由器)的知识点小结
zrover126:
iptables,firewalld防火墙知识再回顾
大家一起学编程(python):