AP_IP地址扫描工具

Zss 发表于:

手上的AP有时候时常会忘记它的登陆的IP地址,不过他们都是99段的地址,因为设备的地址是根据设备的mac的最后两位来确定的

但是有的设备却并没有看到mac地址,不然就要去接串口来查看他的Ip,但是我知道他的设备型号,所以把整个二层网络扫描一遍,

把所有的设备都给罗列出来,然后自己再来判断吧

主要用到的还是与系统的shell交互的Popen方法,和http请求request,和解析html的lxml库,还有一个多线程的库,要是一个个的ip地址扫描

那得花多少时间呀,所以必须要使用到多线程来运行,首先获取到整个网段中能够ping通的地址,再将其使用多线程来请求,若请求为200说明为一个80端口开放的设备

但是网络中还存在一些其他的设备,路由器,交换机啥的并不是我们的产品,那么使用xpath来获取title的标题来判断是否为公司的设备,还有一个就是,request的超时时间设置3秒

不然请求过长时间才会失败,正常的话三秒内肯定可以访问成功了,要不然时间花费的更长

—————————————-
AP 扫描工具
—————————————-
(1).扫描99 网段的Alati_Ap
(2).扫描161/165/167 网段的Alati_Ap
—————————————-
输入你的选择2
–> 正在扫描,请稍后。。。
—————————————-
Altai设备总数:24台 分别如下:
1.设备:A3w Ip:10.6.161.100 Version:2.1.0.1312
2.设备:C2s Ip:10.6.161.115 Version:2.1.0.1606
3.设备:C1an Ip:10.6.161.124 Version:2.2.0
4.设备:C1n Ip:10.6.161.125 Version:1.2.4.1821
5.设备:A8-Ein Ip:10.6.161.167 Version:2.1.0.1312
6.设备:A2c Ip:10.6.161.185 Version:2.2.0.1711.AC00
7.设备:A8 Ip:10.6.161.186 Version:2.2.0.1712
8.设备:A3-Ei Ip:10.6.161.29 Version:2.2.0.1700.K1
9.设备:C1xan Ip:10.6.161.30 Version:2.2.0.1609
10.设备:A8n Ip:10.6.161.32 Version:2.2.0.1602
11.设备:C2s Ip:10.6.161.65 Version:2.2.0.1602
12.设备:A8 Ip:10.6.161.66 Version:2.2.0.1711.AC00
13.设备:C1an Ip:10.6.161.83 Version:2.1.0.1312
14.设备:A8n Ip:10.6.165.102 Version:2.2.0.1604.AC03
15.设备:A3c Ip:10.6.165.113 Version:2.2.0.1711.AC00
16.设备:C2s Ip:10.6.165.120 Version:2.2.0.1711.AC00
17.设备:A2c Ip:10.6.165.146 Version:2.2.0.1712
18.设备:C1n Ip:10.6.165.148 Version:2.2.0.1711.AC00
19.设备:A8n Ip:10.6.165.151 Version:2.2.0.1711.AC00
20.设备:A3-Ei Ip:10.6.165.164 Version:2.2.0
21.设备:A2c Ip:10.6.165.177 Version:2.2.0.1711.AC00
22.设备:A3c Ip:10.6.167.32 Version:2.2.0.1707
23.设备:C2s Ip:10.6.167.40 Version:2.2.0.1707
24.设备:C1n Ip:10.6.167.69 Version:2.2.0.1712
—————————————-
–> 扫描时间花费:19秒
—————————————-

#coding:utf-8
from threading import Thread
from subprocess import *
import requests,time
from lxml import etree

class Check_Dut():
    def __init__(self):
        self.pass_ip_list = []
        self.ap_ip_info = []
        print '-' * 40
        print '             AP 扫描工具'
        print '-' * 40
        print '(1).扫描99 网段的Alati_Ap'
        print '(2).扫描161/165/167 网段的Alati_Ap'
        print '-' * 40
        choice = raw_input('输入你的选择')
        if choice == '1':
            self.all_ip_list = ['192.168.99.{}'.format(i) for i in range(1,255)]
            print '--> 正在扫描,请稍后。。。'
            print '-' * 40
            self.s_time = time.time()
        if choice == '2':
            self.all_ip_list = []
            for i in range(1,255):
                self.all_ip_list.append('10.6.161.%s' % i)
                self.all_ip_list.append('10.6.165.%s' % i)
                self.all_ip_list.append('10.6.167.%s' % i)
            print '--> 正在扫描,请稍后。。。'
            print '-' * 40
            self.s_time = time.time()

    def ping_task(self,ip):
        cmd = 'ping %s -n 2'%ip
        try:
            result = Popen(cmd,shell=True,stdout=PIPE)
            if len(result.stdout.readlines()) == 9:
                self.pass_ip_list.append(ip)
        except:pass
        self.pass_ip_list.sort()

    def check_ping(self):
        T_list = []
        for ip in self.all_ip_list:
            T = Thread(target=self.ping_task,args=(ip,))
            T.start()
            T_list.append(T)
        for i in T_list:
            i.join()

    def check_dut_task(self,ip):
        try:
            url = 'http://%s/cgi-bin/luci'%(ip)
            rsp = requests.get(url,timeout=3)
            if rsp.status_code == 200:
                xml = etree.HTML(rsp.content)
                dut_name = xml.xpath('/html/head/title/text()')[0]
                version = xml.xpath('//*[@id="rightinfo"]/p[2]/text()')[0]
                self.ap_ip_info.append((ip,dut_name.split()[0],version.split(': ')[1]))
        except Exception as e:
            pass
        finally:self.ap_ip_info.sort()

    def check_dut(self):
        T_list = []
        for ip in self.pass_ip_list:
            T = Thread(target=self.check_dut_task,args=(ip,))
            T.start()
            T_list.append(T)
        for i in T_list:
            i.join()

    def print_info(self):
        index = 1
        print 'Altai设备总数:%d台   分别如下:'%(len(self.ap_ip_info))
        for i in self.ap_ip_info:
            print '%d.设备:%s   Ip:%s   Version:%s'%(index,i[1],i[0],i[2].encode('utf-8'))
            index += 1
        print '-' * 40
        print '--> 扫描时间花费:%d秒'%(time.time() - self.s_time)
        print '-' * 40

if __name__ == '__main__':
    check_dut = Check_Dut()
    check_dut.check_ping()
    check_dut.check_dut()
    check_dut.print_info()