cover

浙江大学ルーター設定ガイド

sorcererxw

新入学したばかりで、学校のネットワークがsrun 3000で認証することを知りました。クライアントを使用することも、ウェブページで認証することもできます。しかし、クライアントでもウェブページでも、ログイン後に閉じることができないウィンドウがあり、閉じるとネットワークが切断されます。新しいデスクトップに移して目に見えなくすることもできますが、目に見えなければ心も煩わない、これは我慢できないことです。

幸いにも、自分のルーターを持ってきました。私のルーターはASUSのP1900で、オリジナルのMerlinシステムをインストールしていますが、以下の操作はOpenWRTにも同じです。

失敗:Linuxクライアントを使用する

196.0.0.6 のドキュメントには、Linux でのログインについて、srun 3000 の専用 auth プログラムを使用してログインする方法が記載されています。

しかし、テストした結果、このプログラムはルーター上で実行することができず、Syntax error: "(" unexpected のエラーが発生しました。Googleで調べたところ、このクライアントのコンパイル方法がルーター上で実行できないことがわかりました。

シミュレーションログイン

クライアントがダメなら、模擬ログインを試してみましょう。ウェブページでログインし、Chromeのコンソールで確認したところ、192.0.0.6/cgi-bin/ にリクエストを送信していることがわかりました。ログインのユーザー名とパスワードはformdataに保存されています(パスワードはmd5で処理されていました)。

このようにして、curl コマンドを使用してログインすることもできますが、例外情報の処理が少し面倒になります。

ワンクリックスクリプト

検索してみたところ、GitHubにはすでに校内ネットワークの認証スクリプトがありました。作者に感謝します🙏

ルーターがネットワークに接続されていないため、プロジェクトを直接クローンすることができません。コードをここに貼り付けますので、SSHに直接コピー&ペーストしてください。

まず、ルーターの外部ネットワーク(WAN)を動的IPモードに切り替えます。

ssh でルーターにアクセスする

# 可以放置在任意的目录, 我放在 /jffs, 请不要选择 /tmp 目录, 包括 /tmp 下的任意子目录, 可能会被定时清除
mkdir /jffs/srunauth && cd $_
vi auth.sh

コードの一部を貼り付け、コメントに従って変更します。

#!/bin/bash 
# 如果路由器没有 bash ( /bin/bash ) 就替换成 /bin/sh
# Author HJK <https://github.com/0xHJK>

USERNAME='' # 填上用户名 ( 学号 )
PASSWORD='' # 密码 ( 直接填, 不需要 md5 )
USERSFILE='users.txt'
STATEFILE='state.txt'
DOMAIN='192.0.0.6'
COMMOND='do_login'
VERBOSE='y'

usage(){
    echo "Usage: bash `basename $0` [-q] [-u username] [-p password] [-f file] [Commond]"
    echo "Commonds: login, logout"
    exit 1
}
md5_hash(){
    if [[ `uname | grep 'Darwin'` ]]; then
        echo -n ${1} | md5 -q | cut -c9-24
    else
        echo -n ${1} | md5sum | cut -c9-24
    fi
}

say_out(){
    if [[ ${VERBOSE} == 'y' ]]; then echo $*; fi
}

submit(){
    msg=`curl -s "http://${DOMAIN}/cgi-bin/${1}" -H 'Pragma: no-cache' -H "Origin: http://${DOMAIN}" -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H "Referer: http://${DOMAIN}/" -H 'Connection: keep-alive' -H 'DNT: 1' --data "username=${2}&password=${3}&drop=0&type=1&n=1" --compressed`
    if [[ `echo ${msg} | grep 'ip_exist_error'` ]]; then
        echo "IP尚未下线  ${msg}"
    elif [[ `echo ${msg} | grep 'online_num_error'` ]]; then
        echo "账号 ${USERNAME} 登录人数超过限额 ${msg}"
    elif [[ `echo ${msg} | grep 'username_error'` ]]; then
        echo "用户名 ${USERNAME} 错误  ${msg}"
    elif [[ `echo ${msg} | grep 'password_error'` ]]; then
        echo "密码 ${PASSWORD} 错误  ${msg}"
    elif [[ `echo ${msg} | grep 'logout_ok'` ]]; then
        echo "账号 ${USERNAME} 注销成功  ${msg}"
    elif [[ `echo ${msg} | grep '[0-9]\{10,\}'` ]]; then
        echo "账号 ${USERNAME} 登录成功  ${msg}"
    else
        echo "未知消息 ${msg}"
    fi
}

# 当有参数时获取参数
if [ $# -gt 0 ]; then
    while getopts :qu:p:f: OPTION
    do
        case $OPTION in
            q) VERBOSE='n' ;;
            u) USERNAME=$OPTARG ;;
            p) PASSWORD=$OPTARG ;;
            f) USERSFILE=$OPTARG ;;
            \?) usage ;;
        esac
    done
fi

shift $(($OPTIND - 1)) # 如果这一句话出错, 注释掉

# 如果登录
if [ $# -eq 0 ] || [[ $1 == 'login' ]]; then
    # 如果账号密码为空,则从文件里读取
    if [[ ${USERNAME} == '' ]] || [[ ${PASSWORD} == '' ]]; then
        while read l1; do
            USERNAME=`echo -n $l1 | awk '{ print $1 }'`
            PASSWORD=`echo -n $l1 | awk '{ print $2 }'`
            say_out "正在尝试登录 ${USERNAME} ${PASSWORD}"
            PASSWORD=`md5_hash ${PASSWORD}`
            # 如果登录成功,则退出循环,并记录账号密码
            state=`submit 'do_login' ${USERNAME} ${PASSWORD}`
            say_out "state: ${state}"
            if [[ `echo "${state}" | grep '成功'` ]]; then
                echo "${USERNAME} 登录成功"
                echo "${USERNAME} ${PASSWORD}" > ${STATEFILE}
                exit
            fi
        done < ${USERSFILE}
        echo "所有账号登录失败"
    else
        say_out "正在尝试登录 ${USERNAME} ${PASSWORD}"
        PASSWORD=`md5_hash ${PASSWORD}`
        submit 'do_login' ${USERNAME} ${PASSWORD}
    fi
# 如果注销
elif [[ $1 == 'logout' ]]; then
    # 如果账号密码为空,则从文件里读取
    if [[ ${USERNAME} == '' ]] || [[ ${PASSWORD} == '' ]]; then
        USERNAME=`cat ${STATEFILE} | awk '{ print $1 }'`
        PASSWORD=`cat ${STATEFILE} | awk '{ print $2 }'`
        say_out "正在尝试注销 ${USERNAME} ${PASSWORD}"
    fi
    submit 'force_logout' ${USERNAME} ${PASSWORD}
else
    usage
fi

最後に:wqで終了します

chmod +x auth.sh
touch state.txt users.txt

設定完了

実行./auth.shでログインでき、./auth.sh logoutでログアウトできます。