浙江大学软件学院网络自动认证+Padavan路由器挂python脚本

起因

浙软的网络认证系统实在是与众不同,好像是自己开发的?
认证界面

反正就特别不方便,每次连上之后会有一个小窗口,影响观感。
在这里插入图片描述
有轻微强迫症的咱怎么能忍这个呢?于是决定自己写一个认证的程序,并挂到路由器上,由于路由器装的是linux,没有GUI,也就看不到这个窗口了。

自动认证

这部分过程其实很简单,很多文章都有介绍方法,比如浙大软院 免登录上网攻略

受到了浙大python网_Python爬虫学习(8):浙大软院网络登陆保持一文的启发,发现没必要一定用自己的账号登录,并在这篇文章的基础上进行了改写:

import urllib
import urllib.request as urllib2
import re
import os
import time

class PseudoLogin:
    def __init__(self):  
        self.login_url  = "http://192.0.0.6/cgi-bin/do_login"
        self.status_url = "http://192.0.0.6/cgi-bin/keeplive"
        self.logout_url = "http://192.0.0.6/cgi-bin/do_logout"
        self.headers = {}
        self.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
        self.headers["Content-Type"] = "text/html; charset=gb2312"

        # 需要更改起始和结束帐号
        self.start = 22151001
        self.end = 22151300
        self.check_time = 5

        #当前登陆的帐号
        self.current = self.start #登陆成功后返回的数字字符串
        self.uid = ""

    #循环测试帐号,直到有一个帐号可以通过初始密码登陆
    def cycle_login(self):
        #初始密码
        password = '3fdebd70bc927d97' # 'zjucst'的md5加密
        
        #匹配全是数字的字符串
        pattern = re.compile(r"^[\d]+$")#当已经访问到最后的时候,且最后一个帐号没有登陆成功的时候,又重头来一次
        if(self.current >= self.end):
            print("将重头再来一次..")
            self.current = self.start
        for username in range(self.current, self.end + 1):
            self.current = username
            ret = self.access(str(username), password)
            if re.match(pattern, ret):
                self.uid = ret
                print("已经成功登陆...,可以上网了")
                print("当前网号为:" + str(username))
                print("uid为:" +  ret)
                return True
        return False

    def access(self,username,password):
        data = {'username': username, 'password': password, 'drop': 0, 'type': 1, 'n': 100}
        data = urllib.parse.urlencode(data).encode(encoding='UTF8')
        # print(data.decode('UTF8'))
        req = urllib2.Request(self.login_url, data=data, headers=self.headers)
        res = urllib2.urlopen(req)
        content = res.read().decode('UTF8')
        print("the login result: " + content)
        return content #获取登陆上网后的状态

    def get_status(self):
        data = {'uid': self.uid}
        data = urllib.parse.urlencode(data).encode(encoding='UTF8')
        req = urllib2.Request(self.status_url, data=data, headers=self.headers)
        res = urllib2.urlopen(req)
        content = res.read().decode('UTF8')
        print("the keep-alive result: " + content)
        return content #登出

    def logout(self):
        data = {'uid': self.uid}
        data = urllib.parse.urlencode(data).encode(encoding='UTF8')
        req = urllib2.Request(self.logout_url, data=data, headers=self.headers)
        res = urllib2.urlopen(req)
        content = res.read().decode('UTF8')
        print("the logout result: " + content)
        return content #登陆上网之后一直监测上网状态,如果被强制下线就返回

    def suffer(self):
        #循环测试,直到能够登陆
        while(not self.cycle_login()):
            pass

        #当返回的是三个数字并且已逗号隔开的时候表示依然在线
        pattern = re.compile(r"^[\d]+,[\d]+,[\d]+$")#每过5秒访问一下状态
        while(True):
            time.sleep(self.check_time)
            status = self.get_status()
            if re.match(pattern,status):
                print("it is still online")
            else:
                print("sorry you are offline")
                #如果被强制下线,则自动加1,不然又会登上这个帐号
                self.current = self.current + 1
                print("下线后需要等一会儿才能再登陆")
                time.sleep(30)
                break
        #如果while循环退出表示上网失败了
        return False #这个函数将会一直执行

    def enjoy(self):
        while(not self.suffer()):
            pass

login = PseudoLogin()
login.enjoy()

我主要对那篇文章中的代码格式进行了人工调整,并且把python2给update到了python3。并且由于系统的升级,密码不再是以前的明文传递,改成了md5加密:

在这里插入图片描述

运行后:

在这里插入图片描述

成功登录,并且连上了网。

挂到路由器

这部分才是这篇博客的难点,我用的路由器是著名的刷固件神器斐讯k2p,用的固件是老毛子Padavan 3.4.3.9-099_20-06-1

Padavan

进入终端

要进入路由器的终端,首先得开放ssh服务:

在这里插入图片描述

然后通过ssh协议连接:

在这里插入图片描述

进来之后其实可以看到是个类似Linux系统的shell,是BusyBox的一部分,但是没有lsb_release -a, cat /etc/os-release等一系列的命令,也没有aptyumdpkgrpm 等软件包管理的工具,在这种情况下应该是没办法安装python的。

从外部安装opkg

没有这些包管理工具,我们就无法安装新的软件,因此需要找一个可用的package management tool。

经过一番搜寻,终于找到了一个方法: 从外部网站下载一个包管理工具——opkg,然后使用这个工具安装python3

由于路由器的file system建立在memory之上,其存储空间是read-only的,所以要先将内存划分一部分空间,挂载到文件系统:

mount -t tmpfs -o size=40M tmpfs /opt/

