@Python批量SSH交换机执行命令
Python批量SSH交换机执行命令
@Python批量SSH交换机执行命令
Paramiko_SSH
import os
import time
import gevent
from gevent import monkey
monkey.patch_all()
import paramiko
from openpyxl import load_workbook
class MultiSSH:
def __init__(self, ips, username, password, port=22, encoding='utf8', Echo=True):
'''
:param ips: 交换机IP地址[list]
:param username: ssh的用户名[str]
:param password: ssh的密码[str]
:param port: ssh的端口[int]
:param encoding: 返回值的解析编码,默认utf-8
:param Echo: 是否将返回值保存到txt,默认true
'''
self.ips = ips
self.username = username
self.password = password
self.port = port
self.encoding = encoding
self.Echo = Echo
def ExecuteCommand(self, ip, comands):
#执行命令的方法
try:
result = ''
connect = paramiko.SSHClient()
connect.set_missing_host_key_policy(paramiko.AutoAddPolicy())
connect.connect(hostname=ip, port=self.port, username=self.username, password=self.password,
allow_agent=False,
look_for_keys=False)
command = connect.invoke_shell()
time.sleep(1)
data = command.recv(65536).decode(self.encoding)
result += data
if '[Y/N]' in data:
command.send('N\n')
time.sleep(1)
for i in comands:
command.send(i + '\n')
time.sleep(1)
data = command.recv(65536).decode(self.encoding)
if data != "":
result += data
else:
time.sleep(1)
data = command.recv(65536).decode(self.encoding)
if data != "":
result += data
if 'Error:' not in result:
print('配置成功', ip)
Status='成功'
else:
print('配置完成但是命令存在报错', ip)
Status='完成-命令报错'
connect.close()
if not os.path.exists(os.getcwd()+r"\result"):
os.mkdir(os.getcwd()+r"\result")
with open(os.getcwd() + r'\result\{ip}--{Status}.txt'.format(ip=ip, Status=Status), 'w', encoding='utf8') as f:
f.write(result)
except Exception as e:
print('!!!配置失败', ip, e)
def RunCommand(self, comands):
#使用协程的方式批量执行效率更高
nodes = []
for i in self.ips:
nodes.append(gevent.spawn(self.ExecuteCommand, i, comands))
gevent.joinall(nodes)
@staticmethod
def get_txt(path, encoding='utf8'):
#定义一个工具方法,从txt读取内容
result = []
with open(path, 'r', encoding=encoding) as f:
for i in f.readlines():
data = i.strip()
if data != "":
result.append(i.strip())
return result
@staticmethod
def get_excel(path, point='A', sheet='Sheet1', index=2):
#定义一个工具方法,从xlsx读取内容,point为列值,sheet为表名,index为起始行值
work_book = load_workbook(path)
sheet = work_book[sheet]
result = []
for i in range(index, sheet.max_row + 1):
data = sheet[point + str(i)].value
if data != None and data != "":
result.append(data)
return result
if __name__ == '__main__':
# 通过txt方式读取交换机IP和配置的命令
ips = MultiSSH.get_txt(path=r'C:\Users\Administrator\Desktop\ip.txt')
multssh = MultiSSH(ips, username='username', password='password')
command = MultiSSH.get_txt(path=r'd:\交换机配置命令.txt')
multssh.RunCommand(command)
#通过xlsx的方式读取交换机的IP和配置的命令
ips2 = MultiSSH.get_txt(path=r'C:\Users\Administrator\Desktop\ip.xlsx', point='B')
commnd2 = MultiSSH.get_txt(path=r'd:\交换机配置命令.xlsx', point='A', index=1)
multssh.RunCommand(command)
文章介绍了一个使用Python和Paramiko库实现的批量SSH连接交换机并执行命令的方法,支持从txt和Excel文件读取IP和命令列表,提高了执行效率。

2796

被折叠的 条评论
为什么被折叠?



