用树莓派为平台实现校园网登录

小半年前由于疫情原因,实验室的各位都只能远程搞科研。 然而大家都碰到了一个很现实的问题:学校虽然有免费的校园网,但是学校的网络系统会在每天凌诚把所有在线的人踢下线,于是乎大家的远程就

全 部 木 大

只能等着第二天导师上班的时候到实验室帮忙登录一下。再后来(大概七月二十来号)我被导师抓到学校当了工具人,工具人之余就有了下面的对话:

导师:“xxx啊,你知不知道对面实验室搞了个每天自动登录校园网的东西啊”
我:“我不知道,不过可以去问问”(内心OS:“怕不是又要当工具人搞自动登录”)
导师:“好像是一个什么脚本跑在路由器上,这样吧,我去买个路由器,回来刷下系统,你把我们实验室的自动登录也弄好。”
我:“好的”(内心OS:“果然,但是有新的华硕路由器玩感觉也挺不错的”)

后续又问了问,发现脚本不是我想的那样用shell写的,居然是用Python写的,那不就是爬虫了么。呜呼哀哉,哪家路由器这么强能跑Python解释器啊。细问才知道脚本是跑在服务器上的,我们实验室泡在服务器上怕不是会被臭骂一顿,刚好我还有块吃灰很久的树莓派3B+,干脆就拿这个搭自动登录了。
结果由于各种神奇的原因(中间家里有事,大家回学校不需要自动登陆了),这套东西一个月之前(十月左右)才正式搭好开始运行,后面又被导师要求出个配置手册,美其名曰“你走了不就没人会用这个了?”(你还能阻止我拔树莓派么233),又摸了两周终于把手册写出来了。具体内容就放下面了,总之大家就看个笑话,我也是菜鸡一个,大家多多批评哈。

校园网自动登录脚本配置手册

系统搭建在Raspberry Pi Model 3B+上,系统信息如图下:

neofetch.png

一,树莓派系统烧录

需要准备的材料:

  • 一块树莓派(不能是Raspberry Pi 0
  • 一张大于等于16G的SD卡和读卡器,或一块U盘

1,使用Raspberry Pi imager烧写

国内网络原因,不是很建议使用这种方式,下载过于慢

访问树莓派官网,并下载官方烧录工具

根据自己对应的系统类型下载

rasp_download.png

对于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项下载。

download_image.png

下载BelenaEtcher并安装。安装完成后打开,选择下载的镜像和代刷写的SD卡,按下Flash完成刷写。

belena.png

二,树莓派配置

1,通过SSH访问树莓派

系统刷写完成后,在文件管理器中打开SD卡,创建名为“SSH”的文件,完成后将SD卡插入树莓派,连接网线上电启动。

访问路由器管理界面,查看树莓派的ip地址(426的路由器应该是固定为了192.168.50.114),路由器账号密码如下:

user:xxxxxx
password:*********

查看ip地址位于路由器首页阅览名单位置,树莓派名称应为raspberrypiaabbcco-s-pi

pi_ip.png

使用Powershell(Windows)或Terminal(Linux)访问树莓派,命令为

ssh pi@

raspberry ip为树莓派对应的ip地址,初始密码为raspberry

rasplogin.png

至此完成登陆步骤

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
selenium.png

安装chromium-chromedriver

sudo apt-get install chromium-chromedriver

查看安装路径

dpkg -L chromium-chromedriver
chromedriver.png

四,自动登录脚本配置

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

至此,所有配置已完成

你可能感兴趣的:(用树莓派为平台实现校园网登录)