步骤/目录:
1.需求分析
2.解决方案
(1)电脑wifi共享
(2)手机热点法
(3)路由器更改MAC法
a.配置路由器
b.更改路由器上网方式及MAC地址
c.注意事项及改进
(4)路由器刷机法
a.购买路由器
b.路由器刷breed
c.路由器刷机
d.刷机后设置
e.通过wget网页登录校园网
f.mentohust锐捷认证
本文首发于个人博客http://lisper517.top/2022/02/13/寝室多设备连接校园网的解决方案/
,转载请注明出处。
实验日期为2022年2月13日。
Windows设置-网络和Internet-状态
中找到
更改适配器选项
,选中校园网连接,右键选择属性,选择 共享 分页,点击
允许其他网络用户通过此计算机的Internet连接来连接
。 如果运行顺利,此时其他设备就能连接到电脑的wifi下。但是锐捷客户端可识别网卡,同时使用有线和无线网卡时锐捷客户端会自动断开连接,除非在设备管理器禁用其中一张。网页登录时不知道有无同样的问题,可以试一试。
其次,校园网长时间不用一般会自动退出登录,所以即使路由器一直开着,但是睡一觉起来打开电脑可能又需要网页登录一次。这种情况的解决方法较多,可以在电脑上使用python的selenium或requests库自动网页登录,或者购买微电脑(如树莓派)24h小时开机、自动检测断网并进行网页登录。下面的内容是使用selenium网页登录的例子(无法直接运行,需要一定python基础):
from selenium.webdriver import Chrome
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
if __name__ == "__main__":
username = '123456' #用户名,一般是学号
password = '123456' #密码
service_type = '中国电信' #宽带类型。可选 校园网、中国移动、中国电信
url = "http://xxx.xxx.xxx.xxx/..." #每次网页认证时弹出来的网址复制到此处
bro = Chrome(executable_path=r'D:\chromedriver')
bro.get(url=url)
locater = (By.ID, 'loginLink_div')
WebDriverWait(bro, 5).until(
expected_conditions.presence_of_element_located(locater))
tag_username = bro.find_element_by_xpath('//*[@id="username"]')
tag_password = bro.find_element_by_xpath('//*[@id="pwd"]')
tag_service_type = None
if service_type == '校园网':
tag_service_type = bro.find_element_by_xpath('//*[@id="_service_0"]')
elif service_type == '中国移动':
tag_service_type = bro.find_element_by_xpath('//*[@id="_service_1"]')
elif service_type == '中国电信':
tag_service_type = bro.find_element_by_xpath('//*[@id="_service_2"]')
tag_button = bro.find_element_by_xpath('//*[@id="loginLink_div"]')
tag_username.send_keys(username)
if bro.find_element_by_xpath('//*[@id="deleteDiv"]').get_attribute(
'style') == 'float: left; display: block;':
bro.find_element_by_xpath('//*[@id="deletepwd"]').click()
bro.find_element_by_xpath('//*[@id="pwd_hk_posi"]').click()
#填完用户名后会失去焦点,需要点一下密码输入框,否则element not interactable
tag_password.send_keys(password)
bro.find_element_by_xpath('//*[@id="xiala"]').click()
tag_service_type.click()
tag_button.click()
locater = (By.ID, 'userMessage')
try:
WebDriverWait(bro, 3).until(
expected_conditions.presence_of_element_located(locater))
print('登录成功')
except Exception as e:
print('登录失败')
用requests库应该也可以,感兴趣的可以自行尝试。
首先,不一定要自己刷机,贴吧或其他平台可以交易刷好的路由器(破解版路由器,大多是代代相传的),之后跳过购买和刷机这两步直接看后面的。但如果怕别人留后门就自己刷吧;
其次,有些机器用的系统是openwrt改的或可以通过其他方式开启ssh,比如小米路由器。这种情况下开启ssh即可(小米路由器开启ssh需要用官方提供的工具刷机成开发版,然后路由器绑定小米账号,最后到官网的 开放 中下载 开启ssh工具,根据提示操作。部分小米路由器如4C就没有开发版,而且路由器的root密码也要绑定后才能看,比较坑)。当然嫌麻烦的也可以直接开刷。
最后,刷机前树立一些概念:大多数路由器就是一个使用linux系统的微电脑,很多操作也能对路由器进行(比如连ssh),只是官方系统可能关闭了sshd这些服务;或者其他使用linux系统的电脑(如树莓派)也可以装openwrt后再搭配其他硬件当路由器用。系统也不止openwrt,Padavan(老毛子)、Asuswrt-merlin等也可以用,主要取决于路由器的芯片。最后,刷机(路由器或手机等)是一项历史悠久的运动,刷完后能做的远不止登录校园网,刷机的内容也远非一篇文章能讲完的。
以下的操作主要参考了这篇教程。
首先开启win10机器的telnet功能:在windows设置中搜索 启用或关闭windows功能 ,在下面的框中勾选 Telnet 客户端 后确定。有PuTTY或者用win10自带的ssh命令也可以不用Telnet。
然后去小米路由器官网固件下载页面下载小米路由器4C对应的固件(下文提到的固件可以解释为linux的发行版)。接下来下载OpenWRTInvasion,首先介绍一下,OpenWRTInvasion是大神写的python刷小米路由器脚本,下载地址有3个:GitHub源仓库地址(速度可能较慢),我复制的仓库,和网友提供的蓝奏云盘。最后小米路由器4C使用路由模式连接网络(使用 更改MAC法 ,或者直接DHCP+网页认证。也可以不连网,因为联网是为了下breed,不过小米路由器不联网时电脑连路由器有点问题),电脑连接上4C的网络,开始刷breed。注意,下面的操作需要知道路由器的管理页面密码,需要下载python及requests库(pip install requests)。
打开OpenWRTInvasion-master.zip解压出来的OpenWRTInvasion-master文件夹,在该文件夹的文件路径框中输入cmd打开命令行界面,输入:
python remote_command_execution_vulnerability.py
会显示:
Router IP address [press enter for using the default 'miwifi.com']:
这里输入路由器地址:192.168.31.1 。然后显示:
Enter router admin password:
这里输入路由器管理页面密码。然后显示:
There two options to provide the files needed for invasion:
1. Use a local TCP file server runing on random port to provide files in local directory `script_tools`.
2. Download needed files from remote github repository. (choose this option only if github is accessable inside router device.)
这是问使用本地刷机模式还是联网刷机模式(联网模式要从github下文件,经常失败)。输入 1 后回车,等待刷机完毕。脚本的所有输出文字:
Router IP address [press enter for using the default 'miwifi.com']: 192.168.31.1
Enter router admin password: 12345678
There two options to provide the files needed for invasion:
1. Use a local TCP file server runing on random port to provide files in local directory `script_tools`.
2. Download needed files from remote github repository. (choose this option only if github is accessable inside router device.)
Which option do you prefer? (default: 1)1
****************
router_ip_address: 192.168.31.1
stok: 235c60efe641083025e6e30efc47a9d9
file provider: local file server
****************
start uploading config file...
start exec command...
local file server is runing on 0.0.0.0:49961. root='script_tools'
local file server is getting 'busybox-mipsel' for 192.168.31.1.
local file server is getting 'dropbearStaticMipsel.tar.bz2' for 192.168.31.1.
done! Now you can connect to the router using several options: (user: root, password: root)
* telnet 192.168.31.1
* ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c 3des-cbc -o UserKnownHostsFile=/dev/null [email protected]
* ftp: using a program like cyberduck
此时路由器的root用户密码就是root。另外,如果只是想开启4C的ssh,到这里就已经可以了。脚本最后还输出了几行,提示如何连接到小米路由器,此处用Telnet演示,用PuTTY或者win10自带的ssh命令也是一样的。cmd中输入:
telnet 192.168.31.1
然后输入root,回车后输入密码root即可成功连接到路由器,欢迎界面如下:
BusyBox v1.19.4 (2019-11-26 08:38:00 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.
-----------------------------------------------------
Welcome to XiaoQiang!
-----------------------------------------------------
$$$$$$\ $$$$$$$\ $$$$$$$$\ $$\ $$\ $$$$$$\ $$\ $$\
$$ __$$\ $$ __$$\ $$ _____| $$ | $$ | $$ __$$\ $$ | $$ |
$$ / $$ |$$ | $$ |$$ | $$ | $$ | $$ / $$ |$$ |$$ /
$$$$$$$$ |$$$$$$$ |$$$$$\ $$ | $$ | $$ | $$ |$$$$$ /
$$ __$$ |$$ __$$< $$ __| $$ | $$ | $$ | $$ |$$ $$<
$$ | $$ |$$ | $$ |$$ | $$ | $$ | $$ | $$ |$$ |\$$\
$$ | $$ |$$ | $$ |$$$$$$$$\ $$$$$$$$$ | $$$$$$ |$$ | \$$\
\__| \__|\__| \__|\________| \_________/ \______/ \__| \__|
接下来备份eeprom(到tmp文件夹下):
dd if=/dev/mtd3 of=/tmp/eeprom.bin
然后获取路由器对应的breed。这里要看一下路由器的CPU,在小米路由器官网查看得知4C的芯片是MT7628DA,在breed下载页面找到了breed-mt7628-hiwifi-hc5661a.bin
和breed-mt7628-oye-0006.bin
。一般过程就是这样,找路由器CPU->找对应breed型号下载。但是这里对4C建议选择breed-mt7688-reset38.bin
,其他小米路由器型号建议对应的breed:
4A千兆版:https://breed.hackpascal.net/breed-mt7621-pbr-m1.bin
3G 和 4:https://breed.hackpascal.net/breed-mt7621-xiaomi-r3g.bin
3A,3C,4A百兆版,4C:https://breed.hackpascal.net/breed-mt7688-reset38.bin
然后浏览器输入https://breed.hackpascal.net/breed-mt7688-reset38.bin
下载breed。慎重起见,顺便下载md5sum.txt,找到breed-mt7688-reset38.bin
对应的md5值是cc80874b1b7363929661616b333b6f53
,cmd中使用命令certutil -hashfile breed-mt7688-reset38.bin MD5
得到下载到文件的md5值,若不一样就重复下载并校验到一样为止。
接着用WinSCP(WinSCP下载地址)传breed到路由器:WinSCP新建一个站点,协议为FTP、不加密,地址192.168.31.1,用户名root,登录,到tmp文件夹下,把breed包改名为breed.bin后拖过去,顺便把tmp里的eeprom.bin(4C的这个文件大小应该是64kb,不对就重新备份eeprom文件)拖过来做个备份。最后刷breed,在ssh里,进入tmp文件夹后输入以下命令:
mtd write breed.bin Bootloader
显示如下:
Unlocking Bootloader ...
Writing from breed.bin to Bootloader ...
完了之后关掉telnet界面及其他连接到路由器的软件(WinSCP、PuTTY等),进入breed:拔掉路由器电源,用取卡针顶住reset键后不松,再插上电源,等路由器上的灯(4C上是网络灯和电源灯)闪烁几下后松开reset即可(插上电源到松开reset大概3-7s),再到浏览器进入breed默认的路由器地址(192.168.1.1),显示 Breed Web 恢复控制台 (如果打不开也可能是电脑的问题,换一台电脑试试)。第一次进入breed后最重要的是先把备份的eeprom刷好,操作是在 breed页面中-固件更新 处选择勾选eeprom,选择文件就是刚才备份的eeprom.bin。这个文件是路由器的MAC等重要参数,如果这个丢了再刷其他固件,就好比猪的灵魂进了狗的躯壳,会不适应新的身体。
刷完breed、刷上eeprom后就好比上了一道保险,以后刷错了其他固件可以随时救回来。方法就是刚才的 拔电源-顶住reset-插电源-等待3-7s ,就又可以在192.168.1.1中重刷。当然,有些路由器没有对应breed,或者艺高人胆大,也可以直接从下一步开始。
先进入breed界面:192.168.1.1,在 恢复出厂设置-固件类型 中选择 OpenWrt ,点击执行,一段时间后完成。接着去openwrt官网找固件:点击左侧 下载,点击 下载您设备专用的OpenWrt/LEDE固件 下面的 硬件列表,这里可以筛选;找到4C对应的安装固件(不是升级固件),下载下来。文件名为openwrt-21.02.1-ramips-mt76x8-xiaomi_mi-router-4c-squashfs-sysupgrade.bin
,MD5值为ea235366cb821012e804af9c270d8b6f
。在 breed页面-固件更新 里勾选 固件,选择刚刚下载的文件,点击 上传-更新 ,路由器会自动重启。过一会儿进入固件的本地ip地址(openwrt是192.168.1.1)即可。但是前面下的breed是通用版,对4C不太匹配,还有些工作要做。这里参考了Mi-Router-4C刷openwrt需要注意的地方,详细介绍参考原文,以下不做解释。
回到breed刚刷好、备份完eeprom时。在 breed页面-恢复出厂设置 中 固件类型 选择OpenWRT;在 环境变量设置 中选择 启用,位置为 Breed 内部,其他不用管,点击 设置 ,然后重启路由器。这时路由器可能会出现问题,表现为192.168.1.1页面的连接断断续续,进行breed式reset重新进入页面,环境变量设置 中 位置 被改为了自定义,其余未变,不用管。在 环境变量编辑 中添加一条,字段 为 autoboot.command
,值 为 boot flash 0x160000
,暂不保存。
进入bin文件存放目录,在该目录下开启cmd,先输入ipconfig
查看得知本机ip地址为192.168.1.3(arp -a
看到该网段下有192.168.1.1动态地址,对应路由器);然后输入py -m http.server
开启本地ftp服务器。
在浏览器中输入http://192.168.1.3:8000/
,复制下面的bin文件链接。
使用telnet连接到breed:
telnet 192.168.1.1
然后在telnet界面输入:
wget http://192.168.1.3:8000/openwrt-21.02.1-ramips-mt76x8-xiaomi_mi-router-4c-squashfs-sysupgrade.bin
此时wget拿到bin文件并存入了内存。屏幕显示如下:
breed> wget http://192.168.1.3:8000/openwrt-21.02.1-ramips-mt76x8-xiaomi_mi-router-4c-squashfs-sysupgrade.bin
Connecting to 192.168.1.3:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5243193/0x500139 (5MB) []
Saving to address 0x80000000
[========================================================================] 100%
Transmission completed in 1.2s.
其中0x80000000
为存放bin文件的内存起始位置,0x500139
为bin文件大小,需要记住。接着擦除需要写入的系统分区位置:
flash erase 0x160000 0xea0000
把内存中的bin文件写到断电存储(0x80000000和0x500139注意更换):
flash write 0x160000 0x80000000 0x500139
回到breed页面,保存刚才新增的一条环境变量。在 重启 中重启路由器,4C的黄灯会闪一会儿,然后变为蓝灯;访问192.168.1.1,出现OpenWRT页面,成功刷机。
su root
为root设置密码。 在设置页面中,System-Administration 下,设置Router Password(管理页面密码),添加一个SSH-Keys(公钥),SSH Access取消密码认证、root密码登录;System-system 设置一下;Network里设置无线网(默认关闭)。System-Software-Configure opkg里换一下国内源(/etc/opkg/distfeeds.conf里所有
https://downloads.openwrt.org/
换成清华源
mirrors.tuna.tsinghua.edu.cn/openwrt
。不过此时清华源最新版openwrt是21.02.0,我的是21.02.1,就没换。也可以不换)。
更多设置可以自行更改。另外,对OpenWrt有兴趣的可以看看openwrt.pro。
先用PuTTY或其他工具连上路由器ssh。输入wget
,弹出帮助信息,可以看到其中有–user-agent(带请求头)、–post-data(带载荷)和-O(指定输出文件) 的选项。但是wget发送post的载荷太复杂时会出问题,所以安装curl代替:4C连上网(学校可能比较麻烦,可以用一个改MAC法的路由器LAN连到4C的WAN),用opkg update && opkg install curl
即可;路由器连不上网就到openwrt官网按固件版本和CPU型号(本例中为21.02.1,芯片MT7628)查找安装包(本例中为https://archive.openwrt.org/releases/21.02.1/packages/mipsel_24kc/packages/
),这里的curl需要curl、libcurl、libnghttp、libwolfssl(不同版本的固件需要的包也可能不同)。一般来说网页登录校园网时随便进一个网站都会跳到登录界面,用wget连接认证界面的ip试试(之前先把校园网接到路由器的WAN口,并且校园网账号下线):
mkdir /tmp/test
cd /tmp/test
wget 192.168.xxx.xxx # xxx.xxx要改成自己学校的
#输出结果
Downloading '192.168.xxx.xxx'
Failed to allocate context
这是因为没有指定http或https。输入:
wget http://192.168.xxx.xxx
#输出结果
Downloading 'http://192.168.xxx.xxx'
Connecting to 192.168.xxx.xxx:80
Redirected to /eportal/redirectortosuccess.jsp on 192.168.xxx.xxx
Redirected to / on xxx.xxx.xxx.xxx
Writing to 'index.html'
index.html 100% |*******************************| 480 0:00:00 ETA
Download completed (480 bytes)
打开index.html,发现只包含一个跳转到登录页面的js脚本:
<script>top.self.location.href='http://192.168.xxx.xxx/eportal/index.jsp?wlanuserip=1&wlanacname=2&ssid=&nasip=3&snmpagentip=&mac=4&t=5&url=6&apmac=&nasid=7&vid=8&port=9&nasportid=10'</script>
这个网址就是普通网页登录时的页面。经过几次实验,在同一个寝室中,用不同电脑联网,其中只有wlanuserip,url和mac不一样。mac应该是加密后的网卡MAC,wlanuserip的前16个字符应该也是从mac生成的,后16个字符可能是时间生成,url也和mac异同一致,所以这里网卡MAC可能需要认证。接下来分析网页登录页面,在电脑打开认证页面,输入账号密码,通过F12开发者选项(勾上保留日志)发现,认证的账号密码等信息通过post方法发给了另一个网址:
http://192.168.xxx.xxx/eportal/InterFace.do?method=login
#各种载荷
userId: 校园网账号,一般是学号,明码
password: 加密过的密码,网页的js对原密码使用RSA算法加密。也可为明码
service: 服务类型,如电信、移动、校园网(被js的中的encodeURLComponent()过两次)
queryString: 登录页面的载荷,把所有 = 、&、% 换成了对应的URL编码(同上)
operatorPwd:空值
operatorUserId:空值
validcode:空值
passwordEncrypt: true,表示密码经过加密了;false时密码则以明文发送。阅读js得知判断是否加密是看密码长度是否超过150
登录使用curl模拟post方法,带上载荷(主要是userId,password,service,queryString)即可。但是如果路由器网页认证登录上校园网后,再想下线就比较难,必须等一段时间自动下线,所以不着急登录、先看看下线操作。认证成功后会跳转到一个认证成功的界面,并且以json格式发送来一个userIndex,其长度较长、应该加密过;已在线时访问根页面也会跳转到认证成功页面。在认证成功的界面点击下线,发现下线的操作是通过post发送userIndex到http://192.168.xxx.xxx/eportal/InterFace.do?method=logout
。那么上下线的操作都有了,接下来开始写脚本(附带注释):
#!/bin/ash
#进入工作目录
cd ~/school_net
#~/school_net/account是用来存放账号密码服务类型的,后面会附上格式
account_file=`find -name "account" | wc -l`
if [ $account_file -eq 0 ]; then
echo "~/school_net/account file not exist. Please establish one!"
exit 0
fi
userId=`tail ./account | grep "userId" | awk '{print $1}' | awk 'BEGIN{FS="="} {print $2}'`
password=`tail ./account | grep "password" | awk '{print $1}' | awk 'BEGIN{FS="="} {print $2}'`
service=`tail ./account | grep "service" | awk '{print $1}' | awk 'BEGIN{FS="="} {print $2}'`
if [ $service -eq 1 ]; then
service_1="internet" #对应 校园网 服务类型
elif [ $service -eq 2 ]; then
service_1="%E7%A7%BB%E5%8A%A8%E5%87%BA%E5%8F%A3" #对应 中国移动
elif [ $service -eq 3 ]; then
service_1="%E7%94%B5%E4%BF%A1%E5%87%BA%E5%8F%A3" #电信
fi
#没有试过不加UA,保险起见都加上
UserAgent=`tail ./account | grep "User-Agent" | awk 'BEGIN{FS="="} {print $2}' | awk 'BEGIN{FS="#"} {print $1}'`
encodeURLComponent() # 转换=,&,%
{
s0=$1
s1=${s0//=/%3D}
s2=${s1//&/%26}
s3=${s2//%/%25} # %在最后,所以过一次本函数等于js的同名函数两次
echo $s3
}
get_queryString()
{
info=$(wget -O - -U "$UserAgent" http://192.168.xxx.xxx)
already_login=`echo "$info" | grep "DOCTYPE" | wc -l` #已在线时,访问该网页会返回html而非json
if [ $already_login -gt 0 ]; then
echo "1"
exit 0
fi
s1=`echo $info | awk 'BEGIN{FS="?"} {print $2}' | awk 'BEGIN{FS="\047"} {print $1}'` #\047为单引号
s2=$(encodeURLComponent $s1)
echo $s2 > ./queryString
echo $s2
}
login()
{
queryString=$(get_queryString)
if [ "$queryString" == "1" ]; then
echo "Reloginning... already online, exit"
exit 0
fi
service_2=$(encodeURLComponent $service_1) #service_1是汉字转一次码,这里只转了一次
echo $service_2 > ./service
payload="userId=${userId}&password=${password}&service=${service_2}&queryString=${queryString}&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=false"
echo $payload > ./login_payload
curl -o ./login_info -A "$UserAgent" -d "$payload" "http://192.168.xxx.xxx/eportal/InterFace.do?method=login" #wget的--post-data在载荷太长时一直不能生效。也可能是特殊标点的问题
s0=`cat ./login_info`
s1=${s0#*:\"}
s2=${s1%%\"*}
echo $s2 > ./userIndex
echo $s2
}
logout()
{
userIndex=`cat ./userIndex`
wget -O ./logout_info -U "$UserAgent" --post-data="userIndex=${userIndex}" http://192.168.xxx.xxx/eportal/InterFace.do?method=logout
}
login
#logout
exit 0
account文件的格式如下:
userId=123456 #student ID
password=123456 #password
service=1 #type of service. 1=school internet, 2=Mobile, 3=Telecom
User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36#fake User-Agent. Dont fix unless experienced
然后在路由器的/root下新建school_net文件夹,使用WinSCP上传脚本文件(命名为school_net.sh)和account文件。修改权限(chmod 755 school_net.sh
),开始测试,脚本文件改一下:
login
#logout
改为
login
wget http://bing.com
sleep 5s
logout
运行脚本,在/root/school_net下生成各种临时文件,查看login_info和logout_info可以得知上线下线是否成功。其中的index.html打开,显示bing首页,脚本成功实现了路由器自动上下线。之后把脚本最后改回去。
在openwrt里,System-Scheduled Tasks 提供了crontab的GUI文本输入。可以让脚本10min运行一次,在文本框中添加:
0 5 * * 1 sleep 1m && reboot
*/10 * * * * /root/school_net/school_net.sh
顺便加上每周一5点重启的命令。另外,脚本不能太频繁运行,否则登录界面会带验证码,以4C路由器的性能恐怕不能识别验证码。
最后,需要让脚本能开机自启动。openwrt有/etc/rc.local,直接在其中添加:
/root/school_net/school_net.sh
openwrt上添加到serivce和普通发行版不太一样(官网范例),在/etc/init.d中编写一个脚本school_net:
#!/bin/sh /etc/rc.common
# "new(er)" style init script
# Look at /lib/functions/service.sh on a running system for explanations of what other SERVICE_
# options you can use, and when you might want them.
START=50
STOP=1
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
start() {
/root/school_net/school_net_login.sh > /root/school_net/school_net.log
}
stop() {
/root/school_net/school_net_logout.sh > /root/school_net/school_net.log
}
因为想控制断网,所以把school_net.sh分成了两个,还加了log文件,另外把debug性质的输出都注释了。下面是login和logout修改后的完整版:
school_net_login.sh:
#!/bin/ash
cd ~/school_net
account_file=`find -name "account" | wc -l`
if [ $account_file -eq 0 ]; then
echo "~/school_net/account file not exist. Please establish one!"
exit 0
fi
userId=`tail ./account | grep "userId" | awk '{print $1}' | awk 'BEGIN{FS="="} {print $2}'`
password=`tail ./account | grep "password" | awk '{print $1}' | awk 'BEGIN{FS="="} {print $2}'`
service=`tail ./account | grep "service" | awk '{print $1}' | awk 'BEGIN{FS="="} {print $2}'`
if [ $service -eq 1 ]; then
service_1="internet"
elif [ $service -eq 2 ]; then
service_1="%E7%A7%BB%E5%8A%A8%E5%87%BA%E5%8F%A3"
elif [ $service -eq 3 ]; then
service_1="%E7%94%B5%E4%BF%A1%E5%87%BA%E5%8F%A3"
fi
UserAgent=`tail ./account | grep "User-Agent" | awk 'BEGIN{FS="="} {print $2}' | awk 'BEGIN{FS="#"} {print $1}'`
encodeURLComponent() # convert =,&,% to url encode
{
s0=$1
s1=${s0//=/%3D}
s2=${s1//&/%26}
s3=${s2//%/%25} # % replaced last, meaning this func actually encodes twice
echo $s3
}
get_queryString()
{
info=$(wget -O - -U "$UserAgent" http://192.168.xxx.xxx)
already_login=`echo "$info" | grep "DOCTYPE" | wc -l`
if [ $already_login -gt 0 ]; then
echo "1"
exit 0
fi
s1=`echo $info | awk 'BEGIN{FS="?"} {print $2}' | awk 'BEGIN{FS="\047"} {print $1}'`
s2=$(encodeURLComponent $s1)
#echo $s2 > ./queryString
echo $s2
}
login()
{
queryString=$(get_queryString)
if [ "$queryString" == "1" ]; then
echo "Reloginning... already online, exit"
exit 0
fi
service_2=$(encodeURLComponent $service_1) # as for $service_1, encodeURLComponent works only once
#echo $service_2 > ./service
payload="userId=${userId}&password=${password}&service=${service_2}&queryString=${queryString}&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=false"
#echo $payload > ./login_payload
s0=$(curl -A "$UserAgent" -d "$payload" "http://192.168.xxx.xxx/eportal/InterFace.do?method=login")
s1=${s0#*:\"}
s2=${s1%%\"*}
echo $s2 > ./userIndex
echo $s2
echo "login success"
}
login
exit 0
school_net_logout.sh:
#!/bin/ash
cd ~/school_net
UserAgent=`tail ./account | grep "User-Agent" | awk 'BEGIN{FS="="} {print $2}' | awk 'BEGIN{FS="#"} {print $1}'`
logout()
{
userIndex=`cat ./userIndex`
logout_info=$(wget -O - -U "$UserAgent" --post-data="userIndex=${userIndex}" http://192.168.xxx.xxx/eportal/InterFace.do?method=logout)
#echo $logout_info > ./logout_info
echo "logout success"
}
logout
exit 0
最后做一些收尾:
chmod 755 /etc/init.d/school_net
chmod 755 /root/school_net/school_net_login.sh
chmod 755 /root/school_net/school_net_logout.sh
touch /root/school_net/school_net.log
chmod 766 /root/school_net/school_net.log
/etc/init.d/school_net enable
另外把crontab里改成:
*/10 * * * * /etc/init.d/school_net start
现在自连校园网的路由器就配置完成了。工作目录在/root/school_net,可以通过/etc/init.d/school_net start
或stop
控制上下线,开机和每10min自连校园网,账号信息在/root/school_net/account中配置,log为/root/school_net/school_net.log。
文章浏览阅读5.8k次。在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理。今天我们的大数据入门分享,就主要来讲讲,Hive应用场景。关于Hive,首先需要明确的一点就是,Hive并非数据库,Hive所提供的数据存储、查询和分析功能,本质上来说,并非传统数据库所提供的存储、查询、分析功能。Hive..._hive应用场景
文章浏览阅读496次。Zblog是由Zblog开发团队开发的一款小巧而强大的基于Asp和PHP平台的开源程序,但是插件市场上的Zblog采集插件,没有一款能打的,要么就是没有SEO文章内容处理,要么就是功能单一。很少有适合SEO站长的Zblog采集。人们都知道Zblog采集接口都是对Zblog采集不熟悉的人做的,很多人采取模拟登陆的方法进行发布文章,也有很多人直接操作数据库发布文章,然而这些都或多或少的产生各种问题,发布速度慢、文章内容未经严格过滤,导致安全性问题、不能发Tag、不能自动创建分类等。但是使用Zblog采._zblog 网页采集插件
文章浏览阅读2.4k次,点赞2次,收藏2次。restUI页面提交1.1 添加上传jar包1.2 提交任务job1.3 查看提交的任务2. 命令行提交./flink-1.9.3/bin/flink run -c com.qu.wc.StreamWordCount -p 2 FlinkTutorial-1.0-SNAPSHOT.jar3. 命令行查看正在运行的job./flink-1.9.3/bin/flink list4. 命令行查看所有job./flink-1.9.3/bin/flink list --all._flink定时运行job
文章浏览阅读1k次,点赞2次,收藏6次。这个项目是基于STM32的LED闪烁项目,主要目的是让学习者熟悉STM32的基本操作和编程方法。在这个项目中,我们将使用STM32作为控制器,通过对GPIO口的控制实现LED灯的闪烁。这个STM32 LED闪烁的项目是一个非常简单的入门项目,但它可以帮助学习者熟悉STM32的编程方法和GPIO口的使用。在这个项目中,我们通过对GPIO口的控制实现了LED灯的闪烁。LED闪烁是STM32入门课程的基础操作之一,它旨在教学生如何使用STM32开发板控制LED灯的闪烁。_嵌入式stm32闪烁led实验总结
文章浏览阅读63次。本文介绍了安装和部署Debezium的详细步骤,并演示了如何将Debezium服务托管到systemctl以进行方便的管理。本文将详细介绍如何安装和部署Debezium,并将其服务托管到systemctl。解压缩后,将得到一个名为"debezium"的目录,其中包含Debezium的二进制文件和其他必要的资源。注意替换"ExecStart"中的"/path/to/debezium"为实际的Debezium目录路径。接下来,需要下载Debezium的压缩包,并将其解压到所需的目录。
文章浏览阅读4.4k次。需求:在诗词曲文项目中,诗词整篇朗读的时候,文章没有读完会因为屏幕熄灭停止朗读。要求:在文章没有朗读完毕之前屏幕常亮,读完以后屏幕常亮关闭;1.权限配置:设置电源管理的权限。
文章浏览阅读2.3k次。目标检测简介、评估标准、经典算法_目标检测
文章浏览阅读6.3k次,点赞4次,收藏9次。实训时需要安装SQL server2008 R所以我上网上找了一个.exe 的安装包链接:https://pan.baidu.com/s/1_FkhB8XJy3Js_rFADhdtmA提取码:ztki注:解压后1.04G安装时Microsoft需下载.NET,更新安装后会自动安装如下:点击第一个傻瓜式安装,唯一注意的是在修改路径的时候如下不可修改:到安装实例的时候就可以修改啦数据..._sqlserver 127 0 01 无法连接
文章浏览阅读7.4k次。1. Object.keys(item); 获取到了key之后就可以遍历的时候直接使用这个进行遍历所有的key跟valuevar infoItem={ name:'xiaowu', age:'18',}//的出来的keys就是[name,age]var keys=Object.keys(infoItem);2. 通常用于以下实力中 <div *ngFor="let item of keys"> <div>{{item}}.._js 遍历对象的key
文章浏览阅读2.2w次,点赞51次,收藏310次。粒子群算法求解路径规划路径规划问题描述 给定环境信息,如果该环境内有障碍物,寻求起始点到目标点的最短路径, 并且路径不能与障碍物相交,如图 1.1.1 所示。1.2 粒子群算法求解1.2.1 求解思路 粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。 在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的_粒子群算法路径规划
文章浏览阅读353次。所谓稳健的评估指标,是指在评估的过程中数据的轻微变化并不会显著的影响一个统计指标。而不稳健的评估指标则相反,在对交易系统进行回测时,参数值的轻微变化会带来不稳健指标的大幅变化。对于不稳健的评估指标,任何对数据有影响的因素都会对测试结果产生过大的影响,这很容易导致数据过拟合。_rar 海龟
文章浏览阅读607次,点赞2次,收藏7次。–基于STM32F103ZET6的UART通讯实现一、什么是IAP,为什么要IAPIAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给_value line devices connectivity line devices