Python使用协程批量ssh交换机

文章介绍了一个使用Python和Paramiko库实现的批量SSH连接交换机并执行命令的方法,支持从txt和Excel文件读取IP和命令列表,提高了执行效率。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值