说明
1、将所有设备信息写入文本文档。
简单地使用txt,将登录信息构建成字典。
2、初始化SSH连接和执行命令。
3、分析此需求指定的命令和输出结果。
将结果存储在文件中。
4、增加多线程执行。
提高效率。
5、添加Linux的crontab。
每小时收集一次信息(服务器配置)
实例
#!/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-statisticsinterfaceoutbound|in"^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基础教程