python通过nmap扫描在线设备并尝试AAA登录(实例代码)

  

如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线,所以,可以利用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登录(实例代码)