获取内网路由器管理页面出口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分钟跑一次。。。。

 

 

posted @ 2021-02-04 21:35  windysai  阅读(728)  评论(0编辑  收藏  举报