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


Posted in Python onDecember 30, 2019

如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线。所以,可以利用python脚本通过每天扫描网络中的在线设备。可以部署在服务器上做成定时任务,每天发送AAA巡检报告。

下面是我写的一个python练手小程序。用来扫描一个网段中的在线主机,并尝试AAA去登录。统计一个大网段内可以成功aaa登录的主机。

注意:

该程序只是测试小程序,还有些小bug需要解决。不是通用的程序。主要提供一个大致思路。

主要用到了python-nmap, paramiko库。

程序大概思路:

  • 利用nmap扫描一个指定网段,只做ping扫描,所以前提所管理的设备中ping必须开启。获取存活设备IP列表。
  • 利用paramiko库模拟ssh去登录个IP,如果登录成功,返回设备名称,并及将设备名称和对应ip写入文件。

代码示例:

# -*- coding: utf-8 -*-

import nmap 
import datetime
import paramiko
import re

def get_name(host, user, password, port=22):
  client = paramiko.SSHClient()
  client.load_system_host_keys()
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  #client.connect(host, port, user, password, allow_agent=False, look_for_keys=False, timeout=5)
  try:
    client.connect(ip, port, user, password, allow_agent=False, look_for_keys=False, timeout=3)
  except Exception as err:
    return 0, str(err)
  #get shell
  ssh_shell = client.invoke_shell()

  dev_name = ''
  while True:
    line = ssh_shell.recv(1024)
    if line.endswith(b'>'):#华为 华三
      dev_name = re.findall(r'<(.*)>', str(line))[0]
      #dev_name = str(line)[3:-2]
      break
    if line.endswith(b'# ') | line.endswith(b'#'): #思科
      dev_name = re.findall(r'[\\r\\n|\\r]+(.*)#', str(line))[0]
      break
    if line.endswith(b'> '): 
      if 'ConnetOS' in str(line):#分流器
        dev_name =re.findall(r'[\\r\\n|\\r]+(.*)>', str(line))[0].strip()
      if '@' in str(line): #junpier防火墙
        dev_name =re.findall(r'@(.*)>', str(line))[0].strip()
      break
  #怎么跳出recv阻塞
  ssh_shell.close()
  return 1, dev_name


#print('扫描时间:'+res['nmap']['scanstats']['timestr']+'\n命令参数:'+res['nmap']['command_line'])

def get_ip_list(hosts):
  nm = nmap.PortScanner()
  #nmap填入参数列表可以填很多
  res = nm.scan(hosts=hosts, arguments='-sn -PE')
  #count = res['nmap']['scanstats']['uphosts'] #存活的主机数
  return list(res['scan'].keys()) #存活主机IP地址

    
if __name__ == '__main__':
  start = datetime.datetime.now()
  user = 'user'
  password = 'password'
  hosts = '10.0.0.0/24'
  dev = {} #存放AAA登录成功的主机
  f = open('ip_list.txt', 'w') #存放能ping通的IP
  ip_list = get_ip_list(hosts) 
  end = datetime.datetime.now()
  #f.write("存活的IP地址有:" + str(len(ip_list)) + "\n")
  #f.write("程序运行时间:" + str(end-start) + '\n')
  for ip in ip_list:
    f.write(ip + '\n')
  f.close()
  #print(ip_list)
  login_failed_count = 0
  f1 = open('login_succeed.txt', 'w', encoding='utf-8')
  f2 = open('login_failed.txt', 'w', encoding='utf-8')
  f3 = open('mtil_add.txt', 'w', encoding='utf-8')
  #ip_list = ip_list.split('\n')
  for ip in ip_list:
    ok, dev_name = get_name(ip, user, password)
    if ok == 1:
      if dev_name not in dev.keys():
        vendor = '' 
        print(dev_name + "\t\t" + ip)
        if 'h' in dev_name[-12:]:
          vendor = 'h3c'
        elif 'c' in dev_name[-12:]:
          vendor = 'cisco'
        elif 'w' in dev_name[-12:]:
          vendor = 'huawei'
        else:
          vendor = 'unknow'
        f1.write(dev_name + '\t\t' + ip + '\t' + vendor + '\n')
        f1.flush()
        dev.update({dev_name : ip})
      else:
        f3.write(dev_name + '\t\t' + str(dev[dev_name]) + ' ' + ip +'\n')
        print(dev_name + '\t\t' + str(dev[dev_name]) + ' ' + ip +'\n')
        dev.update({dev_name: [dev[dev_name] , ip]})
        f3.flush()
    else:
      login_failed_count += 1
      print(dev_name)
      f2.write(dev_name + '\t\t' + ip + '\n')
      f2.flush()
  end = datetime.datetime.now()
  f1.write('AAA登录成功' + str(len(dev)) +'台\n' )
  f1.write('AAA登录失败' + str(login_failed_count) +'台\n' )
  f1.write("程序运行时间:" + str(end-start) +'\n')
  f1.close()
  f2.close()
  f3.close()
  
  print("程序运行时间:" + str(end-start) +'\n')
  print("存活的IP地址有:" + str(len(ip_list)) + "\n")
  print("AAA登录成功:" + str(len(dev)) + "\n")
  print('AAA登录失败' + str(login_failed_count) +'台\n')

