# _*_ coding:utf-8 _*_ """ __title__ = '网络设备配置文件备份' __author__ = 'Lucky' __date__ = '2018/08/23' """ from logging import warning from time import sleep,strftime,localtime from os import mkdir import telnetlib import paramiko class Telnet_Client: '''初始化登录参数,以及实例化telnet和ssh类''' def __init__(self,host_ip,username,password,port): self.telnet = telnetlib.Telnet() self.ssh = paramiko.SSHClient() self.host_ip = host_ip self.username = username self.password = password self.port = port def login_ssh_host(self): '''自动添加策略,保存服务器的主机名和公钥信息''' self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: self.ssh.connect(self.host_ip,self.port,self.username,self.password,timeout=8) print("\nssh(%s)连接成功." %self.host_ip) return True except: warning("\n网络(%s)连接失败!" %self.host_ip) input_string = input("\n请检查网络(%s)是否畅通[ssh]" %self.host_ip) return False def login_telnet_host(self): '''可能有些机器远程连接会连不上,这里做异常捕获''' try: self.telnet.open(self.host_ip,self.port,timeout=10) except: warning("\n网络(%s)连接失败!" %self.host_ip) input_string = input("\n请检查网络(%s)是否畅通[telnet]" % self.host_ip + "\n") return False else: ''' 这里用read_until方法进行匹配登录字符是否为login,是的话输入用户名,最多等待10秒 这里在强调一下telnet需要传入的内容为bytes,所以需要encode一下 ''' self.telnet.read_until(b'Username: ',timeout=10) self.telnet.write(self.username.encode('ascii') + b'\n') # 等待Password出现后输入密码,最多等待10秒 self.telnet.read_until(b'Password: ',timeout=10) self.telnet.write(self.password.encode('ascii') + b'\n') # 等待1秒给设备一个缓冲时间 sleep(1) # read_very_eager()获取上次程序执行的结果 last_command_result = self.telnet.read_very_eager().decode('ascii') # 判断上次结果是否有登录错误的 if 'Login incorrect' not in last_command_result: print('\ntelnet(%s)登录成功.' %self.host_ip) return True else: warning('\n登录(%s)失败,用户名或密码错误!' %self.host_ip) return False # 执行telnet命令 def execute_some_command(self, command_telnet_user, command_telnet_password, command_telnet_copy_to_ftp, command_telnet_to_ftp_1, command_telnet_to_ftp_2, command_telnet_to_ftp_3): str_time = strftime("%Y%m%d", localtime()) backup_cfg = self.host_ip + "_" + str_time + ".txt" # 执行传入的命令,这里也需要将传入的命令进行encode处理 self.telnet.write(command_telnet_user.encode('ascii') + b'\n') self.telnet.write(command_telnet_password.encode('ascii')) self.telnet.write(command_telnet_copy_to_ftp.encode('ascii')) self.telnet.write(command_telnet_to_ftp_1.encode('ascii')) self.telnet.write(command_telnet_to_ftp_2.encode('ascii')) try: self.telnet.write(backup_cfg.encode('ascii') + command_telnet_to_ftp_3.encode('ascii')) except Exception as e: print("telnet(%s)备份网络配置文件失败!" %self.host_ip) else: print("\ntelnet登录(%s)后网络配置文件备份成功." %self.host_ip) # 等待1秒给设备一个缓冲时间 sleep(1) # 获取命令执行结果 # exec_command_result = self.telnet.read_very_eager().decode('ascii') # print(exec_command_result) # 执行ssh命令 def execute_ssh_command(self,command): stdin, stdout, stderr = self.ssh.exec_command(command) # 等待1秒给设备一个缓冲时间 sleep(1) result = stdout.readlines() str_time = strftime("%Y%m%d", localtime()) # mkdir(str_time) with open(str_time + "\\" + self.host_ip + "_" + str_time + ".txt","w",encoding="utf-8") as result_ssh_obj: for line in result: try: result_ssh_obj.write(line.strip() + "\n") except Exception as e: print("备份(%s)设备上的网络配置文件失败,错误代码为:%s" %(self.host_ip,e)) else: print("\nssh登录(%s)后网络配置文件备份成功." %self.host_ip) # 退出telnet函数 def logout_telnet(self): self.telnet.write(b"exit\n") # 退出ssh函数 def logout_ssh(self): self.ssh.close() def main(): str_time = strftime("%Y%m%d", localtime()) mkdir(str_time) command_telnet_user = "enable\n" command_telnet_password = "123456\n" command_telnet_copy_to_ftp = "copy run tftp://192.168.2.2\n" command_telnet_to_ftp_1 = "\n" command_telnet_to_ftp_2 = "\n" command_telnet_to_ftp_3 = "\n" command_ssh = "show run" # ssh和telnet调用过程 with open('ssh_host.txt', 'r', encoding='utf-8') as ssh_obj, \ open('telnet_host.txt', 'r', encoding='utf-8') as telnet_obj: for ssh_ip in ssh_obj: # 根据类实例化一个ssh对象 ssh_client = Telnet_Client(ssh_ip.strip(), 'admin', '123456', '22') # 根据函数的返回值进行判断是否继续执行别的函数 if ssh_client.login_ssh_host(): ssh_client.execute_ssh_command(command_ssh) ssh_client.logout_ssh() for ip in telnet_obj: # 根据类实例化一个telnet对象 telnet_client = Telnet_Client(ip.strip(), 'admin', '123456', '23') # 根据函数的返回值进行判断是否继续执行别的函数 if telnet_client.login_telnet_host(): telnet_client.execute_some_command(command_telnet_user, command_telnet_password, command_telnet_copy_to_ftp, command_telnet_to_ftp_1, command_telnet_to_ftp_2, command_telnet_to_ftp_3) telnet_client.logout_telnet() if __name__ == '__main__': main()