我这里分配了40M大小的内存,之前其实有尝试过分配10M和20M,但在后续安装python的时候提示了空间不足。

随后从外部网站下载opkg:

wget http://pkg.entware.net/binaries/mipsel/installer/opkg -O /opt/bin/opkg
chmod 755 /opt/bin/opkg
wget http://bin.entware.net/mipselsf-k3.4/installer/opkg.conf -O /opt/etc/opkg.conf

不出意外的话会提示文件夹不存在之类的错误,因为没有手动创建/opt/binopt/etc等文件夹,这部分mkdir即可。

进入/opt/bin目录,对opkg进行一下update,并安装一下ipk:

cd /opt/bin
./opkg update
wget https://archive.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base/opkg_9c97d5ecd795709c8584e972bfdf3aee3a5b846d-7_ramips_24kec.ipk
opkg install ./opkg_9c97d5ecd795709c8584e972bfdf3aee3a5b846d-7_ramips_24kec.ipk

后台挂自动认证脚本

最后,安装python3:

opkg install python3

即可成功把python安装到路由器的RAM里。通过scp将python脚本传过来,然后使用nohup命令挂在后台即可:

scp ./keeplive.py admin@192.168.123.1:~/
nohup python3 ./keeplive.py &

后记

这样做还是有缺陷的,因为在RAM里,所以路由器断电重启的话文件会消失,还需要重写安装python并挂上,后续可以自己写一个脚本。

参考链接

[1] 浙大软院 免登录上网攻略
[2] 浙大python网_Python爬虫学习(8):浙大软院网络登陆保持
[3] StackOverflow: How to install a software management tool in Linux?
[4] Padavan固件安装软件包,7620老毛子Padavan固件安装openwrt安装额外的软件包
[5] 在Padavan 上使用Entware
[6] OPKG 软件包管理

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 你可以使用Python来写一个脚本来获取华为路由器接口IP地址。你可以使用urllib模块来实现这一功能,并使用正则表达式来提取IP地址。你还可以使用requests模块来访问指定的URL,获取该网页的源代码,并解析出IP地址。 ### 回答2: 要编写一个自动获取华为路由器接口IP地址的Python脚本,首先需要使用Python网络编程库来与路由器进行通信。以下是一个可能的实现思路: 1. 导入必要的Python库,如paramiko(用于SSH连接)、re(用于正则表达式匹配)和time(用于延时等待)。 2. 创建一个SSH连接路由器的函数。在函数中使用paramiko库来建立SSH连接,并使用用户名和密码进行身份验证。 3. 在SSH连接中执行命令来获取路由器的接口信息。使用paramiko库中的`exec_command()`函数来执行命令,并使用`recv()`函数来获取命令输出。 4. 使用正则表达式匹配从路由器接口信息中提取IP地址。可以使用re库中的`findall()`函数来匹配IP地址的模式,并将匹配到的IP地址保存在一个列表中。 5. 返回IP地址列表。 以下是一个简单的示例代码: ```python import paramiko import re import time def get_router_ip(username, password): router_ip_list = [] # SSH连接路由器 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('router_ip', username=username, password=password) # 执行命令获取接口信息 stdin, stdout, stderr = ssh.exec_command('display ip interface brief') time.sleep(1) # 等待命令执行完成 # 获取命令输出并使用正则表达式匹配IP地址 output = stdout.read().decode('utf-8') ip_addresses = re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', output) # 将匹配到的IP地址添加到列表中 for ip_address in ip_addresses: router_ip_list.append(ip_address) # 关闭SSH连接 ssh.close() return router_ip_list # 调用函数并打印结果 username = 'your_username' password = 'your_password' router_ip_list = get_router_ip(username, password) print(router_ip_list) ``` 请注意,此示例仅提供了基本的框架和思路,实际操作中需根据华为路由器的具体配置和命令进行调整。同时,需要替换掉代码中的'router_ip'、'your_username'和'your_password'为实际的路由器IP地址、用户名和密码。 ### 回答3: 要编写一个自动获取华为路由器接口IP地址的Python脚本,你可以使用telnetlib库来远程连接路由器并发送命令。以下是一个示例脚本: ```python import telnetlib host = "路由器IP地址" username = "路由器用户名" password = "路由器密码" # 连接到路由器 tn = telnetlib.Telnet(host) # 输入用户名 tn.read_until(b"Username: ") tn.write(username.encode('ascii') + b"\n") # 输入密码 tn.read_until(b"Password: ") tn.write(password.encode('ascii') + b"\n") # 登录成功后发送命令 tn.write(b"interface brief\n") tn.write(b"display ip interface brief\n") tn.write(b"quit\n") # 读取路由器返回的结果 output = tn.read_all().decode('ascii') # 解析结果,获取接口IP地址 lines = output.split("\n") for line in lines: words = line.split() if len(words) >= 4 and words[0].startswith("GigabitEthernet"): interface = words[0] ip_address = words[1] print("接口名:", interface, " IP地址:", ip_address) # 关闭连接 tn.close() ``` 在上述脚本中,需要将`host`变量替换为你的华为路由器的IP地址,`username`和`password`变量替换为你的登录凭据。脚本首先通过telnet连接到路由器,然后输入用户名和密码进行登录。之后发送命令`interface brief`和`display ip interface brief`来获取接口IP地址的信息,并解析返回的结果,输出接口名和IP地址。最后关闭telnet连接。 请注意,使用telnet进行远程连接存在安全风险。为了更安全地获取接口IP地址,推荐使用SSH协议,可以使用`paramiko`库来进行SSH连接和命令发送。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值