小半年前由于疫情原因,实验室的各位都只能远程搞科研。 然而大家都碰到了一个很现实的问题:学校虽然有免费的校园网,但是学校的网络系统会在每天凌诚把所有在线的人踢下线,于是乎大家的远程就
全 部 木 大
只能等着第二天导师上班的时候到实验室帮忙登录一下。再后来(大概七月二十来号)我被导师抓到学校当了工具人,工具人之余就有了下面的对话:
导师:“xxx啊,你知不知道对面实验室搞了个每天自动登录校园网的东西啊”
我:“我不知道,不过可以去问问”(内心OS:“怕不是又要当工具人搞自动登录”)
导师:“好像是一个什么脚本跑在路由器上,这样吧,我去买个路由器,回来刷下系统,你把我们实验室的自动登录也弄好。”
我:“好的”(内心OS:“果然,但是有新的华硕路由器玩感觉也挺不错的”)
后续又问了问,发现脚本不是我想的那样用shell写的,居然是用Python写的,那不就是爬虫了么。呜呼哀哉,哪家路由器这么强能跑Python解释器啊。细问才知道脚本是跑在服务器上的,我们实验室泡在服务器上怕不是会被臭骂一顿,刚好我还有块吃灰很久的树莓派3B+,干脆就拿这个搭自动登录了。
结果由于各种神奇的原因(中间家里有事,大家回学校不需要自动登陆了),这套东西一个月之前(十月左右)才正式搭好开始运行,后面又被导师要求出个配置手册,美其名曰“你走了不就没人会用这个了?”(你还能阻止我拔树莓派么233),又摸了两周终于把手册写出来了。具体内容就放下面了,总之大家就看个笑话,我也是菜鸡一个,大家多多批评哈。
校园网自动登录脚本配置手册
系统搭建在Raspberry Pi Model 3B+上,系统信息如图下:
一,树莓派系统烧录
需要准备的材料:
- 一块树莓派(不能是Raspberry Pi 0)
- 一张大于等于16G的SD卡和读卡器,或一块U盘
1,使用Raspberry Pi imager烧写
国内网络原因,不是很建议使用这种方式,下载过于慢
访问树莓派官网,并下载官方烧录工具
根据自己对应的系统类型下载
对于Raspberry Pi OS,可以直接使用apt命令安装,安装命令如下:
sudo apt install rpi-image
软件安装完成后进入,Operating system选择Raspbarry Pi OS(32bit),如果对其他操作系统更熟悉的话,也可选择其他镜像。SD Card 选择准备好的内存卡/U盘,按下write等待系统刷写完成。
2,下载并刷写系统镜像
访问树莓派镜像下载地址,选择Raspberry Pi OS with desktop and recommended software项下载。
下载BelenaEtcher并安装。安装完成后打开,选择下载的镜像和代刷写的SD卡,按下Flash完成刷写。
二,树莓派配置
1,通过SSH访问树莓派
系统刷写完成后,在文件管理器中打开SD卡,创建名为“SSH”的文件,完成后将SD卡插入树莓派,连接网线上电启动。
访问路由器管理界面,查看树莓派的ip地址(426的路由器应该是固定为了192.168.50.114),路由器账号密码如下:
user:xxxxxx
password:*********
查看ip地址位于路由器首页阅览名单位置,树莓派名称应为raspberrypi或aabbcco-s-pi
使用Powershell(Windows)或Terminal(Linux)访问树莓派,命令为
ssh pi@
raspberry ip为树莓派对应的ip地址,初始密码为raspberry
至此完成登陆步骤
2,更新软件源
a.清华源
清华源由清华大学TUNA协会(清华大学学生网络与开源软件协会)提供,网址在此,网站上有如何使用该软件园的帮助文档,摘抄基于Debian10(buster)的换源方法如下:
# 编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
# 编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
b.中科大源
中科大源由中国科学技术大学网络信息中心提供支持,由LUG@USTC(中国科学技术大学Linux用户协会)维护.同样的,在软件源网站上也有如何使用该源的帮助文档,摘抄于网页的换源方法如下:
将 /etc/apt/sources.list 文件中默认的源地址 http://raspbian.raspberrypi.org/ 替换为 http://mirrors.ustc.edu.cn/raspbian/ 即可。
raspbian 2018-04-19 之后的镜像默认源已经更改,用如下命令替换:
sudo sed -i 's|raspbian.raspberrypi.org|mirrors.ustc.edu.cn/raspbian|g' /etc/apt/sources.list
当然也可以直接编辑 /etc/apt/sources.list 文件(需要使用 sudo)。删除原文件所有内容,用以下内容取代(以 Buster 示例):
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi #deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
编辑源文件方法为:
sudo nano
或
sudo vi
编辑源文件后,在命令行运行:
sudo apt-get update
sudo apt-get upgrade
三,Python环境配置
登录脚本使用了模拟浏览器,需要在python环境中安装selenium包,chromium浏览器和配合selenium使用的chromium-chromedriver。不过Raspberry Pi OS自带了cheomium,这里只要安装selenium和配套的chromium-chromedriver
安装selenium
pip3 install selenium
安装chromium-chromedriver
sudo apt-get install chromium-chromedriver
查看安装路径
dpkg -L chromium-chromedriver
四,自动登录脚本配置
1,Python脚本:
自动登录脚本使用了之前配置的Python环境和系统(很可能)自带的cron定时任务服务,Python脚本如下:
import time
import logging
import socket
from selenium import webdriver
Chrome_driver_root = ""
def init_logger():
logging.basicConfig(level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
filename="")
logger = logging.getLogger("netlogger")
return logger
def is_connected(logger):
'''
show if the net is connected
'''
s = socket.socket()
status = s.connect_ex(("www.bing.com", 443))
try:
if status == 0:
return True
else:
return False
except Exception:
logger.critical("an Exception happend, check your system")
return False
if __name__ == "__main__":
logger = init_logger()
if not is_connected(logger):
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('blink-settings=imagesEnabled=false')
options.add_argument('--disable-gpu')
browser = webdriver.Chrome(Chrome_driver_root, options=options)
try:
browser.get("http://www.msftconnecttest.com/redrict")
time.sleep(1)
browser.find_element_by_id("userphone").send_keys("<学号>")
time.sleep(1)
browser.find_element_by_id("password").send_keys("<密码>")
time.sleep(1)
browser.find_element_by_id("mobilelogin_submit").click()
time.sleep(1)
if is_connected(logger):
logger.info("network reconnected")
else:
logger.warning(
"login filed, waiting for the next login")
browser.quit()
except Exception:
browser.quit()
logger.critical("An Exception happend, check your system")
else:
logger.info("network still connected,waiting for the next ask")
2,cron定时任务
a.安装cron
一般的Linux发行版都会带cron模块,而且是默认运行的,查询cron是否在工作可以用
systemctl status cron.service
或
service cron status
如果看到如下文字即说明cron已安装且正在运行,第四行为active(running)
pi@aabbcco-s-pi:~ $ systemctl status cron.service
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-11-24 16:08:49 CST; 19h ago
Docs: man:cron(8)
Main PID: 331 (cron)
Tasks: 1 (limit: 1939)
CGroup: /system.slice/cron.service
└─331 /usr/sbin/cron -f
若cron安装完成但未运行,应有如下显示,第四行为inactive(dead)
pi@aabbcco-s-pi:~ $ systemctl status cron.service
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2020-11-25 12:25:04 CST; 4s ago
Docs: man:cron(8)
Process: 331 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=killed, signal=TERM)
Main PID: 331 (code=killed, signal=TERM)
此时可以运行
sudo systemctl start cron.service
启动服务
若cron未安装,则使用
sudo apt-get install cron
进行安装
b.配置cron
这里使用crontab命令对其进行配置,命令为
crontab -u -e
第一次使用会弹出编辑器选择按钮,建议使用nano,配置文件如下
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
具体用法不再赘述,有疑问的话请看这篇博客
编写这篇文章时脚本文件为netlogin.py,位于~/scripts文件夹,每天凌晨0点到1点每隔20分钟运行一次,表达式为
*/20 0 * * * python3 /home/pi/scripts/netlogin.py
至此,所有配置已完成