说明
1、将所有设备信息写入文本文档。
简单地使用txt,将登录信息构建成字典。
2、SSH连接和执行命令的初始化。
3、分析本需求指定的命令和输出结果。
将结果存储在文件中。
4、增加多线程执行。
提高效率。
5、crontab添加Linux。
每小时收集一次信息(服务器配置)
实例
#!/usr/bin/envpython #-*-coding:utf-8-*- importre importtime fromconcurrent.futuresimportThreadPoolExecutor importparamiko defget_device_list(filename): """读取文本文件中的设备列表,返回由字典组成的列表。 文本内容格式如下:ip,用户名、密码、别名,如: 1.1.1.1adminadminsw1 1.1.1.2adminadminsw2 ... Args: filename([str]):文件名称 """ withopen(filename,'r')asf: device_list=[] forlineinf.readlines(): ip,username,password,name=line.strip().split() device_list.append( { "ip":ip, "username":username, "password":password, "name":name, } ) returndevice_list classNetworkDevice(object): def__init__(self,ip="",username="",password="'",name="",port=22,): self.conn=None ifip: self.ip=ip.strip() elifname: self.name=name.strip() else: raiseValueError("要求设备连接地址(IP或别名)") self.port=int(port) self.username=username self.password=password self._open_ssh() def_open_ssh(self): """SSH连接的初始化,调动模拟终端,可以在会话结束前执行命令。 Raises: e:抛出paramiko连接失败的任何异常 """ ssh_connect_params={ "hostname":self.ip, "port":self.port, "username":self.username, "password":self.password, "look_for_keys":False, "allow_agent":False, "timeout":5,#TCP连接超时间 } conn=paramiko.SSHClient() conn.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: conn.connect(**ssh_connect_params) exceptExceptionase: raisee self.conn=conn.invoke_shell(term="vt100",width=500,height=1000) return"" defexec_cmd(self,cmd,recv_time=3): """登录设备,执行命令 Args: cmd([type]):命令字符串 recv_time(int,optional):超时时间读取回显信息.defaultsto3. Raises: EOFError:没有信息输出,说明连接失败。 Returns: output: """ cmd=cmd.strip()+"\n" self.conn.sendall("screendisable\n") self.conn.sendall(cmd) time.sleep(int(recv_time)) output=self.conn.recv(1024*1024) iflen(output)==0: raiseEOFError("可能会关闭连接,没有信息输出") returnoutput.decode('utf-8','ignore') dev={ "ip":"192.168.56.21", "username":"netdevops", "password":"Admin@h3c.com", "name":"sw1" } #sw1=NetworkDevice(**dev) #ret=sw1.exec_cmd("disversion") #print(ret) defparse_interface_drop(output): """将设备输出队列的丢包信息分析成累加值 命令和输出示例如下: #[H3C]disqosqueue-statisticsinterfaceoutbound|||in"^Drop" #Dropped:0packets,0bytes """ ptn=re.compile(r"\s(\S+):\s+(\d+)\s+(\S+),\s+(\d+)\s+(\S+)") count=0 foriinptn.findall(output): count+=int(i[1]) returncount defrun(cmd,**conn_parms): """登录单台设备,执行指定命令,对丢包统计进行分析 """ sw=NetworkDevice(**conn_parms) output=sw.exec_cmd(cmd) drop_count=parse_interface_drop(output) return"%s%s%s"%( conn_parms.get("name"), conn_parms.get("ip"), drop_count) #cmd=r'disqosqueue-statistinterfaceoutboundin"^Drop"' #ret=run(cmd,**dev) #print(ret) if__name__=="__main__": """获取设备列表,使用多线程登录设备获取信息并返回 """ withThreadPoolExecutor(10)aspool: futures=[] cmd=r'disqosqueue-statisticsinterfaceoutbound|||in"^Drop"' dev_info=get_device_list("./iplist.txt") fordindev_info: future=pool.submit(run,cmd,**d) futures.append(future) #forfinfutures: #print(f.result()) #根据执行时间将结果写入文件,精确到小时 withopen("./drops/%s.log"%time.strftime("%Y%m%d_%H"),'w')asf: forlineinfutures: f.write(line.result()+"\n")
以上是python 希望Paramiko的SSH用法对大家有所帮助。更多Python学习指导:python基础教程
本文教程操作环境:windows7系统Python 3.9.1,DELL G3电脑。