• 获取内网路由器管理页面出口ip


    获取内网路由器管理页面出口ip

    一、唠嗑前言

      话说我们有个埋点系统,其中有一列是统计使用我们阅卷系统的ip。

      问题来了,这个ip记录不是那么智能的。我们公司也有测试人员要登入阅卷系统做测试,这样这个埋点系统也会把他出口的ip记录下来,然而这个记录信息对运营分析人员是没有任何作用的,我要知道用户使用我们系统的情况,而不是本公司人测试的情况呀~~~ 

      先介绍一下我们公司出口ip的组成情况,实际上公司任意一台电脑包括虚拟机,最终都是汇集起来,通过我们的主路由器出去的,其中有3条电信线路,都不是固定ip(因为贵),会不定时自己更换,有时一天,有时几个小时,甚至几分钟都有可能。现在需要把公司出口ip的信息不要记录到这个埋点系统,因为这个信息没有任何采集和分析的价值。跟开发讨论过,我只需要把这3个ip定时写到一个文件中,让应用程序去读就能实现不记录了。

    二、需求实现

      主路由器管理页面登录进去长这个样子:

    部署环境如下,用的是跟主路由器同一网段的一台虚拟机写的python脚本实现的:

    系统:CentOS Linux release 7.2.1511 (Core)
    安装:Python 3.6.8 + chrome77.0.3865.90 + chromedriver
     
     1 #!/usr/bin/env python
     2 
     3 # -*- coding: utf-8 -*-
     4 # vim: set fileencoding=utf-8 :
     5 
     6 import logging
     7 logging.basicConfig()
     8 
     9 from selenium import webdriver
    10 from selenium.webdriver.chrome.options import Options
    11 from datetime import *
    12 import time
    13 from bs4 import BeautifulSoup
    14 import urllib.request
    15 import json
    16 import requests
    17 
    18 from shutil import copyfile  #覆盖文件模块
    19 import os #运行linux命令模块
    20 import paramiko #登录模块
    21 
    22 #1、模拟浏览器登录
    23 chrome_options = Options()
    24 chrome_options.add_argument('--headless') 
    25 chrome_options.add_argument('--no-sandbox') 
    26 chrome_options.add_argument('--disable-gpu')   
    27 chrome_options.add_argument('--disable-dev-shm-usage')
    28 chrome_options.add_argument('--window-size=1920,1080')
    29 
    30 chrome_browser = webdriver.Chrome('chromedriver',chrome_options=chrome_options) 
    31 chrome_browser.delete_all_cookies()
    32 chrome_browser.get("http://192.168.0.1:8008/logon/logon.htm")
    33 chrome_browser.find_element_by_id('txt_usr_name').send_keys('admin')
    34 chrome_browser.find_element_by_id('txt_password').send_keys('ever8888')
    35 chrome_browser.find_element_by_id("btn_logon").click()
    36 time.sleep(2)
    37 
    38 #2、判断继续按钮是否存在,存在则点击确认
    39 soupconfirm = BeautifulSoup(chrome_browser.page_source, 'lxml')
    40 #通过id找到btn_confirm
    41 res = soupconfirm.find_all(attrs={"id": "btn_confirm"})
    42 if len(res) != 0:
    43     #点击继续,进行下一步
    44     chrome_browser.find_element_by_id("btn_confirm").click()
    45     print("success: 继续按钮存在")
    46 else:
    47     print("false: 继续按钮不存在")
    48 
    49 chrome_browser.switch_to.frame("mainFrame")
    50 time.sleep(2)
    51 
    52 #获取有ip的iframe页面
    53 chrome_browser.switch_to.frame("ifr_wan_sysinfo")
    54 time.sleep(2)
    55 
    56 ip = open("/root/router/ip_new", 'w+')
    57 soup = BeautifulSoup(chrome_browser.page_source, 'lxml')
    58 # 通过class获取有可能含有IP的元素列表
    59 els = soup.find_all(attrs={"class": "CFG_DATA"})
    60 for index in range(len(els)):
    61     val = els[index].text
    62     # 筛选含IP的值,从规则来看,端口显示"已连接"后第二值就是IP
    63     if val.find("已连接") > -1:
    64         print(els[index + 2].text, file=ip)
    65 ip.close()
    66 #关闭浏览器
    67 chrome_browser.quit()
    68 os.system("ps -ef | grep chrome | grep -v grep |awk '{print $2}' | xargs kill -9")
    69 
    70 
    71 ##是否替换文件ip.txt(有新ip)
    72 result=os.system("diff /root/router/ip_new /root/router/ip_old")
    73 
    74 if result != 0 :
    75     copyfile('/root/router/ip_new', '/root/router/ip.txt') 
    76 
    77 #上传到服务器上    
    78     transport = paramiko.Transport(('埋点系统线上服务器ip', '埋点系统线上服务器ssh端口'))
    79     transport.connect(username='埋点系统线上服务登录账号',password='登录密码')
    80     sftp = paramiko.SFTPClient.from_transport(transport)
    81     sftp.put('/root/router/ip.txt', '/home/ljy/data/mnt/ip.txt')
    82 
    83 #最新的ip_new覆盖到ip_old
    84 copyfile('/root/router/ip_new', '/root/router/ip_old')

    几个点我拎出来说明下:

    1、前面获取ip,需要有点前端代码基础

    首先找到登录接口,传账号密码参数登进去路由器上,然后利用页面元素的组合位置找到 IP 地址那一行(规律是我的开发朋友帮我找的,当然后来我自己也写了个,但方法有点蠢,要对各种符号例如双引号作空白替换的。代码写出来健壮性是很重要的呢~所以俺就不献丑了)

    2、“继续”按钮的判断

    因为有可能定时脚本跑的时候刚好有人在用,比如我,公司老板,或者最极端的是,上一次定时跑脚本的时候,服务器没有正常退出管理页面,导致要点击“继续” 强制登录

     3、ip_new , ip_old, ip.txt 文件

    ip_new 和 ip_old 都是在内网虚拟机下的,ip.txt是真正让埋点系统读的ip

    (1)ip_new:是当前运行py脚本的时候,进入路由器管理界面获取的ip

    (2)ip_old:上一次定时脚本获取的出口ip

    如果出口ip没变化(diff比较两个文件),就不上传到线上,不覆盖ip.txt

      最后说下,这个脚本定时20分钟跑一次,所以跑的频率其实是不够频繁的,会导致无用测试信息有可能会被记录到 :如果刚好20分钟内,这3条线路的ip变了,测试人员也在测试,那么埋点系统还是会记录这些无价值的信息。为什么调成20分钟一次呀,因为有段时间我经常得进去路由器管理页面操作,这个脚本老是把我挤出去,哪天心情好再调回到每5分钟跑一次。。。。

  • 相关阅读:
    Python的命名空间及作用域
    STM32 RTC时钟的配置
    STM32 输入捕获配置
    stm32 看门狗配置
    led灯的驱动电流和电阻
    STM32中TIMx的映射及其通道
    STM32中断定时,控制LED灯
    STM32 用c语言控制4个LED灯从左向右无限流动
    SYSTEMsyssys.c:33:7: error: expected '(' before 'void' __ASM void MSR_MSP(u32 addr)
    STM32 PWM输出(映射)
  • 原文地址:https://www.cnblogs.com/windysai/p/14374993.html
Copyright © 2020-2023  润新知