这个小程序例子,只是一个大概思路。

可以添加或则改善的思路:

  • 比想要获取设备名,可以通过snmp,知道ip地址和snmp读团体名就可以直接获取。
  • 可以将获取到的数据存入数据库中,从而可以做更的事情。
  • 通过类似代码,也可以实现每天去设备上备份网络配置等功能。
  • 可以将利用扫描结果,添加更多处理逻辑,生成每日巡检日报,通过邮件或者短信发送。

nmap库使用:

nmap工具使用可参考:nmap扫描工具学习笔记)

如果在windows上写nmap库,有两个事要解决。

第一步:安装nmap软件

因为在python程序中,nmap包所调用的是nmap可执行程序,所以必须先安装nmap软件。nmap下载地址: https://nmap.org/download.html

第二步: 需要在nmap库中文件的init方法中添加的nmap.exe的路径。

不然会报错,提示找不到nmap。

在nmap.py的class PortScanner()中的__init__()中更改:

def __init__(self, nmap_search_path=('nmap', '/usr/bin/nmap', '/usr/local/bin/nmap', '/sw/bin/nmap', '/opt/local/bin/nmap',r"D:\software\nmap-7.80\nmap.exe")):

主要添加了‘r”D:\software\nmap-7.80\nmap.exe”, nmap.exe可执行文件路径。

import nmap
nm = nmap.PortScanner()
#nmap填入参数列表可以填很多
res = nm.scan(hosts=hosts, arguments='-sn -PE')

其他使用示例:

#!/usr/bin/env python
import nmap # import nmap.py module
nm = nmap.PortScanner() # instantiate nmap.PortScanner object
nm.scan('127.0.0.1', '22-443') # scan host 127.0.0.1, ports from 22 to 443
nm.command_line() # get command line used for the scan : nmap -oX - -p 22-443 127.0.0.1
nm.scaninfo() # get nmap scan informations {'tcp': {'services': '22-443', 'method': 'connect'}}
nm.all_hosts() # get all hosts that were scanned
nm['127.0.0.1'].hostname() # get one hostname for host 127.0.0.1, usualy the user record
nm['127.0.0.1'].hostnames() # get list of hostnames for host 127.0.0.1 as a list of dict
# [{'name':'hostname1', 'type':'PTR'}, {'name':'hostname2', 'type':'user'}]
nm['127.0.0.1'].hostname() # get hostname for host 127.0.0.1
nm['127.0.0.1'].state() # get state of host 127.0.0.1 (up|down|unknown|skipped)
nm['127.0.0.1'].all_protocols() # get all scanned protocols ['tcp', 'udp'] in (ip|tcp|udp|sctp)
nm['127.0.0.1']['tcp'].keys() # get all ports for tcp protocol
nm['127.0.0.1'].all_tcp() # get all ports for tcp protocol (sorted version)
nm['127.0.0.1'].all_udp() # get all ports for udp protocol (sorted version)
nm['127.0.0.1'].all_ip() # get all ports for ip protocol (sorted version)
nm['127.0.0.1'].all_sctp() # get all ports for sctp protocol (sorted version)
nm['127.0.0.1'].has_tcp(22) # is there any information for port 22/tcp on host 127.0.0.1
nm['127.0.0.1']['tcp'][22] # get infos about port 22 in tcp on host 127.0.0.1
nm['127.0.0.1'].tcp(22) # get infos about port 22 in tcp on host 127.0.0.1
nm['127.0.0.1']['tcp'][22]['state'] # get state of port 22/tcp on host 127.0.0.1 (open

参考文档:

https://pypi.org/project/python-nmap/

总结

以上所述是小编给大家介绍的python通过nmap扫描在线设备并尝试AAA登录,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python BeautifulSoup使用方法详解
Nov 21 Python
python构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
Python os模块介绍
Nov 30 Python
举例详解Python中yield生成器的用法
Aug 05 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
python实现简单flappy bird
Dec 24 Python
Python简单I/O操作示例
Mar 18 Python
python实现邮件发送功能
Aug 10 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
Python常用GUI框架原理解析汇总
Dec 07 Python
python dir函数快速掌握用法技巧
Dec 09 Python
pytorch中获取模型input/output shape实例
Dec 30 #Python
Python读取csv文件实例解析
Dec 30 #Python
Pytorch Tensor的统计属性实例讲解
Dec 30 #Python
PyTorch中permute的用法详解
Dec 30 #Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 #Python
Pytorch Tensor基本数学运算详解
Dec 30 #Python
python垃圾回收机制(GC)原理解析
Dec 30 #Python
You might like
基于mysql的论坛(5)
2006/10/09 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
python创建关联数组(字典)的方法
2015/05/04 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
在Python中定义一个常量的方法
2018/11/10 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
如何查找网页漏洞
2016/06/22 面试题
应聘教师自荐书
2014/06/16 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技