diff --git a/README.md b/README.md index 2bece2b..d892d1b 100644 --- a/README.md +++ b/README.md @@ -53,17 +53,18 @@ opkg update && opkg install curl && curl --create-dirs -L "https://github.com/Su ``` 用法:esfshell <操作> [选项] [...] 操作: - esfshell {-L --login} 登陆到校园网 - esfshell {-O --logout} 注销校园网 - esfshell {-D --daemon} 监控模式 - esfshell {-C --custom} 调用自定义函数 - esfshell {-h --help} 显示本帮助 + esfshell {-L --login} 登陆到校园网 + esfshell {-O --logout} 注销校园网 + esfshell {-D --daemon} 监控模式 + esfshell {-C --custom} <函数名> 调用自定义函数 + esfshell {-h --help} 显示本帮助 选项: - -a, --account 账号 - -p, --password 密码 - -d, --device 指定网口 - -f, --force 强制登陆 - -v, --verbose 显示详细信息 + -a, --account <账号> 账号 + -p, --password <密码> 密码 + -d, --device <网口> 指定网口 + -f, --force 强制登陆 + -v, --verbose 显示详细信息 + --home <主目录> 指定主目录 ``` ### 手把手教你最简单的登陆 @@ -127,12 +128,17 @@ _ES_ACC_PASSWD=登录密码 _ES_GLOBAL_DEVICE=指定网卡 _ES_HOMEPATH=主文件夹路径,用于存储初始化文件、登录缓存和运行日志 +_ES_LANG=强制使用指定语言 + +_ES_FORCE=启用强制登陆。需要提前指定 $_ES_NC_URLLOCATION 变量 +_ES_VERBOSE=显示详细信息 _ES_DAEMON_SLEEPTIME=监听模式执行间隔(单位详见sleep --help) _ES_LOG_ENABLE=是否启用日志。布尔值,默认False _ES_LOG_PATH=日志路径。默认"$_ES_HOMEPATH/esfshell.log" _ES_LOG_MAXSIZE=日志最大大小,超出后将移除旧日志 +_ES_LOG_TAILLINE=超出日志大小后裁剪保留的行数 _ES_LOG_TIMESTAMP=日志内容时间戳,默认"+%Y-%m-%d %H:%M:%S" # 如有特殊需要,否则最好不要编辑以下内容 @@ -158,6 +164,7 @@ _ES_CONFIG_SCHOOLID=登录/注销学校ID _ES_NC_URL=HTTP204验证服务器,默认"http://connect.rom.miui.com/generate_204" _ES_REDIR_URL=网络登录跳转检测链接,用于检测是否跳转到该登录页。默认"enet.10000.gd.cn:10001" +_ES_NC_URLLOCATION=强制使用该登录链接,配合-f/--force使用 ``` ## 参考项目 diff --git a/esfshell.sh b/esfshell.sh index 097bdb1..c7e42b5 100644 --- a/esfshell.sh +++ b/esfshell.sh @@ -84,17 +84,18 @@ if [[ $LANG =~ "zh_CN" ]] || [[ $_ES_LANG =~ "zh_CN" ]]; then help() { echo "用法:${0##*/} <操作> [选项] [...]" echo "操作:" - printf " ${0##*/} {-L --login}\t登陆到校园网\n" - printf " ${0##*/} {-O --logout}\t注销校园网\n" - printf " ${0##*/} {-D --daemon}\t监控模式\n" - printf " ${0##*/} {-C --custom}\t调用自定义函数\n" - printf " ${0##*/} {-h --help}\t显示本帮助\n" + printf " ${0##*/} {-L --login}\t\t登陆到校园网\n" + printf " ${0##*/} {-O --logout}\t\t注销校园网\n" + printf " ${0##*/} {-D --daemon}\t\t监控模式\n" + printf " ${0##*/} {-C --custom} <函数名>\t调用自定义函数\n" + printf " ${0##*/} {-h --help}\t\t\t显示本帮助\n" echo "选项:" - printf " -a, --account\t账号\n" - printf " -p, --password\t密码\n" - printf " -d, --device\t\t指定网口\n" - printf " -f, --force\t\t强制登陆\n" - printf " -v, --verbose\t显示详细信息\n" + printf " -a, --account <账号>\t\t账号\n" + printf " -p, --password <密码>\t密码\n" + printf " -d, --device <网口>\t\t指定网口\n" + printf " -f, --force\t\t\t强制登陆\n" + printf " -v, --verbose\t\t显示详细信息\n" + printf " --home <主目录>\t\t指定主目录\n" } else _ES_LANG_LOG_TOOLARGE="Log size too large, deleting outdate log..." @@ -154,17 +155,18 @@ else help() { echo "Usage:${0##*/} [Options] [...]" echo "Operation:" - printf " ${0##*/} {-L --login}\tLogin into esurfing network\n" - printf " ${0##*/} {-O --logout}\tLogout esurfing network\n" - printf " ${0##*/} {-D --daemon}\tDaemon mode\n" - printf " ${0##*/} {-C --custom}\tCall custom function\n" - printf " ${0##*/} {-h --help}\tShow this help\n" + printf " ${0##*/} {-L --login}\t\tLogin into esurfing network\n" + printf " ${0##*/} {-O --logout}\t\tLogout esurfing network\n" + printf " ${0##*/} {-D --daemon}\t\tDaemon mode\n" + printf " ${0##*/} {-C --custom} \tCall custom function\n" + printf " ${0##*/} {-h --help}\t\t\tShow this help\n" echo "Options:" - printf " -a, --account\tAccount\n" - printf " -p, --password\tPassword\n" - printf " -d, --device\t\tSpecify network interface\n" - printf " -f, --force\t\tForce login\n" - printf " -v, --verbose\tBe verbose\n" + printf " -a, --account \tAccount\n" + printf " -p, --password \tPassword\n" + printf " -d, --device \tSpecify network interface\n" + printf " -f, --force\t\t\tForce login\n" + printf " -v, --verbose\t\tBe verbose\n" + printf " --home \tSpecify home path\n" } fi @@ -193,7 +195,7 @@ createLog() { rm -f $_ES_LOG_PATH mv $_ES_LOG_PATH.tmp $_ES_LOG_PATH else - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOG_SIZE $((size / 1024))MiB/$((maxsize / 1024))MiB" fi fi @@ -382,7 +384,7 @@ logicActivateEther() { if [ -z "$_ES_GLOBAL_DEVICE" ]; then _ES_GLOBAL_DEVICE=$(getActivateEther) if [ "$_ES_GLOBAL_DEVICE" ]; then - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_ACTIVATE_ETHER $_ES_GLOBAL_DEVICE" fi else @@ -397,20 +399,20 @@ loginEnet() { # 获取用户IP和服务器IP printl Info "$_ES_LANG_LOGIN_GET_USERDATA" - _ES_GLOBAL_ENET_URL="http://$(getEnetHost $urlLocation)" + _ES_GLOBAL_ENET_URL="http://$(getEnetHost $_ES_NC_URLLOCATION)" - _ES_CONFIG_CLIENTIP=$(getIP $urlLocation clientip) + _ES_CONFIG_CLIENTIP=$(getIP $_ES_NC_URLLOCATION clientip) if [ $_ES_CONFIG_CLIENTIP ]; then - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_GET_CLIENTIP $_ES_CONFIG_CLIENTIP" fi else printl Error "$_ES_LANG_LOGIN_GET_CLIENTIP_FAILED" _ES_EXIT_CODE=1 fi - _ES_CONFIG_NASIP=$(getIP $urlLocation nasip) + _ES_CONFIG_NASIP=$(getIP $_ES_NC_URLLOCATION nasip) if [ $_ES_CONFIG_NASIP ]; then - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_GET_NASIP $_ES_CONFIG_NASIP" fi else @@ -422,14 +424,14 @@ loginEnet() { if [ $_ES_CONFIG_CLIENTIP ]; then _ES_CONFIG_MAC=$(getMAC $_ES_CONFIG_CLIENTIP) else - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_GET_MAC_RETRY" fi _ES_CONFIG_CLIENTIP=$(getLocalIP "$_ES_GLOBAL_DEVICE") _ES_CONFIG_MAC=$(getMAC $_ES_CONFIG_CLIENTIP) fi if [ $_ES_CONFIG_MAC ]; then - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_GET_MAC $_ES_CONFIG_MAC" fi else @@ -442,7 +444,7 @@ loginEnet() { _ES_CONFIG_SCHOOLID=$(getSchoolId $_ES_CONFIG_CLIENTIP $_ES_CONFIG_NASIP $_ES_CONFIG_MAC) fi if [ $_ES_CONFIG_SCHOOLID ]; then - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_GET_SCHOOLID $_ES_CONFIG_SCHOOLID" fi else @@ -455,7 +457,7 @@ loginEnet() { _ES_CONFIG_COOKIE=$(getCookie $_ES_CONFIG_SCHOOLID) fi if [ "$_ES_CONFIG_COOKIE" ]; then - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_GET_COOKIE $_ES_CONFIG_COOKIE" fi else @@ -466,7 +468,7 @@ loginEnet() { # 获取验证码 _ES_CONFIG_VERIFYCODE=$(getVerifyCode $_ES_ACC_USERNAME $_ES_CONFIG_CLIENTIP $_ES_CONFIG_NASIP $_ES_CONFIG_MAC $_ES_CONFIG_COOKIE) if [ $_ES_CONFIG_VERIFYCODE ]; then - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_GET_VERIFYCODE $_ES_CONFIG_VERIFYCODE" fi else @@ -479,7 +481,7 @@ loginEnet() { printl Info "$_ES_LANG_LOGIN_ING" if loginTask $_ES_ACC_USERNAME $_ES_ACC_PASSWD $_ES_CONFIG_CLIENTIP $_ES_CONFIG_NASIP $_ES_CONFIG_MAC "$_ES_CONFIG_COOKIE" $_ES_CONFIG_VERIFYCODE; then printl Info "$_ES_LANG_LOGIN_SUCCESS" - echo "_ES_GLOBAL_ENET_URL=$_ES_GLOBAL_ENET_URL" >>$_ES_HOMEPATH/esfshell.run + echo "_ES_GLOBAL_ENET_URL=$_ES_GLOBAL_ENET_URL" >$_ES_HOMEPATH/esfshell.run echo "_ES_CONFIG_CLIENTIP=$_ES_CONFIG_CLIENTIP" >>$_ES_HOMEPATH/esfshell.run echo "_ES_CONFIG_NASIP=$_ES_CONFIG_NASIP" >>$_ES_HOMEPATH/esfshell.run echo "_ES_CONFIG_MAC=$_ES_CONFIG_MAC" >>$_ES_HOMEPATH/esfshell.run @@ -487,7 +489,7 @@ loginEnet() { else printl Error "$_ES_LANG_LOGIN_FAILED" fi - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGIN_RESULT $_ES_RESULT_LOGING" fi else @@ -500,31 +502,40 @@ loginEnet() { login() { # 网络检测,若可以连接外网则退出 printl Info "$_ES_LANG_LOGIN_CHECK" - if [[ $ES_FORCE != true ]]; then + if [[ $_ES_FORCE != true ]]; then if networkCheck $_ES_NC_URL; then printl Info "$_ES_LANG_LOGIN_CHECK_SUCCESS" return fi fi # 开始登陆 - local urlCode=$(getUrlStatus $_ES_NC_URL code) - local urlLocation=$(getUrlStatus $_ES_NC_URL location) - if [[ "$urlCode" == "302" ]]; then - # 获取重定向地址 - printl Info "$_ES_LANG_LOGIN_CHECK_NEED" - if [[ $ES_VERBOSE == true ]]; then - printl Info "$_ES_LANG_LOGIN_CHECK_REDIRURL $urlLocation" - fi - if [[ $urlLocation =~ $_ES_REDIR_URL ]]; then + if [[ $_ES_FORCE == true ]]; then + if [[ $_ES_NC_URLLOCATION =~ $_ES_REDIR_URL ]]; then loginEnet else printl Error "$_ES_LANG_LOGIN_CHECK_REDIRURL_FAILED" _ES_EXIT_CODE=1 fi else - printl Error "$_ES_LANG_LOGIN_CHECK_FAILED" - _ES_EXIT_CODE=1 - return + local urlCode=$(getUrlStatus $_ES_NC_URL code) + _ES_NC_URLLOCATION=$(getUrlStatus $_ES_NC_URL location) + if [[ "$urlCode" == "302" ]]; then + # 获取重定向地址 + printl Info "$_ES_LANG_LOGIN_CHECK_NEED" + if [[ $_ES_VERBOSE == true ]]; then + printl Info "$_ES_LANG_LOGIN_CHECK_REDIRURL $_ES_NC_URLLOCATION" + fi + if [[ $_ES_NC_URLLOCATION =~ $_ES_REDIR_URL ]]; then + loginEnet + else + printl Error "$_ES_LANG_LOGIN_CHECK_REDIRURL_FAILED" + _ES_EXIT_CODE=1 + fi + else + printl Error "$_ES_LANG_LOGIN_CHECK_FAILED" + _ES_EXIT_CODE=1 + return + fi fi } @@ -536,24 +547,27 @@ logout() { printl Warning "$_ES_LANG_LOGOUT_RUNFILE_LOST_A $_ES_HOMEPATH/esfshell.run $_ES_LANG_LOGOUT_RUNFILE_LOST_B" fi - # 若变量缺失值则尝试获取 - if [ -z $_ES_CONFIG_CLIENTIP ]; then - printl Warning "$_ES_LANG_LOGOUT_GET_CLIENT_FAILED" - _ES_CONFIG_CLIENTIP=$(getLocalIP "$_ES_GLOBAL_DEVICE") - fi - if [ -z $_ES_CONFIG_MAC ]; then - printl Warning "$_ES_LANG_LOGOUT_GET_MAC_FAILED" - _ES_CONFIG_MAC=$(getMAC $_ES_CONFIG_CLIENTIP) - fi - if [ -z $_ES_CONFIG_NASIP ]; then - printl Warning "$_ES_LANG_LOGOUT_GET_NASIP_FAILED" - read -p "$_ES_LANG_LOGOUT_GET_NASIP_MANUAL " _ES_CONFIG_NASIP - fi - if [ -z "$_ES_CONFIG_COOKIE" ]; then - printl Warning "$_ES_LANG_LOGOUT_GET_COOKIE_FAILED" - read -p "$_ES_LANG_LOGOUT_GET_COOKIE_MANUAL " _ES_CONFIG_COOKIE + if [[ $_ES_FORCE != true ]]; then + # 若变量缺失值则尝试获取 + if [ -z $_ES_CONFIG_CLIENTIP ]; then + printl Warning "$_ES_LANG_LOGOUT_GET_CLIENT_FAILED" + _ES_CONFIG_CLIENTIP=$(getLocalIP "$_ES_GLOBAL_DEVICE") + fi + if [ -z $_ES_CONFIG_MAC ]; then + printl Warning "$_ES_LANG_LOGOUT_GET_MAC_FAILED" + _ES_CONFIG_MAC=$(getMAC $_ES_CONFIG_CLIENTIP) + fi + if [ -z $_ES_CONFIG_NASIP ]; then + printl Warning "$_ES_LANG_LOGOUT_GET_NASIP_FAILED" + read -p "$_ES_LANG_LOGOUT_GET_NASIP_MANUAL " _ES_CONFIG_NASIP + fi + if [ -z "$_ES_CONFIG_COOKIE" ]; then + printl Warning "$_ES_LANG_LOGOUT_GET_COOKIE_FAILED" + read -p "$_ES_LANG_LOGOUT_GET_COOKIE_MANUAL " _ES_CONFIG_COOKIE + fi fi - if [[ $ES_VERBOSE == true ]]; then + + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGOUT_GET_CLIENTIP $_ES_CONFIG_CLIENTIP" printl Info "$_ES_LANG_LOGOUT_GET_NASIP $_ES_CONFIG_NASIP" printl Info "$_ES_LANG_LOGOUT_GET_MAC $_ES_CONFIG_MAC" @@ -570,7 +584,7 @@ logout() { printl Error "$_ES_LANG_LOGOUT_FAILED" _ES_EXIT_CODE=1 fi - if [[ $ES_VERBOSE == true ]]; then + if [[ $_ES_VERBOSE == true ]]; then printl Info "$_ES_LANG_LOGOUT_RESULT $_ES_RESULT_LOGOUT" fi } @@ -585,60 +599,11 @@ daemon() { done } -main() { - # 加载初始化文件 - if [ -e "$_ES_HOMEPATH/esfshellrc.sh" ]; then - . $_ES_HOMEPATH/esfshellrc.sh - fi - - if [[ "$funcCall" == "custom" ]]; then - $funcCallCustom - fi - - # Home目录不存在则创建 - if [ ! -d $_ES_HOMEPATH ]; then - if [[ $ES_VERBOSE == true ]]; then - printl Warning "$_ES_LANG_MAIN_HOMEPATH_MKDIR_A $_ES_HOMEPATH $_ES_LANG_MAIN_HOMEPATH_MKDIR_B" - fi - mkdir -p $_ES_HOMEPATH - fi - - if [ -v $funcCall ]; then - help - else - if [ $_ES_LOG_ENABLE == true ]; then - createLog - fi - # 检测用户名和密码 - if [ -z $_ES_ACC_USERNAME ]; then - printl Warning "$_ES_LANG_MAIN_USERNAME_EMPTY" - read -p "$_ES_LANG_MAIN_USERNAME_MANUAL " _ES_ACC_USERNAME - fi - if [ -z $_ES_ACC_PASSWD ]; then - printl Warning "$_ES_LANG_MAIN_PASSWD_EMPTY" - read -sp "$_ES_LANG_MAIN_PASSWD_MANUAL " _ES_ACC_PASSWD - echo "" - fi - - logicActivateEther - - # 登录/注销 - if [[ "$funcCall" == "login" ]]; then - login - elif [[ "$funcCall" == "logout" ]]; then - logout - elif [[ "$funcCall" == "daemon" ]]; then - daemon - fi - fi -} - # 解析参数 while [[ $# -gt 0 ]]; do case "${1}" in -C | --custom) - funcCall="custom" - funcCallCustom=$2 + funcCall=$2 shift 2 ;; -D | --daemon) @@ -654,7 +619,8 @@ while [[ $# -gt 0 ]]; do shift ;; -h | --help) - help + funcCall="help" + shift ;; esac while true; do @@ -668,21 +634,21 @@ while [[ $# -gt 0 ]]; do shift 2 ;; -f | --force) - ES_FORCE=true + _ES_FORCE=true shift ;; - -h | --home) - _ES_HOMEPATH=$2 - shift 2 - ;; -p | --password) _ES_ACC_PASSWD=$2 shift 2 ;; -v | --verbose) - ES_VERBOSE=true + _ES_VERBOSE=true shift ;; + --home) + _ES_HOMEPATH=$2 + shift 2 + ;; *) break ;; @@ -691,6 +657,39 @@ while [[ $# -gt 0 ]]; do break done -main +# 加载初始化文件 +if [ -e "$_ES_HOMEPATH/esfshellrc.sh" ]; then + . $_ES_HOMEPATH/esfshellrc.sh +fi + +# Home目录不存在则创建 +if [ ! -d $_ES_HOMEPATH ]; then + if [[ $_ES_VERBOSE == true ]]; then + printl Warning "$_ES_LANG_MAIN_HOMEPATH_MKDIR_A $_ES_HOMEPATH $_ES_LANG_MAIN_HOMEPATH_MKDIR_B" + fi + mkdir -p $_ES_HOMEPATH +fi + +if [ -v $funcCall ]; then + help +else + if [ $_ES_LOG_ENABLE == true ]; then + createLog + fi + # 检测用户名和密码 + if [ -z $_ES_ACC_USERNAME ]; then + printl Warning "$_ES_LANG_MAIN_USERNAME_EMPTY" + read -p "$_ES_LANG_MAIN_USERNAME_MANUAL " _ES_ACC_USERNAME + fi + if [ -z $_ES_ACC_PASSWD ]; then + printl Warning "$_ES_LANG_MAIN_PASSWD_EMPTY" + read -sp "$_ES_LANG_MAIN_PASSWD_MANUAL " _ES_ACC_PASSWD + echo "" + fi + + logicActivateEther + + $funcCall +fi exit $_ES_EXIT_CODE diff --git a/sample/openwrt-initd/esfshell b/sample/openwrt-initd/esfshell index d981bef..f36c48a 100644 --- a/sample/openwrt-initd/esfshell +++ b/sample/openwrt-initd/esfshell @@ -14,7 +14,7 @@ start_service() procd_close_instance } -stop_service() +service_stopped() { - /路径/到你的/esfshell -O + _ES_HOMEPATH=/路径/到你的/esfshell/主目录 /路径/到你的/esfshell -O } \ No newline at end of file