如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线,所以,可以利用python脚本通过每天扫描网络中的在线设备。可以部署在服务器上做成定时任务,每天发送AAA巡检报告。
下面是我写的一个python练手小程序。用来扫描一个网段中的在线主机,并尝试AAA去登录。统计一个大网段内可以成功AAA登录的主机。
注意:
该程序只是测试小程序,还有些小错误需要解决。不是通用的程序。主要提供一个大致思路。
主要用到了python-nmap, paramiko库。
-
<李>利用nmap扫描一个指定网段,只做平扫描,所以前提所管理的设备中平必须开启。获取存活设备IP列表。李>
<李>利用paramiko库模拟ssh去登录个IP,如果登录成功,返回设备名称,并及将设备名称和对应的IP写入文件。
李>
代码示例:
# - * -编码:utf - 8 - * 进口nmap 进口日期时间 进口paramiko 进口再保险 def get_name(主机、用户名、口令、港口=22): 客户=paramiko.SSHClient () client.load_system_host_keys () client.set_missing_host_key_policy (paramiko.AutoAddPolicy ()) #客户端。连接(主机、端口、用户、密码allow_agent=False, look_for_keys=False,超时=5) 试一试: 客户端。连接(ip、端口、用户、密码allow_agent=False, look_for_keys=False,超时=3) 除了例外犯错: 返回0,str (err) #得到壳 ssh_shell=client.invoke_shell () dev_name=" 而真正的: 行=ssh_shell.recv (1024) 如果line.endswith (b '在'):#华为华三 dev_name=re.findall (r & lt;(. *)比的,str(线))[0] # dev_name=str(线)[3:2] 打破 如果线。endswith (b ' # ') | line.endswith (b ' # '): #思科 dev_name=re.findall (r ' [\ \ r \ \ n | \ \] + (. *) # ', str(线))[0] 打破 如果line.endswith (b的祝辞”): 如果“ConnetOS”str(线):#分流器 dev_name=re.findall (r ' [\ \ r \ \ n | \ \] +(. *)在“,str(线))[0].strip () 如果“@”str(线):# junpier防火墙 dev_name=re.findall (r @(. *)祝辞,str(线))[0].strip () 打破 #怎么跳出recv阻塞 ssh_shell.close () 返回1,dev_name #打印(“扫描时间:“+ res (“nmap”) (“scanstats”) (“timestr”) + ' \ n命令参数:' + res [' nmap '] [' command_line ']) def get_ip_list(主持人): 海里=nmap.PortScanner () # nmap填入参数列表可以填很多 res=nm。扫描(主机=主机参数=- sn pe) #数=res [' nmap '] [' scanstats '] [' uphosts '] #存活的主机数 返回列表(res(“扫描”). keys()) #存活主机IP地址 if __name__==癬_main__”: 开始=datetime.datetime.now () 用户=坝没А? 密码='密码' “主机=' 10.0.0.0/24 dev={} #存放AAA登录成功的主机 f=(“ip_list开放。txt”、“w”) #存放能ping通的IP ip_list=get_ip_list(主机) 结束=datetime.datetime.now () # f。写(“存活的IP地址有:”+ str (len (ip_list)) +“\ n”) # f。写(“程序运行时间:“+ str (end-start) + ' \ n ') 对ip ip_list: f。写(ip + ' \ n ') f.close () #打印(ip_list) login_failed_count=0 f1=(“login_succeed开放。txt”、“w”,编码=' utf - 8”) f2=(“login_failed开放。txt”、“w”,编码=' utf - 8”) f3=(“mtil_add开放。txt”、“w”,编码=' utf - 8”) # ip_list=ip_list.split (“\ n”) 对ip ip_list: 好的,dev_name=get_name (ip、用户密码) 如果好了==1: 如果dev_name不在dev.keys (): 供应商=" 打印(dev_name + " \ \ t " + ip) 如果“h”dev_name [-12]: 供应商=' h4c ' elif“c”dev_name [-12]: 供应商=八伎啤? elif dev_name“w”(-12年): 供应商=盎? 其他: 供应商=拔粗? f1。写(dev_name +‘\ \ t + ip +‘\ t +供应商+ ' \ n ') f1.flush () dev.update ({dev_name: ip}) 其他: f3。写(dev_name +‘\ \ t + str (dev [dev_name]) + ' ' + ip + ' \ n ') 打印(dev_name +‘\ \ t + str (dev [dev_name]) + ' ' + ip + ' \ n ') dev.update ({dev_name: (dev (dev_name)、ip)}) f3.flush () 其他: login_failed_count +=1 打印(dev_name) f2。写(dev_name +‘\ \ t + ip + ' \ n ') f2.flush () 结束=datetime.datetime.now () f1。写(“AAA登录成功' + str (len (dev)) +“台\ n”) f1。写(“AAA登录失败' + str (login_failed_count) +“台\ n”) f1。写(“程序运行时间:“+ str (end-start) + ' \ n ') f1.close () f2.close () f3.close () 打印(“程序运行时间:“+ str (end-start) + ' \ n ') 打印(“存活的IP地址有:”+ str (len (ip_list)) +“\ n”) 打印(“AAA登录成功:“+ str (len (dev)) +“\ n”) 打印(“AAA登录失败' + str (login_failed_count) +“台\ n”)python通过nmap扫描在线设备并尝试AAA登录(实例代码)