diff --git a/bin/ShellCrash.tar.gz b/bin/ShellCrash.tar.gz index 250e6ac..8d8992f 100644 Binary files a/bin/ShellCrash.tar.gz and b/bin/ShellCrash.tar.gz differ diff --git a/bin/clashfm.tar.gz b/bin/clashfm.tar.gz index 910faba..8a7e2ef 100644 Binary files a/bin/clashfm.tar.gz and b/bin/clashfm.tar.gz differ diff --git a/bin/public.tar.gz b/bin/public.tar.gz index 05eb325..e448e9b 100644 Binary files a/bin/public.tar.gz and b/bin/public.tar.gz differ diff --git a/bin/version b/bin/version index 4c6ae00..80ca60b 100644 --- a/bin/version +++ b/bin/version @@ -4,4 +4,4 @@ clash_v=v1.7.1 meta_v=v1.18.0 singbox_v=1.8.0 GeoIP_v=20240107 -versionsh=1.8.6c +versionsh=1.8.7 diff --git a/scripts/getdate.sh b/scripts/getdate.sh index 6e6e984..f1d557a 100644 --- a/scripts/getdate.sh +++ b/scripts/getdate.sh @@ -787,7 +787,7 @@ gettar(){ getsh(){ echo ----------------------------------------------- echo -e "当前脚本版本为:\033[33m $versionsh_l \033[0m" - echo -e "最新脚本版本为:\033[32m $release_new \033[0m" + echo -e "最新脚本版本为:\033[32m $version_new \033[0m" echo -e "注意更新时会停止服务!" echo ----------------------------------------------- read -p "是否更新脚本?[1/0] > " res @@ -1665,7 +1665,7 @@ update(){ update elif [ "$num" = 9 ]; then - crash -u + uninstall exit elif [ "$num" = 99 ]; then @@ -1758,12 +1758,6 @@ userguide(){ read -p "是否开启?(1/0) > " res [ "$res" = 1 ] && setconfig BINDIR /tmp/ShellCrash ${CRASHDIR}/configs/command.env fi - #下载本地面板 - # echo ----------------------------------------------- - # echo -e "\033[33m安装本地Dashboard面板,可以更快捷的管理clash内置规则!\033[0m" - # echo ----------------------------------------------- - # read -p "需要安装本地Dashboard面板吗?(1/0) > " res - # [ "$res" = 1 ] && checkupdate && setdb #检测及下载根证书 if [ -d /etc/ssl/certs -a ! -f '/etc/ssl/certs/ca-certificates.crt' ];then echo ----------------------------------------------- @@ -1823,12 +1817,14 @@ userguide(){ [ "$res" = 1 ] && autoSSH fi #提示导入订阅或者配置文件 - echo ----------------------------------------------- - echo -e "\033[32m是否导入配置文件?\033[0m(这是运行前的最后一步)" - echo -e "\033[0m你必须拥有一份yaml格式的配置文件才能运行服务!\033[0m" - echo ----------------------------------------------- - read -p "现在开始导入?(1/0) > " res - [ "$res" = 1 ] && inuserguide=1 && set_core_config && inuserguide="" + [ ! -s $CRASHDIR/yamls/config.yaml -a ! -s $CRASHDIR/jsons/config.json ] && { + echo ----------------------------------------------- + echo -e "\033[32m是否导入配置文件?\033[0m(这是运行前的最后一步)" + echo -e "\033[0m你必须拥有一份yaml格式的配置文件才能运行服务!\033[0m" + echo ----------------------------------------------- + read -p "现在开始导入?(1/0) > " res + [ "$res" = 1 ] && inuserguide=1 && set_core_config && inuserguide="" + } #回到主界面 echo ----------------------------------------------- echo -e "\033[36m很好!现在只需要执行启动就可以愉快的使用了!\033[0m" @@ -1838,13 +1834,66 @@ userguide(){ main_menu } #测试菜单 +debug(){ + [ "$crashcore" = singbox ] && config_tmp=$TMPDIR/config.json || config_tmp=$TMPDIR/config.yaml + echo ----------------------------------------------- + echo -e "\033[36m注意:Debug运行均会停止原本的内核服务\033[0m" + echo -e "后台运行日志地址:\033[32m$TMPDIR/debug.log\033[0m" + echo -e "如长时间运行后台监测,日志等级推荐error!防止文件过大!" + echo -e "你也可以通过:\033[33mcrash -s debug 'warning'\033[0m 命令使用其他日志等级" + echo ----------------------------------------------- + echo -e " 1 仅测试\033[32m$config_tmp\033[0m配置文件可用性" + echo -e " 2 前台运行\033[32m$config_tmp\033[0m配置文件,不配置防火墙劫持(\033[33m使用Ctrl+C手动停止\033[0m)" + echo -e " 3 后台运行完整启动流程,并配置防火墙劫持,日志等级:\033[31merror\033[0m" + echo -e " 4 后台运行完整启动流程,并配置防火墙劫持,日志等级:\033[32minfo\033[0m" + echo -e " 5 后台运行完整启动流程,并配置防火墙劫持,日志等级:\033[33mdebug\033[0m" + echo ----------------------------------------------- + echo " 0 返回上级目录!" + read -p "请输入对应数字 > " num + case "$num" in + 0) ;; + 1) + $CRASHDIR/start.sh stop + if [ "$crashcore" = singbox ] ;then + $BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json & + { sleep 4 ; kill $! &>/dev/null & } + wait + else + $BINDIR/CrashCore -t -d $BINDIR -f $TMPDIR/config.yaml + fi + echo ----------------------------------------------- + exit + ;; + 2) + $CRASHDIR/start.sh stop + $COMMAND + echo ----------------------------------------------- + exit + ;; + 3) + $CRASHDIR/start.sh debug error + main_menu + ;; + 4) + $CRASHDIR/start.sh debug info + main_menu + ;; + 5) + $CRASHDIR/start.sh debug debug + main_menu + ;; + *) + errornum + ;; + esac +} testcommand(){ [ "$crashcore" = singbox ] && config_path=${JSONSDIR}/config.json || config_path=${YAMLSDIR}/config.yaml echo ----------------------------------------------- echo -e "\033[30;47m这里是测试命令菜单\033[0m" echo -e "\033[33m如遇问题尽量运行相应命令后截图提交issue或TG讨论组\033[0m" echo ----------------------------------------------- - echo " 1 查看内核运行报错信息(会停止内核进程)" + echo " 1 Debug模式运行内核" echo " 2 查看系统DNS端口(:53)占用 " echo " 3 测试ssl加密(aes-128-gcm)跑分" echo " 4 查看ShellCrash相关路由规则" @@ -1859,17 +1908,8 @@ testcommand(){ elif [ "$num" = 0 ]; then main_menu elif [ "$num" = 1 ]; then - echo ----------------------------------------------- - $CRASHDIR/start.sh stop - if [ "$crashcore" = singbox ] ;then - $BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json & - { sleep 4 ; kill $! &>/dev/null & } - wait - else - $BINDIR/CrashCore -t -d $BINDIR -f $TMPDIR/config.yaml - fi - echo ----------------------------------------------- - exit; + debug + testcommand elif [ "$num" = 2 ]; then echo ----------------------------------------------- netstat -ntulp |grep 53 diff --git a/scripts/init.sh b/scripts/init.sh index c1ec24b..7c7f7e1 100644 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -1,7 +1,7 @@ #!/bin/sh # Copyright (C) Juewuy -version=1.8.6c +version=1.8.7 setdir(){ dir_avail(){ @@ -150,8 +150,6 @@ mv -f /tmp/SC_tmp/* ${CRASHDIR} 2>/dev/null #初始化 mkdir -p ${CRASHDIR}/configs [ -f "${CRASHDIR}/configs/ShellCrash.cfg" ] || echo '#ShellCrash配置文件,不明勿动!' > ${CRASHDIR}/configs/ShellCrash.cfg -#本地安装跳过新手引导 -#[ -z "$url" ] && setconfig userguide 1 #判断系统类型写入不同的启动文件 if [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ];then #设为init.d方式启动 @@ -172,7 +170,7 @@ else fi fi #修饰文件及版本号 -type bash &>/dev/null && shtype=bash || shtype=sh +command -v bash &>/dev/null && shtype=bash || shtype=sh for file in start.sh task.sh ;do sed -i "s|/bin/sh|/bin/$shtype|" ${CRASHDIR}/${file} chmod 755 ${CRASHDIR}/${file} @@ -184,7 +182,7 @@ BINDIR=${CRASHDIR} touch ${CRASHDIR}/configs/command.env setconfig TMPDIR ${TMPDIR} ${CRASHDIR}/configs/command.env setconfig BINDIR ${BINDIR} ${CRASHDIR}/configs/command.env -if [ -x ${CRASHDIR}/CrashCore ] && ${CRASHDIR}/CrashCore version &>/dev/null ;then +if [ -x ${CRASHDIR}/CrashCore ] && [ -n "$(grep 'crashcore=singbox' ${CRASHDIR}/configs/ShellCrash.cfg)" ];then COMMAND='"$BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json"' else COMMAND='"$BINDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"' @@ -271,7 +269,6 @@ for file in cron task.sh task.list;do done chmod 755 ${CRASHDIR}/task/task.sh #旧版文件清理 - rm -rf /etc/init.d/clash rm -rf $CRASHDIR/clashservice rm -rf $CRASHDIR/shellcrash.rc diff --git a/scripts/menu.sh b/scripts/menu.sh index 3b1f983..a75db3a 100644 --- a/scripts/menu.sh +++ b/scripts/menu.sh @@ -84,6 +84,7 @@ ckstatus(){ checkport fi [ "$crashcore" = singbox ] && corename=Sing-Box || corename=Clash + [ -f ${TMPDIR}/debug.log -a -n "$PID" ] && auto="\033[33m并处于debug状态!\033[0m" #输出状态 echo ----------------------------------------------- echo -e "\033[30;46m欢迎使用ShellCrash!\033[0m 版本:$versionsh_l" @@ -1109,7 +1110,7 @@ normal_set(){ #基础设置 echo -e "\033[36m已设为 $redir_mod !!\033[0m" } [ -n "$(iptables -j TPROXY 2>&1 | grep 'on-port')" ] && sup_tp=1 - [ -n "$(lsmod | grep '^tun')" ] || ip tuntap &>/dev/null && sup_tun=1 + [ -n "$(ls /dev/net/tun)" ] || ip tuntap &>/dev/null && sup_tun=1 ckcmd nft && sup_nft=1 echo ----------------------------------------------- echo -e "当前代理模式为:\033[47;30m $redir_mod \033[0m;Clash核心为:\033[47;30m $crashcore \033[0m" @@ -1555,6 +1556,56 @@ autoSSH(){ setconfig mi_autoSSH_pwd $mi_autoSSH_pwd sleep 1 } +uninstall(){ + read -p "确认卸载ShellCrash?(警告:该操作不可逆!)[1/0] > " res + if [ "$res" = '1' ]; then + ${CRASHDIR}/start.sh stop 2>/dev/null + ${CRASHDIR}/start.sh cronset "clash服务" 2>/dev/null + ${CRASHDIR}/start.sh cronset "订阅链接" 2>/dev/null + ${CRASHDIR}/start.sh cronset "ShellCrash初始化" 2>/dev/null + read -p "是否保留脚本配置及订阅文件?[1/0] > " res + if [ "$res" = '1' ]; then + mv -f ${CRASHDIR}/configs /tmp/ShellCrash + mv -f ${CRASHDIR}/yamls /tmp/ShellCrash + mv -f ${CRASHDIR}/jsons /tmp/ShellCrash + rm -rf ${CRASHDIR}/* + mv -f /tmp/ShellCrash/configs ${CRASHDIR} + mv -f /tmp/ShellCrash/yamls ${CRASHDIR} + mv -f /tmp/ShellCrash/jsons ${CRASHDIR} + else + rm -rf ${CRASHDIR} + fi + [ -w ~/.bashrc ] && profile=~/.bashrc + [ -w /etc/profile ] && profile=/etc/profile + sed -i '/alias clash=*/'d $profile + sed -i '/alias crash=*/'d $profile + sed -i '/export CRASHDIR=*/'d $profile + sed -i '/export crashdir=*/'d $profile + sed -i '/all_proxy/'d $profile + sed -i '/ALL_PROXY/'d $profile + sed -i "/启用外网访问SSH服务/d" /etc/firewall.user 2>/dev/null + sed -i '/ShellCrash初始化/'d /etc/storage/started_script.sh 2>/dev/null + sed -i '/ShellCrash初始化/'d /jffs/.asusrouter 2>/dev/null + [ "$BINDIR" != "$CRASHDIR" ] && rm -rf ${BINDIR} + rm -rf /etc/init.d/shellcrash + rm -rf /etc/systemd/system/shellcrash.service + rm -rf /usr/lib/systemd/system/shellcrash.service + rm -rf /www/clash + rm -rf /tmp/ShellCrash + sed -Ei s/0:7890/7890:7890/g /etc/passwd + userdel -r shellcrash 2>/dev/null + nvram set script_usbmount="" 2>/dev/null + nvram commit 2>/dev/null + uci delete firewall.ShellCrash 2>/dev/null + uci commit firewall 2>/dev/null + echo ----------------------------------------------- + echo -e "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m" + echo -e "\033[33m请手动关闭当前窗口以重置环境变量!\033[0m" + echo ----------------------------------------------- + exit + fi + echo -e "\033[31m操作已取消!\033[0m" +} tools(){ ssh_tools(){ stop_iptables(){ @@ -1833,7 +1884,7 @@ case "$1" in echo " -i 初始化脚本" echo ----------------------------------------- echo " crash -s start 启动服务" - echo " crash -s stop 停止服务" + echo " crash -s stop 停止服务" echo " 安装目录/start.sh init 开机初始化" echo ----------------------------------------- echo "在线求助:t.me/ShellClash" @@ -1856,53 +1907,7 @@ case "$1" in $shtype -x ${CRASHDIR}/start.sh $2 $3 $4 $5 $6 ;; -u) - read -p "确认卸载ShellCrash?(警告:该操作不可逆!)[1/0] > " res - if [ "$res" = '1' ]; then - ${CRASHDIR}/start.sh stop - ${CRASHDIR}/start.sh cronset "clash服务" 2>/dev/null - ${CRASHDIR}/start.sh cronset "订阅链接" 2>/dev/null - ${CRASHDIR}/start.sh cronset "ShellCrash初始化" 2>/dev/null - read -p "是否保留脚本配置及订阅文件?[1/0] > " res - if [ "$res" = '1' ]; then - mv -f ${CRASHDIR}/configs /tmp/ShellCrash - mv -f ${CRASHDIR}/yamls /tmp/ShellCrash - rm -rf ${CRASHDIR}/* - mv -f /tmp/ShellCrash/configs ${CRASHDIR} - mv -f /tmp/ShellCrash/yamls ${CRASHDIR} - else - rm -rf ${CRASHDIR} - fi - [ -w ~/.bashrc ] && profile=~/.bashrc - [ -w /etc/profile ] && profile=/etc/profile - sed -i '/alias clash=*/'d $profile - sed -i '/alias crash=*/'d $profile - sed -i '/export CRASHDIR=*/'d $profile - sed -i '/export crashdir=*/'d $profile - sed -i '/all_proxy/'d $profile - sed -i '/ALL_PROXY/'d $profile - sed -i "/启用外网访问SSH服务/d" /etc/firewall.user - sed -i '/ShellCrash初始化/'d /etc/storage/started_script.sh 2>/dev/null - sed -i '/ShellCrash初始化/'d /jffs/.asusrouter 2>/dev/null - rm -rf ${BINDIR} - rm -rf /etc/init.d/shellcrash - rm -rf /etc/systemd/system/shellcrash.service - rm -rf /usr/lib/systemd/system/shellcrash.service - rm -rf /www/clash - rm -rf /tmp/ShellCrash - sed -Ei s/0:7890/7890:7890/g /etc/passwd - userdel -r shellcrash 2>/dev/null - nvram set script_usbmount="" 2>/dev/null - nvram commit 2>/dev/null - uci delete firewall.ShellClash 2>/dev/null - uci delete firewall.ShellCrash 2>/dev/null - uci commit firewall 2>/dev/null - echo ----------------------------------------------- - echo -e "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m" - echo -e "\033[33m请手动关闭当前窗口以重置环境变量!\033[0m" - echo ----------------------------------------------- - exit - fi - echo -e "\033[31m操作已取消!\033[0m" + uninstall ;; *) $0 -h diff --git a/scripts/start.sh b/scripts/start.sh index dc8ace0..ce3b872 100644 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -1555,6 +1555,8 @@ bfstart(){ #启动前 fi fi fi + #清理debug日志 + rm -rf ${TMPDIR}/debug.log #执行条件任务 [ -s ${CRASHDIR}/task/bfstart ] && source ${CRASHDIR}/task/bfstart return 0 @@ -1724,6 +1726,22 @@ restart) $0 stop $0 start ;; +debug) + [ -n "$(pidof CrashCore)" ] && $0 stop >/dev/null #禁止多实例 + getconfig + stop_firewall >/dev/null #清理路由策略 + bfstart + [ -n "$2" ] && { + if [ "$crashcore" = singbox ];then + sed -i "s/\"level\": \"info\"/\"level\": \"$2\"/" ${TMPDIR}/config.json + else + sed -i "s/log-level: info/log-level: $2/" ${TMPDIR}/config.yaml + fi + } + $COMMAND &>${TMPDIR}/debug.log & + afstart + logger "已运行debug模式!如需停止,请正常重启一次服务!" 33 + ;; init) profile=/etc/profile if [ -d "/etc/storage/clash" -o -d "/etc/storage/ShellCrash" ];then @@ -1764,7 +1782,7 @@ webget) [ "$4" = "echooff" ] && progress='-s' || progress='-#' [ "$5" = "rediroff" ] && redirect='' || redirect='-L' [ "$6" = "skipceroff" ] && certificate='' || certificate='-k' - result=$(curl $agent -w %{http_code} --connect-timeout 3 $progress $redirect $certificate -o "$2" "$url" 2>/dev/null) + result=$(curl $agent -w %{http_code} --connect-timeout 3 $progress $redirect $certificate -o "$2" "$url" ) [ "$result" != "200" ] && export all_proxy="" && result=$(curl $agent -w %{http_code} --connect-timeout 5 $progress $redirect $certificate -o "$2" "$3") else if wget --version > /dev/null 2>&1;then @@ -1775,7 +1793,7 @@ webget) fi [ "$4" = "echoon" ] && progress='' [ "$4" = "echooff" ] && progress='-q' - wget -Y on $agent $progress $redirect $certificate $timeout -O "$2" "$url" 2>/dev/null + wget -Y on $agent $progress $redirect $certificate $timeout -O "$2" "$url" if [ "$?" != "0" ];then wget -Y off $agent $progress $redirect $certificate $timeout -O "$2" "$3" [ "$?" = "0" ] && result="200"