├── README.md └── srun.sh /README.md: -------------------------------------------------------------------------------- 1 | 非常感谢[NaHCOx](https://github.com/CHxCOOH)与[chillsoul](https://github.com/chillsoul)的帮助,我只做了非常微薄的贡献。 2 | 3 | # 食用之前 4 | * 撰写本脚本的初衷是为了可以在路由器上运行 Srun ,您只需要获取到路由器的 Telnet/SSH 权限即可运行该脚本。 5 | * 本脚本已于 Padavan 和 Openwrt 固件的 Busybox 测试成功。 6 | * 更新使用 wget 替换 curl ,节约闪存。 7 | * 将脚本加入 Crontab 食用更佳。 8 | * 更详细的食用手册可以访问:https://blog.raincorn.top/2020/10/02/srun_login/ 。注意:该网站已归档处理,更新内容将会发布在[此](https://raincorn.top) 。 9 | * 已实现掉线自动登录,检测频率 1 分钟(受限于 crontab)。 10 | * 掉线检测原理:执行脚本时用 wget 访问 generate_204 页面,掉线时会被深澜系统重定向到登录页,对 wget 返回结果判断是否为空即可。 11 | 12 | # 食用手册 13 | * 下载脚本:`wget https://github.com/CHxCOOH/Srun_Linux/raw/master/srun.sh`。如无法下载可在其他设备上下载后,使用 sftp 等方式传入,或者考虑使用镜像网站提供的脚本(不会及时更新):`wget https://imgs.raincorn.top/file/srun.sh`。 14 | * 授予脚本可执行权限:`chmod +x ./srun.sh`。 15 | * 运行:`srun.sh username passwd`,username与passwd需要修改为您的账号与密码,例如 `./srun.sh 201916660212 123456`。 16 | * 使用 `crontab -e` 对计划任务进行编辑来每分钟检测在线状态,如果掉线则自动重新登录,并将 log 写入 `~/login.log`,计划任务的写法如下: 17 | 18 | ``` 19 | * * * * * /root/srun.sh username passwd 20 | # /root/srun.sh自行修改为脚本路径 21 | ``` 22 | 23 | * 如有需要,可自行修改脚本,关闭 log。 24 | 25 | # 其它 26 | 27 | * 我的路由器是斐讯K2 OpenWrt固件,29.9软妹币购于拼爹爹。 28 | * Padavan路由器固件会在重启后删除缓存,请将脚本储存于`/etc/storage`。 29 | * ~~准备加入下线自动连接,敬请期待~~(已加入) 30 | * 已在 OpenWrt 完成测试,正常情况下约 18h 下线一次。如果频繁掉线,可能是触发了多设备检测。~~等待进一步测试~~ 31 | -------------------------------------------------------------------------------- /srun.sh: -------------------------------------------------------------------------------- 1 | #!/bin/ash 2 | signin() { 3 | Stu_No=$1 4 | Stu_Passwd=$2 5 | URL="http://172.16.154.130:69/cgi-bin/srun_portal" 6 | Encrypted_No="{SRUN3}\r\n" 7 | Encrypted_Passwd="" 8 | 9 | for i in `seq ${#Stu_No}` 10 | do 11 | letter=$(printf "%d" "'${Stu_No:$(($i-1)):1}") 12 | let letter=letter+4 13 | letter=$(printf \\x`printf %x $letter`) 14 | Encrypted_No=$Encrypted_No$letter 15 | done 16 | 17 | for i in `seq ${#Stu_Passwd}` 18 | do 19 | i=$(($i-1)) 20 | letter=$(printf "%d" "'${Stu_Passwd:$i:1}") 21 | if test $i -eq 0 22 | then 23 | ki=$(($letter^48)) 24 | else 25 | ki=$(($letter^((10-i%10)+48))) 26 | fi 27 | _l=$((($ki&0x0f)+0x36)) 28 | _h=$((($ki>>4&0x0f)+0x63)) 29 | _l=$(printf \\x`printf %x $_l`) 30 | _h=$(printf \\x`printf %x $_h`) 31 | if test $(($i%2)) -eq 1 32 | then 33 | result=$_h$_l 34 | else 35 | result=$_l$_h 36 | fi 37 | Encrypted_Passwd=$Encrypted_Passwd$result 38 | done 39 | 40 | #echo `urlencode $Encrypted_No` 41 | #echo `urlencode $Encrypted_Passwd` 42 | sigin_result=$(wget -qO- --post-data=$(printf "username=";urlencode $Encrypted_No;printf "&password=";urlencode $Encrypted_Passwd;printf "&ac_id=1&action=login&type=3&n=117&mbytes=0&minutes=0&drop=0&pop=1&mac=02:00:00:00:00:00") $URL 43 | ) 44 | echo $sigin_result 45 | if [[ $sigin_result == login_ok* ]] 46 | then 47 | return 1 48 | else 49 | return 0 50 | fi 51 | } 52 | 53 | urlencode() { 54 | # urlencode 55 | local LANG=C 56 | for i in `seq ${#1}` 57 | do 58 | local c="${1:$(($i-1)):1}" 59 | case $c in 60 | [a-zA-Z0-9.~_-]) printf "$c" ;; 61 | *) printf '%%%02X' "'$c" ;; 62 | esac 63 | done 64 | } 65 | 66 | # 220911开启了防共享检测,这里模拟设备UA,可自行修改(或删除)--user-agent参数 67 | test_result=$(wget -qO- http://connect.rom.miui.com/generate_204 --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.33") 68 | if [ -z "$test_result" ]; then 69 | echo "User is online" 70 | else 71 | echo "User is offline, trying to reconnect..." 72 | echo "$(date '+%Y-%m-%d %X') User is offline, trying to login..." >> /root/login.log 73 | # $1 用户名 $2 密码 74 | signin $1 $2 75 | if test $? -eq 1; then 76 | echo "User is connected" 77 | echo "$(date '+%Y-%m-%d %X') User is logined successfully" >> /root/login.log 78 | else 79 | echo "User connect failed" 80 | echo "$(date '+%Y-%m-%d %X') User failed to login" >> /root/login.log 81 | fi 82 | fi 83 | --------------------------------------------------------------------------------