From 6d64d3b2b32fcbcc7fb45324b906315122e6836d Mon Sep 17 00:00:00 2001 From: juewuy Date: Wed, 24 Dec 2025 10:03:30 +0800 Subject: [PATCH 1/3] =?UTF-8?q?~=E7=A7=BB=E5=8A=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/menus/9-upgrade.sh | 1079 ----------------- scripts/menus/README.md | 4 +- scripts/{ => starts}/shellcrash.openrc | 0 scripts/{ => starts}/shellcrash.procd | 0 scripts/{ => starts}/shellcrash.service | 0 .../snapshot_init.sh} | 0 6 files changed, 2 insertions(+), 1081 deletions(-) delete mode 100644 scripts/menus/9-upgrade.sh rename scripts/{ => starts}/shellcrash.openrc (100%) rename scripts/{ => starts}/shellcrash.procd (100%) rename scripts/{ => starts}/shellcrash.service (100%) rename scripts/{misnap_init.sh => starts/snapshot_init.sh} (100%) diff --git a/scripts/menus/9-upgrade.sh b/scripts/menus/9-upgrade.sh deleted file mode 100644 index 7ef99843..00000000 --- a/scripts/menus/9-upgrade.sh +++ /dev/null @@ -1,1079 +0,0 @@ -#!/bin/sh -# Copyright (C) Juewuy - -. "$CRASHDIR"/libs/check_dir_avail.sh - -error_down(){ - echo -e "\033[33m请尝试切换至其他安装源后重新下载!\033[0m" - echo -e "或者参考 \033[32;4mhttps://juewuy.github.io/bdaz\033[0m 进行本地安装!" - sleep 1 -} -#主界面 -upgrade(){ - echo "-----------------------------------------------" - echo -ne "\033[32m正在检查更新!\033[0m\r" - checkupdate - [ -z "$core_v" ] && core_v=$crashcore - core_v_new=$(eval echo \$"$crashcore"_v) - echo -e "\033[30;47m欢迎使用更新功能:\033[0m" - echo "-----------------------------------------------" - echo -e "当前目录(\033[32m$CRASHDIR\033[0m)剩余空间:\033[36m$(dir_avail "$CRASHDIR" -h)\033[0m" - [ "$(dir_avail "$CRASHDIR")" -le 5120 ] && [ "$CRASHDIR" = "$BINDIR" ] && { - echo -e "\033[33m当前目录剩余空间较低,建议开启小闪存模式!\033[0m" - sleep 1 - } - echo "-----------------------------------------------" - echo -e " 1 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$version_new \033[36m$release_type\033[0m" - echo -e " 2 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m" - echo -e " 3 更新\033[32m数据库文件\033[0m > \033[32m$GeoIP_v\033[0m" - echo -e " 4 安装本地\033[35mDashboard\033[0m面板" - echo -e " 5 安装/更新本地\033[33m根证书文件\033[0m" - echo -e " 6 查看\033[32mPAC\033[0m自动代理配置" - echo "-----------------------------------------------" - echo -e " 7 切换\033[36m安装源\033[0m及\033[36m安装版本\033[0m" - echo -e " 8 \033[32m配置自动更新\033[0m" - echo -e " 9 \033[31m卸载ShellCrash\033[0m" - echo "-----------------------------------------------" - echo -e "99 \033[36m鸣谢!\033[0m" - echo "-----------------------------------------------" - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 0) - ;; - 1) - setscripts - ;; - 2) - setcore - upgrade - ;; - 3) - setgeo - upgrade - ;; - 4) - setdb - upgrade - ;; - 5) - setcrt - upgrade - ;; - 6) - echo "-----------------------------------------------" - echo -e "PAC配置链接为:\033[30;47m http://$host:$db_port/ui/pac \033[0m" - echo -e "PAC的使用教程请参考:\033[4;32mhttps://juewuy.github.io/ehRUeewcv\033[0m" - sleep 2 - upgrade - ;; - 7) - setserver - upgrade - ;; - 8) - . "$CRASHDIR"/task/task.sh && task_add - upgrade - ;; - 9) - uninstall - exit - ;; - 99) - echo "-----------------------------------------------" - echo -e "感谢:\033[32mClash项目 \033[0m作者\033[36m Dreamacro\033[0m" - echo -e "感谢:\033[32msing-box项目 \033[0m作者\033[36m SagerNet\033[0m 项目地址:\033[32mhttps://github.com/SagerNet/sing-box\033[0m" - echo -e "感谢:\033[32mMetaCubeX项目 \033[0m作者\033[36m MetaCubeX\033[0m 项目地址:\033[32mhttps://github.com/MetaCubeX\033[0m" - echo -e "感谢:\033[32mYACD面板项目 \033[0m作者\033[36m haishanh\033[0m 项目地址:\033[32mhttps://github.com/haishanh/yacd\033[0m" - echo -e "感谢:\033[32mzashboard项目 \033[0m作者\033[36m Zephyruso\033[0m 项目地址:\033[32mhttps://github.com/Zephyruso/zashboard\033[0m" - echo -e "感谢:\033[32mSubconverter \033[0m作者\033[36m tindy2013\033[0m 项目地址:\033[32mhttps://github.com/tindy2013/subconverter\033[0m" - echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m PuerNya\033[0m 项目地址:\033[32mhttps://github.com/PuerNya/sing-box\033[0m" - echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m reF1nd\033[0m 项目地址:\033[32mhttps://github.com/reF1nd/sing-box\033[0m" - echo -e "感谢:\033[32mDustinWin相关项目 \033[0m作者\033[36m DustinWin\033[0m 作者地址:\033[32mhttps://github.com/DustinWin\033[0m" - echo "-----------------------------------------------" - echo -e "特别感谢:\033[36m所有帮助及赞助过此项目的同仁们!\033[0m" - echo "-----------------------------------------------" - sleep 2 - upgrade - ;; - *) - errornum - ;; - esac -} -#检查更新 -checkupdate(){ - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/version_new version echooff - [ "$?" = "0" ] && { - version_new=$(cat "$TMPDIR"/version_new) - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/version_new bin/version echooff - } - if [ "$?" = "0" ];then - . "$TMPDIR"/version_new 2>/dev/null - else - echo -e "\033[31m检查更新失败!请尝试切换其他安装源!\033[0m" - setserver - [ "$checkupdate" = false ] || checkupdate - fi - rm -rf "$TMPDIR"/version_new -} -#更新脚本 -getscripts(){ - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/ShellCrash.tar.gz ShellCrash.tar.gz - if [ "$?" != "0" ];then - echo -e "\033[33m文件下载失败!\033[0m" - error_down - else - "$CRASHDIR"/start.sh stop 2>/dev/null - #解压 - echo "-----------------------------------------------" - echo "开始解压文件!" - mkdir -p "$CRASHDIR" > /dev/null - tar -zxf ""$TMPDIR"/ShellCrash.tar.gz" ${tar_para} -C "$CRASHDIR"/ - if [ $? -ne 0 ];then - echo -e "\033[33m文件解压失败!\033[0m" - error_down - else - . "$CRASHDIR"/init.sh >/dev/null - echo -e "\033[32m脚本更新成功!\033[0m" - fi - fi - rm -rf "$TMPDIR"/ShellCrash.tar.gz - exit -} -setscripts(){ - echo "-----------------------------------------------" - echo -e "当前脚本版本为:\033[33m $versionsh_l \033[0m" - echo -e "最新脚本版本为:\033[32m $version_new \033[0m" - echo -e "注意更新时会停止服务!" - echo "-----------------------------------------------" - read -p "是否更新脚本?[1/0] > " res - if [ "$res" = '1' ]; then - #下载更新 - getscripts - #提示 - echo "-----------------------------------------------" - echo -e "\033[32m管理脚本更新成功!\033[0m" - echo "-----------------------------------------------" - exit; - fi -} -#更新内核 -getcpucore(){ #自动获取内核架构 - cputype=$(uname -ms | tr ' ' '_' | tr '[A-Z]' '[a-z]') - [ -n "$(echo $cputype | grep -E "linux.*armv.*")" ] && cpucore="armv5" - [ -n "$(echo $cputype | grep -E "linux.*armv7.*")" ] && [ -n "$(cat /proc/cpuinfo | grep vfp)" ] && [ ! -d /jffs ] && cpucore="armv7" - [ -n "$(echo $cputype | grep -E "linux.*aarch64.*|linux.*armv8.*")" ] && cpucore="arm64" - [ -n "$(echo $cputype | grep -E "linux.*86.*")" ] && cpucore="386" - [ -n "$(echo $cputype | grep -E "linux.*86_64.*")" ] && cpucore="amd64" - if [ -n "$(echo $cputype | grep -E "linux.*mips.*")" ];then - mipstype=$(echo -n I | hexdump -o 2>/dev/null | awk '{ print substr($2,6,1); exit}') #通过判断大小端判断mips或mipsle - [ "$mipstype" = "0" ] && cpucore="mips-softfloat" || cpucore="mipsle-softfloat" - fi - [ -n "$cpucore" ] && setconfig cpucore $cpucore -} -setcpucore(){ #手动设置内核架构 - cpucore_list="armv5 armv7 arm64 386 amd64 mipsle-softfloat mipsle-hardfloat mips-softfloat" - echo "-----------------------------------------------" - echo -e "\033[31m仅适合脚本无法正确识别核心或核心无法正常运行时使用!\033[0m" - echo -e "当前可供在线下载的处理器架构为:" - echo $cpucore_list | awk -F " " '{for(i=1;i<=NF;i++) {print i" "$i }}' - echo -e "不知道如何获取核心版本?请参考:\033[36;4mhttps://juewuy.github.io/bdaz\033[0m" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - [ -n "$num" ] && setcpucore=$(echo $cpucore_list | awk '{print $"'"$num"'"}' ) - if [ -z "$setcpucore" ];then - echo -e "\033[31m请输入正确的处理器架构!\033[0m" - sleep 1 - cpucore="" - else - cpucore=$setcpucore - setconfig cpucore $cpucore - fi -} -setcoretype(){ #手动指定内核类型 - echo "$crashcore" | grep -q 'singbox' && core_old=singbox || core_old=clash - echo -e "\033[33m请确认该自定义内核的类型:\033[0m" - echo -e " 1 Clash基础内核" - echo -e " 2 Clash-Premium内核" - echo -e " 3 Mihomo(Meta)内核" - echo -e " 4 Sing-Box内核" - echo -e " 5 Sing-Box-reF1nd内核" - read -p "请输入对应数字 > " num - case "$num" in - 2) crashcore=clashpre ;; - 3) crashcore=meta ;; - 4) crashcore=singbox ;; - 5) crashcore=singboxr ;; - *) crashcore=clash ;; - esac - echo "$crashcore" | grep -q 'singbox' && core_new=singbox || core_new=clash -} -switch_core(){ #clash与singbox内核切换 - #singbox和clash内核切换时提示是否保留文件 - [ "$core_new" != "$core_old" ] && { - [ "$dns_mod" = "redir_host" ] && [ "$core_old" = "clash" ] && setconfig dns_mod mix #singbox自动切换dns - [ "$dns_mod" = "mix" ] && [ "$crashcore" = 'clash' -o "$crashcore" = 'clashpre' ] && setconfig dns_mod fake-ip #singbox自动切换dns - echo -e "\033[33m已从$core_old内核切换至$core_new内核\033[0m" - echo -e "\033[33m二者Geo数据库及yaml/json配置文件不通用\033[0m" - read -p "是否保留相关数据库文件?(1/0) > " res - [ "$res" = '0' ] && { - [ "$core_old" = "clash" ] && { - geodate='Country.mmdb GeoSite.dat ruleset/*.mrs ruleset/*.yaml ruleset/*.yml' - geodate_v='Country_v cn_mini_v geosite_v mrs_geosite_cn_v' - } - [ "$core_old" = "singbox" ] && { - geodate='geoip.db geosite.db ruleset/*.srs ruleset/*.json' - geodate_v='geoip_cn_v geosite_cn_v srs_geoip_cn_v srs_geosite_cn_v' - } - for text in ${geodate} ;do - rm -rf "$CRASHDIR"/${text} - done - for text in ${geodate_v} ;do - setconfig "$text" - done - } - } - if echo "$crashcore" | grep -q 'singbox';then - COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"' - else - COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"' - fi - setconfig COMMAND "$COMMAND" "$CRASHDIR"/configs/command.env && . "$CRASHDIR"/configs/command.env -} -getcore(){ #下载内核文件 - [ -z "$crashcore" ] && crashcore=meta - [ -z "$cpucore" ] && getcpucore - echo "$crashcore" | grep -q 'singbox' && core_new=singbox || core_new=clash - #获取在线内核文件 - echo "-----------------------------------------------" - echo "正在在线获取$crashcore核心文件……" - if [ -n "$custcorelink" ];then - zip_type=$(echo $custcorelink | grep -oE 'tar.gz$') - [ -z "$zip_type" ] && zip_type=$(echo $custcorelink | grep -oE 'gz$') - if [ -n "$zip_type" ];then - "$CRASHDIR"/start.sh webget "$TMPDIR"/core_new.${zip_type} "$custcorelink" - else - echo -e "\033[31m链接不是以.tar.gz或.gz结尾!下载已取消!\033[0m" - exit - fi - else - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/core_new.tar.gz bin/${crashcore}/${core_new}-linux-${cpucore}.tar.gz - fi - if [ "$?" = "1" ];then - echo -e "\033[31m核心文件下载失败!\033[0m" - rm -rf "$TMPDIR"/core_new.tar.gz - [ -z "$custcorelink" ] && error_down - else - [ -n "$(pidof CrashCore)" ] && { - "$CRASHDIR"/start.sh stop #停止内核服务防止内存不足 - rm -rf "$TMPDIR"/CrashCore #删除缓存内核防止缓存空间不足 - } - [ -f "$TMPDIR"/core_new.tar.gz ] && { - mkdir -p "$TMPDIR"/core_tmp - [ "$BINDIR" = "$TMPDIR" ] && rm -rf "$TMPDIR"/CrashCore #小闪存模式防止空间不足 - tar -zxf ""$TMPDIR"/core_new.tar.gz" ${tar_para} -C "$TMPDIR"/core_tmp/ - for file in $(find "$TMPDIR"/core_tmp 2>/dev/null);do - [ -f $file ] && [ -n "$(echo $file | sed 's#.*/##' | grep -iE '(CrashCore|sing|meta|mihomo|clash|premium)')" ] && mv -f $file "$TMPDIR"/core_new - done - rm -rf "$TMPDIR"/core_tmp - } - [ -f "$TMPDIR"/core_new.gz ] && gunzip "$TMPDIR"/core_new.gz && rm -rf "$TMPDIR"/core_new.gz - chmod +x "$TMPDIR"/core_new - [ "$crashcore" = unknow ] && setcoretype - if echo "$crashcore" | grep -q 'singbox';then - core_v=$("$TMPDIR"/core_new version 2>/dev/null | grep version | awk '{print $3}') - else - core_v=$("$TMPDIR"/core_new -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //') - fi - if [ -z "$core_v" ];then - echo -e "\033[31m核心文件下载成功但校验失败!请尝试手动指定CPU版本\033[0m" - rm -rf "$TMPDIR"/core_new - rm -rf "$TMPDIR"/core_new.tar.gz - setcpucore - else - echo -e "\033[32m$crashcore核心下载成功!\033[0m" - sleep 1 - mv -f "$TMPDIR"/core_new "$TMPDIR"/CrashCore - if [ -f "$TMPDIR"/core_new.tar.gz ];then - mv -f "$TMPDIR"/core_new.tar.gz "$BINDIR"/CrashCore.tar.gz - else - tar -zcf "$BINDIR"/CrashCore.tar.gz ${tar_para} -C "$TMPDIR" CrashCore - fi - setconfig crashcore $crashcore - setconfig core_v $core_v - setconfig custcorelink $custcorelink - switch_core - fi - fi -} -setcustcore(){ #自定义内核 - checkcustcore(){ - [ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag" - #通过githubapi获取内核信息 - echo -e "\033[32m正在获取内核文件链接!\033[0m" - "$CRASHDIR"/start.sh webget "$TMPDIR"/github_api https://api.github.com/repos/${project}/releases/${api_url} - if [ "$?" = 0 ];then - release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') - release_date=$(cat "$TMPDIR"/github_api | grep '"published_at":' | awk -F '"' '{print $4}') - update_date=$(cat "$TMPDIR"/github_api | grep '"updated_at":' | head -n 1 | awk -F '"' '{print $4}') - [ -n "$(echo $cpucore | grep mips)" ] && cpu_type=mips || cpu_type=$cpucore - cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE "https://github.com/${project}/releases/download.*linux.*${cpu_type}.*\.gz\"$" | sed 's/"//' > "$TMPDIR"/core.list - rm -rf "$TMPDIR"/github_api - # - if [ -s "$TMPDIR"/core.list ];then - echo "-----------------------------------------------" - echo -e "内核版本:\033[36m$release_tag\033[0m" - echo -e "发布时间:\033[33m$release_date\033[0m" - echo -e "更新时间:\033[32m$update_date\033[0m" - echo "-----------------------------------------------" - echo -e "\033[33m请确认内核信息并选择:\033[0m" - cat "$TMPDIR"/core.list | grep -oE "$release_tag.*" | sed 's|.*/||' | awk '{print " "NR" "$1}' - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 0) - setcustcore - ;; - [1-9]|[1-9][0-9]) - if [ "$num" -le "$(wc -l < "$TMPDIR"/core.list)" ];then - custcorelink=$(sed -n "$num"p "$TMPDIR"/core.list) - getcore - else - errornum - fi - ;; - *) - errornum - ;; - esac - else - echo -e "\033[31m找不到可用内核,可能是作者没有编译相关CPU架构版本的内核文件!\033[0m" - sleep 1 - fi - else - echo -e "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m" - sleep 1 - fi - rm -rf "$TMPDIR"/core.list - } - [ -z "$cpucore" ] && getcpucore - echo "-----------------------------------------------" - echo -e "\033[36m此处内核通常源自互联网采集,此处致谢各位开发者!\033[0m" - echo -e "\033[33m自定义内核未经过完整适配,使用出现问题请自行解决!\033[0m" - echo -e "\033[31m自定义内核已适配定时任务,但不支持小闪存模式!\033[0m" - echo -e "\033[32m如遇到网络错误请先启动ShellCrash服务!\033[0m" - [ -n "$custcore" ] && { - echo "-----------------------------------------------" - echo -e "当前内核为:\033[36m$custcore\033[0m" - } - echo "-----------------------------------------------" - echo -e "\033[33m请选择需要使用的核心!\033[0m" - echo -e "1 \033[36mMetaCubeX/mihomo\033[32m@release\033[0m版本官方内核" - echo -e "2 \033[36mMetaCubeX/mihomo\033[32m@alpha\033[0m版本官方内核" - echo -e "3 \033[36mvernesong/mihomo\033[32m@alpha\033[0m版本内核(支持Smart策略)" - echo -e "4 \033[36mSagerNet/sing-box\033[32m@release\033[0m版本官方内核" - echo -e "5 \033[36mreF1nd/sing-box\033[32m@release\033[0m版本内核(完整编译)" - echo -e "6 \033[36mreF1nd/sing-box\033[32m@dev\033[0m版本内核(完整编译)" - echo -e "7 Premium-2023.08.17内核(已停止维护)" - echo -e "a \033[33m自定义内核链接 \033[0m" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 1) - project=MetaCubeX/mihomo - api_tag=latest - crashcore=meta - checkcustcore - ;; - 2) - project=MetaCubeX/mihomo - api_tag=Prerelease-Alpha - crashcore=meta - checkcustcore - ;; - 3) - project=vernesong/mihomo - api_tag=Prerelease-Alpha - crashcore=meta - checkcustcore - ;; - 4) - project=SagerNet/sing-box - api_tag=latest - crashcore=singbox - checkcustcore - ;; - 5) - project=juewuy/ShellCrash - api_tag=singbox_core_reF1nd - crashcore=singboxr - checkcustcore - ;; - 6) - project=juewuy/ShellCrash - api_tag=singbox_core_dev_reF1nd - crashcore=singboxr - checkcustcore - ;; - 7) - project=juewuy/ShellCrash - api_tag=clash.premium.latest - crashcore=clashpre - checkcustcore - ;; - a) - read -p "请输入自定义内核的链接地址(必须是以.tar.gz或.gz结尾的压缩文件) > " link - [ -n "$link" ] && custcorelink="$link" - crashcore=unknow - getcore - ;; - *) - errornum - ;; - esac -} -setcore(){ #内核选择菜单 - #获取核心及版本信息 - [ -z "$crashcore" ] && crashcore="unknow" - [ ! -f "$CRASHDIR"/CrashCore.tar.gz -o ! -f "$BINDIR"/CrashCore.tar.gz ] && crashcore="未安装核心" - echo "$crashcore" | grep -q 'singbox' && core_old=singbox || core_old=clash - [ -n "$custcorelink" ] && custcore="$(echo $custcorelink | sed 's#.*github.com##; s#/releases/download/#@#; s#-linux.*$##')" - ### - echo "-----------------------------------------------" - [ -z "$cpucore" ] && getcpucore - echo -e "当前内核:\033[42;30m $crashcore \033[47;30m$core_v\033[0m" - echo -e "当前系统处理器架构:\033[32m $cpucore \033[0m" - echo -e "\033[33m请选择需要使用的核心版本!\033[0m" - echo -e "\033[36m如需本地上传,请将二进制文件上传至 /tmp 目录后重新运行crash命令\033[0m" - echo "-----------------------------------------------" - echo -e "1 \033[43;30m Mihomo \033[0m: \033[32m(原meta内核)支持全面\033[0m" - echo -e " >>\033[32m$meta_v \033[33m占用略高\033[0m" - echo -e " 说明文档: \033[36;4mhttps://wiki.metacubex.one\033[0m" - echo -e "2 \033[43;30m SingBoxR \033[0m: \033[32m支持全面\033[0m" - echo -e " >>\033[32m$singboxr_v \033[33m使用reF1nd增强分支\033[0m" - echo -e " 说明文档: \033[36;4mhttps://sing-boxr.dustinwin.us.kg\033[0m" - echo -e "3 \033[43;30m SingBox \033[0m: \033[32m占用较低\033[0m" - echo -e " >>\033[32m$singbox_v \033[33m不支持providers\033[0m" - echo -e " 说明文档: \033[36;4mhttps://sing-box.sagernet.org\033[0m" - echo -e "4 \033[43;30m Clash \033[0m: \033[32m占用低\033[0m" - echo -e " >>\033[32m$clash_v \033[33m不安全,已停止维护\033[0m" - echo -e " 说明文档: \033[36;4mhttps://lancellc.gitbook.io\033[0m" - echo "-----------------------------------------------" - echo -e "5 \033[36m自定义内核\033[0m $custcore" - echo -e "6 \033[32m更新当前内核\033[0m" - echo "-----------------------------------------------" - echo "9 手动指定处理器架构" - echo "-----------------------------------------------" - echo 0 返回上级菜单 - read -p "请输入对应数字 > " num - case "$num" in - 0) - ;; - 1) - [ -d "/jffs" ] && { - echo -e "\033[31mMeta内核使用的GeoSite.dat数据库在华硕设备存在被系统误删的问题,可能无法使用!\033[0m" - sleep 3 - } - crashcore=meta - custcorelink='' - getcore - ;; - 2) - crashcore=singboxr - custcorelink='' - getcore - ;; - 3) - crashcore=singbox - custcorelink='' - getcore - ;; - 4) - crashcore=clash - custcorelink='' - getcore - ;; - 5) - setcustcore - setcore - ;; - 6) - getcore - ;; - 9) - setcpucore - ;; - *) - errornum - ;; - esac -} -#数据库 -getgeo(){ #下载Geo文件 - #生成链接 - echo "-----------------------------------------------" - echo 正在从服务器获取数据库文件………… - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/${geoname} bin/geodata/$geotype - if [ "$?" = "1" ];then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" - error_down - else - echo "$geoname" | grep -Eq '.mrs|.srs|.tar.gz' && { - geofile='ruleset/' - [ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset - } - if echo "$geoname" | grep -Eq '.tar.gz';then - tar -zxf "$TMPDIR"/${geoname} ${tar_para} -C "$BINDIR"/${geofile} > /dev/null - [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf "$TMPDIR"/${geoname} && exit 1 - rm -rf "$TMPDIR"/${geoname} - else - mv -f "$TMPDIR"/${geoname} "$BINDIR"/${geofile}${geoname} - fi - echo "-----------------------------------------------" - echo -e "\033[32m$geotype数据库文件下载成功!\033[0m" - geo_v="$(echo $geotype | awk -F "." '{print $1}')_v" - setconfig $geo_v $GeoIP_v - fi - sleep 1 -} -setcustgeo(){ #下载自定义数据库文件 - getcustgeo(){ - echo "-----------------------------------------------" - echo "正在获取数据库文件…………" - "$CRASHDIR"/start.sh webget "$TMPDIR"/$geoname $custgeolink - if [ "$?" = "1" ];then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" - error_down - else - echo "$geoname" | grep -Eq '.mrs|.srs' && { - geofile='ruleset/' - [ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset - } - mv -f "$TMPDIR"/${geoname} "$BINDIR"/${geofile}${geoname} - echo "-----------------------------------------------" - echo -e "\033[32m$geotype数据库文件下载成功!\033[0m" - fi - sleep 1 - } - checkcustgeo(){ - [ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag" - [ ! -s "$TMPDIR"/geo.list ] && { - echo -e "\033[32m正在查找可更新的数据库文件!\033[0m" - "$CRASHDIR"/start.sh webget "$TMPDIR"/github_api https://api.github.com/repos/${project}/releases/${api_url} - release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') - cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE 'releases/download.*' | grep -oiE 'geosite.*\.dat"$|country.*\.mmdb"$|.*.mrs|.*.srs' | sed 's|.*/||' | sed 's/"//' > "$TMPDIR"/geo.list - rm -rf "$TMPDIR"/github_api - } - if [ -s "$TMPDIR"/geo.list ];then - echo -e "请选择需要更新的数据库文件:" - echo "-----------------------------------------------" - cat "$TMPDIR"/geo.list | awk '{print " "NR" "$1}' - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 0) - ;; - [1-99]) - if [ "$num" -le "$(wc -l < "$TMPDIR"/geo.list)" ];then - geotype=$(sed -n "$num"p "$TMPDIR"/geo.list) - [ -n "$(echo $geotype | grep -oiE 'GeoSite.*dat')" ] && geoname=GeoSite.dat - [ -n "$(echo $geotype | grep -oiE 'Country.*mmdb')" ] && geoname=Country.mmdb - [ -n "$(echo $geotype | grep -oiE '.*(.srs|.mrs)')" ] && geoname=$geotype - custgeolink=https://github.com/${project}/releases/download/${release_tag}/${geotype} - getcustgeo - checkcustgeo - else - errornum - fi - ;; - *) - errornum - ;; - esac - else - echo -e "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m" - sleep 1 - fi - } - rm -rf "$TMPDIR"/geo.list - echo "-----------------------------------------------" - echo -e "\033[36m此处数据库均源自互联网采集,此处致谢各位开发者!\033[0m" - echo -e "\033[32m请点击或复制链接前往项目页面查看具体说明!\033[0m" - echo -e "\033[31m自定义数据库不支持定时任务及小闪存模式!\033[0m" - echo -e "\033[33m如遇到网络错误请先启动ShellCrash服务!\033[0m" - echo -e "\033[0m请选择需要更新的数据库项目来源:\033[0m" - echo "-----------------------------------------------" - echo -e " 1 \033[36;4mhttps://github.com/MetaCubeX/meta-rules-dat\033[0m (仅限Clash/Mihomo)" - echo -e " 2 \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m (仅限Clash/Mihomo)" - echo -e " 3 \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m (仅限SingBox-srs)" - echo -e " 4 \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m (仅限Mihomo-mrs)" - echo -e " 5 \033[36;4mhttps://github.com/Loyalsoldier/geoip\033[0m (仅限Clash-GeoIP)" - echo "-----------------------------------------------" - echo -e " 9 \033[33m自定义数据库链接 \033[0m" - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num - case "$num" in - 0) - ;; - 1) - project=MetaCubeX/meta-rules-dat - api_tag=latest - checkcustgeo - setcustgeo - ;; - 2) - project=DustinWin/ruleset_geodata - api_tag=mihomo-geodata - checkcustgeo - setcustgeo - ;; - 3) - project=DustinWin/ruleset_geodata - api_tag=sing-box-ruleset - checkcustgeo - setcustgeo - ;; - 4) - project=DustinWin/ruleset_geodata - api_tag=mihomo-ruleset - checkcustgeo - setcustgeo - ;; - 5) - project=Loyalsoldier/geoip - api_tag=latest - checkcustgeo - setcustgeo - ;; - 9) - read -p "请输入自定义数据库的链接地址 > " link - [ -n "$link" ] && custgeolink="$link" - getgeo - setcustgeo - ;; - *) - errornum - ;; - esac -} -setgeo(){ - . $CFG_PATH > /dev/null - [ -n "$cn_mini_v" ] && geo_type_des=精简版 || geo_type_des=全球版 - echo "-----------------------------------------------" - echo -e "\033[36m请选择需要更新的Geo数据库文件:\033[0m" - echo -e "\033[36mMihomo内核和SingBox内核的数据库文件不通用\033[0m" - echo -e "在线数据库最新版本(每日同步上游):\033[32m$GeoIP_v\033[0m" - echo "-----------------------------------------------" - echo -e " 1 CN-IP绕过文件(约0.1mb) \033[33m$china_ip_list_v\033[0m" - echo -e " 2 CN-IPV6绕过文件(约30kb) \033[33m$china_ipv6_list_v\033[0m" - echo "-----------------------------------------------" - echo -e " 3 Mihomo精简版GeoIP_cn数据库(约0.1mb) \033[33m$cn_mini_v\033[0m" - echo -e " 4 Mihomo完整版GeoSite数据库(约5mb) \033[33m$geosite_v\033[0m" - echo -e " 5 Mihomo-mrs数据库常用包(约1mb) \033[33m$mrs_v\033[0m" - echo "-----------------------------------------------" - echo -e " 6 Singbox-srs数据库常用包(约0.8mb) \033[33m$srs_v\033[0m" - echo "-----------------------------------------------" - echo -e " 8 \033[32m自定义数据库文件\033[0m" - echo -e " 9 \033[31m清理数据库文件\033[0m" - echo " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 0) - ;; - 1) - geotype=china_ip_list.txt - geoname=cn_ip.txt - getgeo - setgeo - ;; - 2) - geotype=china_ipv6_list.txt - geoname=cn_ipv6.txt - getgeo - setgeo - ;; - 3) - geotype=cn_mini.mmdb - geoname=Country.mmdb - getgeo - setgeo - ;; - 4) - geotype=geosite.dat - geoname=GeoSite.dat - getgeo - setgeo - ;; - 5) - geotype=mrs.tar.gz - geoname=mrs.tar.gz - getgeo - setgeo - ;; - 6) - geotype=srs.tar.gz - geoname=srs.tar.gz - getgeo - setgeo - ;; - 8) - setcustgeo - setgeo - ;; - 9) - echo "-----------------------------------------------" - echo -e "\033[33m这将清理$CRASHDIR目录及/ruleset目录下所有数据库文件!\033[0m" - echo -e "\033[36m清理后启动服务即可自动下载所需文件~\033[0m" - echo "-----------------------------------------------" - read -p "确认清理?[1/0] > " res - [ "$res" = '1' ] && { - for file in cn_ip.txt cn_ipv6.txt Country.mmdb GeoSite.dat geoip.db geosite.db;do - rm -rf $CRASHDIR/$file - done - for var in Country_v cn_mini_v china_ip_list_v china_ipv6_list_v geosite_v geoip_cn_v geosite_cn_v mrs_geosite_cn_v srs_geoip_cn_v srs_geosite_cn_v mrs_v srs_v;do - setconfig $var - done - rm -rf $CRASHDIR/ruleset/* - echo -e "\033[33m所有数据库文件均已清理!\033[0m" - sleep 1 - } - setgeo - ;; - *) - errornum - ;; -esac -} -#Dashboard -getdb(){ - dblink="${update_url}/" - echo "-----------------------------------------------" - echo 正在连接服务器获取安装文件………… - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz - if [ "$?" = "1" ];then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" - echo "-----------------------------------------------" - error_down - setdb - else - echo -e "\033[33m下载成功,正在解压文件!\033[0m" - mkdir -p $dbdir > /dev/null - tar -zxf ""$TMPDIR"/clashdb.tar.gz" ${tar_para} -C $dbdir > /dev/null - [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf "$TMPDIR"/clashfm.tar.gz && exit 1 - #修改默认host和端口 - if [ "$db_type" = "clashdb" -o "$db_type" = "meta_db" -o "$db_type" = "zashboard" ];then - sed -i "s/127.0.0.1/${host}/g" $dbdir/assets/*.js - sed -i "s/9090/${db_port}/g" $dbdir/assets/*.js - elif [ "$db_type" = "meta_xd" ];then - sed -i "s/127.0.0.1:9090/${host}:${db_port}/g" $dbdir/_nuxt/*.js - else - sed -i "s/127.0.0.1:9090/${host}:${db_port}/g" $dbdir/*.html - fi - #写入配置文件 - setconfig hostdir "'$hostdir'" - echo "-----------------------------------------------" - echo -e "\033[32m面板安装成功!\033[36m如未生效,请使用【Ctrl+F5】强制刷新浏览器!!!\033[0m" - rm -rf "$TMPDIR"/clashdb.tar.gz - fi - sleep 1 -} -setdb(){ - dbdir(){ - if [ -f /www/clash/CNAME -o -f "$CRASHDIR"/ui/CNAME ];then - echo "-----------------------------------------------" - echo -e "\033[31m检测到您已经安装过本地面板了!\033[0m" - echo "-----------------------------------------------" - read -p "是否升级/覆盖安装?[1/0] > " res - if [ "$res" = 1 ]; then - rm -rf "$BINDIR"/ui - [ -f /www/clash/CNAME ] && rm -rf /www/clash && dbdir=/www/clash - [ -f "$CRASHDIR"/ui/CNAME ] && rm -rf "$CRASHDIR"/ui && dbdir="$CRASHDIR"/ui - getdb - else - setdb - echo -e "\033[33m安装已取消!\033[0m" - fi - elif [ -w /www -a -n "$(pidof nginx)" ];then - echo "-----------------------------------------------" - echo -e "请选择面板\033[33m安装目录:\033[0m" - echo "-----------------------------------------------" - echo -e " 1 在${CRASHDIR}/ui目录安装" - echo -e " 2 在/www/clash目录安装" - echo "-----------------------------------------------" - echo " 0 返回上级菜单" - read -p "请输入对应数字 > " num - - if [ "$num" = '1' ]; then - dbdir="$CRASHDIR"/ui - hostdir=":$db_port/ui" - getdb - elif [ "$num" = '2' ]; then - dbdir=/www/clash - hostdir='/clash' - getdb - else - setdb - echo -e "\033[33m安装已取消!\033[0m" - fi - else - dbdir="$CRASHDIR"/ui - hostdir=":$db_port/ui" - getdb - fi - } - - echo "-----------------------------------------------" - echo -e "\033[36m安装本地版dashboard管理面板\033[0m" - echo -e "\033[32m打开管理面板的速度更快且更稳定\033[0m" - echo "-----------------------------------------------" - echo -e "请选择面板\033[33m安装类型:\033[0m" - echo "-----------------维护中------------------------" - echo -e " 1 安装\033[32mzashboard面板\033[0m(约2.2mb)" - echo -e " 2 安装\033[32mMetaXD面板\033[0m(约1.5mb)" - echo -e " 3 安装\033[32mYacd-Meta魔改面板\033[0m(约1.7mb)" - echo "---------------已停止维护----------------------" - echo -e " 4 安装\033[32m基础面板\033[0m(约500kb)" - echo -e " 5 安装\033[32mMeta基础面板\033[0m(约800kb)" - echo -e " 6 安装\033[32mYacd面板\033[0m(约1.1mb)" - echo "-----------------------------------------------" - echo -e " 9 卸载\033[33m本地面板\033[0m" - echo " 0 返回上级菜单" - read -p "请输入对应数字 > " num - - case "$num" in - 0) ;; - 1) - db_type=zashboard - echo $update_url - setconfig external_ui_url "https://raw.githubusercontent.com/juewuy/ShellCrash/update/bin/dashboard/zashboard.tar.gz" - dbdir - ;; - 2) - db_type=meta_xd - setconfig external_ui_url "https://raw.githubusercontent.com/juewuy/ShellCrash/update/bin/dashboard/meta_xd.tar.gz" - dbdir - ;; - 3) - db_type=meta_yacd - dbdir - ;; - 4) - db_type=clashdb - dbdir - ;; - 5) - db_type=meta_db - dbdir - ;; - 6) - db_type=yacd - dbdir - ;; - 9) - read -p "确认卸载本地面板?(1/0) > " res - if [ "$res" = 1 ];then - rm -rf /www/clash - rm -rf "$CRASHDIR"/ui - rm -rf "$BINDIR"/ui - echo "-----------------------------------------------" - echo -e "\033[31m面板已经卸载!\033[0m" - sleep 1 - fi - ;; - *) - errornum - ;; - esac -} -#根证书 -getcrt(){ - echo "-----------------------------------------------" - echo "正在连接服务器获取安装文件…………" - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/ca-certificates.crt bin/fix/ca-certificates.crt - if [ "$?" = "1" ];then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" - error_down - else - echo "-----------------------------------------------" - [ "$systype" = 'mi_snapshot' ] && cp -f "$TMPDIR"/ca-certificates.crt $CRASHDIR/tools #镜像化设备特殊处理 - [ -f $openssldir/certs ] && rm -rf $openssldir/certs #如果certs不是目录而是文件则删除并创建目录 - mkdir -p $openssldir/certs - mv -f "$TMPDIR"/ca-certificates.crt $crtdir - "$CRASHDIR"/start.sh webget /dev/null https://baidu.com echooff rediron skipceroff - if [ "$?" = "1" ];then - export CURL_CA_BUNDLE=$crtdir - echo "export CURL_CA_BUNDLE=$crtdir" >> /etc/profile - fi - echo -e "\033[32m证书安装成功!\033[0m" - sleep 1 - fi -} -setcrt(){ - openssldir="$(openssl version -d 2>&1 | awk -F '"' '{print $2}')" - if [ -d "$openssldir/certs/" ];then - crtdir="$openssldir/certs/ca-certificates.crt" - else - crtdir="/etc/ssl/certs/ca-certificates.crt" - fi - if [ -n "$openssldir" ];then - echo "-----------------------------------------------" - echo -e "\033[36m安装/更新本地根证书文件(ca-certificates.crt)\033[0m" - echo -e "\033[33m用于解决证书校验错误,x509报错等问题\033[0m" - echo -e "\033[31m无上述问题的设备请勿使用!\033[0m" - echo "-----------------------------------------------" - [ -f "$crtdir" ] && echo -e "\033[33m检测到系统已经存在根证书文件($crtdir)了!\033[0m\n-----------------------------------------------" - read -p "是否覆盖更新?(1/0) > " res - - if [ -z "$res" ];then - errornum - elif [ "$res" = '0' ]; then - i= - elif [ "$res" = '1' ]; then - getcrt - else - errornum - fi - else - echo "-----------------------------------------------" - echo -e "\033[33m设备可能尚未安装openssl,无法安装证书文件!\033[0m" - sleep 1 - fi -} -#安装源 -setserver(){ - [ -z "$release_type" ] && release_name=未指定 - [ -n "$release_type" ] && release_name="$release_type(回退)" - [ "$release_type" = stable ] && release_name=稳定版 - [ "$release_type" = master ] && release_name=公测版 - [ "$release_type" = dev ] && release_name=开发版 - [ -n "$url_id" ] && url_name=$(grep "$url_id" "$CRASHDIR"/configs/servers.list 2>/dev/null | awk '{print $2}') || url_name="$update_url" - saveserver(){ - #写入配置文件 - setconfig update_url "'$update_url'" - setconfig url_id $url_id - setconfig release_type $release_type - echo "-----------------------------------------------" - echo -e "\033[32m源地址切换成功!\033[0m" - } - echo "-----------------------------------------------" - echo -e "\033[30;47m切换ShellCrash版本及更新源地址\033[0m" - echo -e "当前版本:\033[4;33m$release_name\033[0m 当前源:\033[4;32m$url_name\033[0m" - echo "-----------------------------------------------" - grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$2}' - echo "-----------------------------------------------" - echo -e " a 切换至\033[32m稳定版-stable\033[0m" - echo -e " b 切换至\033[36m公测版-master\033[0m" - echo -e " c 切换至\033[33m开发版-dev\033[0m" - echo "-----------------------------------------------" - echo -e " d 自定义源地址(用于本地源或自建源)" - echo -e " e \033[31m版本回退\033[0m" - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应字母或数字 > " num - case "$num" in - 0) - checkupdate=false - ;; - [1-99]) - url_id_new=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n ""$num"p" | awk '{print $1}') - if [ -z "$url_id_new" ];then - errornum - sleep 1 - setserver - elif [ "$url_id_new" -ge 200 ];then - update_url=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n ""$num"p" | awk '{print $3}') - url_id='' - saveserver - else - url_id=$url_id_new - update_url='' - saveserver - fi - unset url_id_new - ;; - a) - release_type=stable - [ -z "$url_id" ] && url_id=101 - saveserver - setserver - ;; - b) - release_type=master - [ -z "$url_id" ] && url_id=101 - saveserver - setserver - ;; - c) - echo "-----------------------------------------------" - echo -e "\033[33m开发版未经过妥善测试,可能依然存在大量bug!!!\033[0m" - echo -e "\033[36m如果你没有足够的耐心或者测试经验,切勿使用此版本!\033[0m" - echo -e "请务必加入我们的讨论组:\033[32;4mhttps://t.me/ShellClash\033[0m" - read -p "是否依然切换到开发版?(1/0) > " res - if [ "$res" = 1 ];then - release_type=dev - [ -z "$url_id" ] && url_id=101 - saveserver - fi - setserver - ;; - d) - echo "-----------------------------------------------" - read -p "请输入个人源路径 > " update_url - if [ -z "$update_url" ];then - echo "-----------------------------------------------" - echo -e "\033[31m取消输入,返回上级菜单\033[0m" - else - url_id='' - release_type='' - saveserver - fi - ;; - e) - echo "-----------------------------------------------" - if [ -n "$url_id" ] && [ "$url_id" -lt 200 ];then - echo -ne "\033[32m正在获取版本信息!\033[0m\r" - "$CRASHDIR"/start.sh get_bin "$TMPDIR"/release_version bin/release_version - if [ "$?" = "0" ];then - echo -e "\033[31m请选择想要回退至的稳定版版本:\033[0m" - cat "$TMPDIR"/release_version | awk '{print " "NR" "$1}' - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num - if [ -z "$num" -o "$num" = 0 ]; then - setserver - elif [ $num -le $(cat "$TMPDIR"/release_version 2>/dev/null | awk 'END{print NR}') ]; then - release_type=$(cat "$TMPDIR"/release_version | awk '{print $1}' | sed -n "$num"p) - update_url='' - saveserver - else - echo "-----------------------------------------------" - errornum - sleep 1 - setserver - fi - else - echo "-----------------------------------------------" - echo -e "\033[31m版本回退信息获取失败,请尝试更换其他安装源!\033[0m" - sleep 1 - setserver - fi - rm -rf "$TMPDIR"/release_version - else - echo -e "\033[31m当前源不支持版本回退,请尝试更换其他安装源!\033[0m" - sleep 1 - setserver - fi - ;; - *) - errornum - ;; - esac -} diff --git a/scripts/menus/README.md b/scripts/menus/README.md index 1762fba9..916c5cdd 100644 --- a/scripts/menus/README.md +++ b/scripts/menus/README.md @@ -1,3 +1,3 @@ -用于存放脚本各级菜单界面的脚本 - +用于存放脚本各级菜单界面的脚本 + 此处脚本内容包含各类文字说明 \ No newline at end of file diff --git a/scripts/shellcrash.openrc b/scripts/starts/shellcrash.openrc similarity index 100% rename from scripts/shellcrash.openrc rename to scripts/starts/shellcrash.openrc diff --git a/scripts/shellcrash.procd b/scripts/starts/shellcrash.procd similarity index 100% rename from scripts/shellcrash.procd rename to scripts/starts/shellcrash.procd diff --git a/scripts/shellcrash.service b/scripts/starts/shellcrash.service similarity index 100% rename from scripts/shellcrash.service rename to scripts/starts/shellcrash.service diff --git a/scripts/misnap_init.sh b/scripts/starts/snapshot_init.sh similarity index 100% rename from scripts/misnap_init.sh rename to scripts/starts/snapshot_init.sh From 1a4330cb861e3e60862a47ce27ac90ba7e237380 Mon Sep 17 00:00:00 2001 From: juewuy Date: Wed, 24 Dec 2025 10:05:01 +0800 Subject: [PATCH 2/3] =?UTF-8?q?~=E7=A7=BB=E5=8A=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/{webget.sh => menus/9-upgrade.sh} | 780 ++++++---------------- 1 file changed, 205 insertions(+), 575 deletions(-) rename scripts/{webget.sh => menus/9-upgrade.sh} (61%) diff --git a/scripts/webget.sh b/scripts/menus/9-upgrade.sh similarity index 61% rename from scripts/webget.sh rename to scripts/menus/9-upgrade.sh index 7e4b4389..7ef99843 100644 --- a/scripts/webget.sh +++ b/scripts/menus/9-upgrade.sh @@ -1,38 +1,145 @@ #!/bin/sh # Copyright (C) Juewuy +. "$CRASHDIR"/libs/check_dir_avail.sh + error_down(){ echo -e "\033[33m请尝试切换至其他安装源后重新下载!\033[0m" echo -e "或者参考 \033[32;4mhttps://juewuy.github.io/bdaz\033[0m 进行本地安装!" sleep 1 } -dir_avail(){ - df -h >/dev/null 2>&1 && h=$2 - df $h $1 |awk '{ for(i=1;i<=NF;i++){ if(NR==1){ arr[i]=$i; }else{ arr[i]=arr[i]" "$i; } } } END{ for(i=1;i<=NF;i++){ print arr[i]; } }' |grep -E 'Ava|可用' |awk '{print $2}' +#主界面 +upgrade(){ + echo "-----------------------------------------------" + echo -ne "\033[32m正在检查更新!\033[0m\r" + checkupdate + [ -z "$core_v" ] && core_v=$crashcore + core_v_new=$(eval echo \$"$crashcore"_v) + echo -e "\033[30;47m欢迎使用更新功能:\033[0m" + echo "-----------------------------------------------" + echo -e "当前目录(\033[32m$CRASHDIR\033[0m)剩余空间:\033[36m$(dir_avail "$CRASHDIR" -h)\033[0m" + [ "$(dir_avail "$CRASHDIR")" -le 5120 ] && [ "$CRASHDIR" = "$BINDIR" ] && { + echo -e "\033[33m当前目录剩余空间较低,建议开启小闪存模式!\033[0m" + sleep 1 } - -#下载更新相关 -getscripts(){ #更新脚本文件 - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/ShellCrash.tar.gz ShellCrash.tar.gz + echo "-----------------------------------------------" + echo -e " 1 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$version_new \033[36m$release_type\033[0m" + echo -e " 2 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m" + echo -e " 3 更新\033[32m数据库文件\033[0m > \033[32m$GeoIP_v\033[0m" + echo -e " 4 安装本地\033[35mDashboard\033[0m面板" + echo -e " 5 安装/更新本地\033[33m根证书文件\033[0m" + echo -e " 6 查看\033[32mPAC\033[0m自动代理配置" + echo "-----------------------------------------------" + echo -e " 7 切换\033[36m安装源\033[0m及\033[36m安装版本\033[0m" + echo -e " 8 \033[32m配置自动更新\033[0m" + echo -e " 9 \033[31m卸载ShellCrash\033[0m" + echo "-----------------------------------------------" + echo -e "99 \033[36m鸣谢!\033[0m" + echo "-----------------------------------------------" + echo -e " 0 返回上级菜单" + echo "-----------------------------------------------" + read -p "请输入对应数字 > " num + case "$num" in + 0) + ;; + 1) + setscripts + ;; + 2) + setcore + upgrade + ;; + 3) + setgeo + upgrade + ;; + 4) + setdb + upgrade + ;; + 5) + setcrt + upgrade + ;; + 6) + echo "-----------------------------------------------" + echo -e "PAC配置链接为:\033[30;47m http://$host:$db_port/ui/pac \033[0m" + echo -e "PAC的使用教程请参考:\033[4;32mhttps://juewuy.github.io/ehRUeewcv\033[0m" + sleep 2 + upgrade + ;; + 7) + setserver + upgrade + ;; + 8) + . "$CRASHDIR"/task/task.sh && task_add + upgrade + ;; + 9) + uninstall + exit + ;; + 99) + echo "-----------------------------------------------" + echo -e "感谢:\033[32mClash项目 \033[0m作者\033[36m Dreamacro\033[0m" + echo -e "感谢:\033[32msing-box项目 \033[0m作者\033[36m SagerNet\033[0m 项目地址:\033[32mhttps://github.com/SagerNet/sing-box\033[0m" + echo -e "感谢:\033[32mMetaCubeX项目 \033[0m作者\033[36m MetaCubeX\033[0m 项目地址:\033[32mhttps://github.com/MetaCubeX\033[0m" + echo -e "感谢:\033[32mYACD面板项目 \033[0m作者\033[36m haishanh\033[0m 项目地址:\033[32mhttps://github.com/haishanh/yacd\033[0m" + echo -e "感谢:\033[32mzashboard项目 \033[0m作者\033[36m Zephyruso\033[0m 项目地址:\033[32mhttps://github.com/Zephyruso/zashboard\033[0m" + echo -e "感谢:\033[32mSubconverter \033[0m作者\033[36m tindy2013\033[0m 项目地址:\033[32mhttps://github.com/tindy2013/subconverter\033[0m" + echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m PuerNya\033[0m 项目地址:\033[32mhttps://github.com/PuerNya/sing-box\033[0m" + echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m reF1nd\033[0m 项目地址:\033[32mhttps://github.com/reF1nd/sing-box\033[0m" + echo -e "感谢:\033[32mDustinWin相关项目 \033[0m作者\033[36m DustinWin\033[0m 作者地址:\033[32mhttps://github.com/DustinWin\033[0m" + echo "-----------------------------------------------" + echo -e "特别感谢:\033[36m所有帮助及赞助过此项目的同仁们!\033[0m" + echo "-----------------------------------------------" + sleep 2 + upgrade + ;; + *) + errornum + ;; + esac +} +#检查更新 +checkupdate(){ + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/version_new version echooff + [ "$?" = "0" ] && { + version_new=$(cat "$TMPDIR"/version_new) + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/version_new bin/version echooff + } + if [ "$?" = "0" ];then + . "$TMPDIR"/version_new 2>/dev/null + else + echo -e "\033[31m检查更新失败!请尝试切换其他安装源!\033[0m" + setserver + [ "$checkupdate" = false ] || checkupdate + fi + rm -rf "$TMPDIR"/version_new +} +#更新脚本 +getscripts(){ + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/ShellCrash.tar.gz ShellCrash.tar.gz if [ "$?" != "0" ];then echo -e "\033[33m文件下载失败!\033[0m" error_down else - ${CRASHDIR}/start.sh stop 2>/dev/null + "$CRASHDIR"/start.sh stop 2>/dev/null #解压 echo "-----------------------------------------------" echo "开始解压文件!" - mkdir -p ${CRASHDIR} > /dev/null - tar -zxf "${TMPDIR}/ShellCrash.tar.gz" ${tar_para} -C ${CRASHDIR}/ + mkdir -p "$CRASHDIR" > /dev/null + tar -zxf ""$TMPDIR"/ShellCrash.tar.gz" ${tar_para} -C "$CRASHDIR"/ if [ $? -ne 0 ];then echo -e "\033[33m文件解压失败!\033[0m" error_down else - . ${CRASHDIR}/init.sh >/dev/null + . "$CRASHDIR"/init.sh >/dev/null echo -e "\033[32m脚本更新成功!\033[0m" fi fi - rm -rf ${TMPDIR}/ShellCrash.tar.gz + rm -rf "$TMPDIR"/ShellCrash.tar.gz exit } setscripts(){ @@ -52,7 +159,7 @@ setscripts(){ exit; fi } - +#更新内核 getcpucore(){ #自动获取内核架构 cputype=$(uname -ms | tr ' ' '_' | tr '[A-Z]' '[a-z]') [ -n "$(echo $cputype | grep -E "linux.*armv.*")" ] && cpucore="armv5" @@ -121,7 +228,7 @@ switch_core(){ #clash与singbox内核切换 geodate_v='geoip_cn_v geosite_cn_v srs_geoip_cn_v srs_geosite_cn_v' } for text in ${geodate} ;do - rm -rf ${CRASHDIR}/${text} + rm -rf "$CRASHDIR"/${text} done for text in ${geodate_v} ;do setconfig "$text" @@ -133,7 +240,7 @@ switch_core(){ #clash与singbox内核切换 else COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"' fi - setconfig COMMAND "$COMMAND" ${CRASHDIR}/configs/command.env && . ${CRASHDIR}/configs/command.env + setconfig COMMAND "$COMMAND" "$CRASHDIR"/configs/command.env && . "$CRASHDIR"/configs/command.env } getcore(){ #下载内核文件 [ -z "$crashcore" ] && crashcore=meta @@ -146,53 +253,53 @@ getcore(){ #下载内核文件 zip_type=$(echo $custcorelink | grep -oE 'tar.gz$') [ -z "$zip_type" ] && zip_type=$(echo $custcorelink | grep -oE 'gz$') if [ -n "$zip_type" ];then - ${CRASHDIR}/start.sh webget ${TMPDIR}/core_new.${zip_type} "$custcorelink" + "$CRASHDIR"/start.sh webget "$TMPDIR"/core_new.${zip_type} "$custcorelink" else echo -e "\033[31m链接不是以.tar.gz或.gz结尾!下载已取消!\033[0m" exit fi else - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/core_new.tar.gz bin/${crashcore}/${core_new}-linux-${cpucore}.tar.gz + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/core_new.tar.gz bin/${crashcore}/${core_new}-linux-${cpucore}.tar.gz fi if [ "$?" = "1" ];then echo -e "\033[31m核心文件下载失败!\033[0m" - rm -rf ${TMPDIR}/core_new.tar.gz + rm -rf "$TMPDIR"/core_new.tar.gz [ -z "$custcorelink" ] && error_down else [ -n "$(pidof CrashCore)" ] && { - ${CRASHDIR}/start.sh stop #停止内核服务防止内存不足 + "$CRASHDIR"/start.sh stop #停止内核服务防止内存不足 rm -rf "$TMPDIR"/CrashCore #删除缓存内核防止缓存空间不足 } - [ -f ${TMPDIR}/core_new.tar.gz ] && { - mkdir -p ${TMPDIR}/core_tmp - [ "$BINDIR" = "$TMPDIR" ] && rm -rf ${TMPDIR}/CrashCore #小闪存模式防止空间不足 - tar -zxf "${TMPDIR}/core_new.tar.gz" ${tar_para} -C ${TMPDIR}/core_tmp/ - for file in $(find ${TMPDIR}/core_tmp 2>/dev/null);do - [ -f $file ] && [ -n "$(echo $file | sed 's#.*/##' | grep -iE '(CrashCore|sing|meta|mihomo|clash|premium)')" ] && mv -f $file ${TMPDIR}/core_new + [ -f "$TMPDIR"/core_new.tar.gz ] && { + mkdir -p "$TMPDIR"/core_tmp + [ "$BINDIR" = "$TMPDIR" ] && rm -rf "$TMPDIR"/CrashCore #小闪存模式防止空间不足 + tar -zxf ""$TMPDIR"/core_new.tar.gz" ${tar_para} -C "$TMPDIR"/core_tmp/ + for file in $(find "$TMPDIR"/core_tmp 2>/dev/null);do + [ -f $file ] && [ -n "$(echo $file | sed 's#.*/##' | grep -iE '(CrashCore|sing|meta|mihomo|clash|premium)')" ] && mv -f $file "$TMPDIR"/core_new done - rm -rf ${TMPDIR}/core_tmp + rm -rf "$TMPDIR"/core_tmp } - [ -f ${TMPDIR}/core_new.gz ] && gunzip ${TMPDIR}/core_new.gz && rm -rf ${TMPDIR}/core_new.gz - chmod +x ${TMPDIR}/core_new + [ -f "$TMPDIR"/core_new.gz ] && gunzip "$TMPDIR"/core_new.gz && rm -rf "$TMPDIR"/core_new.gz + chmod +x "$TMPDIR"/core_new [ "$crashcore" = unknow ] && setcoretype if echo "$crashcore" | grep -q 'singbox';then - core_v=$(${TMPDIR}/core_new version 2>/dev/null | grep version | awk '{print $3}') + core_v=$("$TMPDIR"/core_new version 2>/dev/null | grep version | awk '{print $3}') else - core_v=$(${TMPDIR}/core_new -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //') + core_v=$("$TMPDIR"/core_new -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //') fi if [ -z "$core_v" ];then echo -e "\033[31m核心文件下载成功但校验失败!请尝试手动指定CPU版本\033[0m" - rm -rf ${TMPDIR}/core_new - rm -rf ${TMPDIR}/core_new.tar.gz + rm -rf "$TMPDIR"/core_new + rm -rf "$TMPDIR"/core_new.tar.gz setcpucore else echo -e "\033[32m$crashcore核心下载成功!\033[0m" sleep 1 - mv -f ${TMPDIR}/core_new ${TMPDIR}/CrashCore - if [ -f ${TMPDIR}/core_new.tar.gz ];then - mv -f ${TMPDIR}/core_new.tar.gz ${BINDIR}/CrashCore.tar.gz + mv -f "$TMPDIR"/core_new "$TMPDIR"/CrashCore + if [ -f "$TMPDIR"/core_new.tar.gz ];then + mv -f "$TMPDIR"/core_new.tar.gz "$BINDIR"/CrashCore.tar.gz else - tar -zcf ${BINDIR}/CrashCore.tar.gz ${tar_para} -C ${TMPDIR} CrashCore + tar -zcf "$BINDIR"/CrashCore.tar.gz ${tar_para} -C "$TMPDIR" CrashCore fi setconfig crashcore $crashcore setconfig core_v $core_v @@ -206,23 +313,23 @@ setcustcore(){ #自定义内核 [ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag" #通过githubapi获取内核信息 echo -e "\033[32m正在获取内核文件链接!\033[0m" - ${CRASHDIR}/start.sh webget ${TMPDIR}/github_api https://api.github.com/repos/${project}/releases/${api_url} + "$CRASHDIR"/start.sh webget "$TMPDIR"/github_api https://api.github.com/repos/${project}/releases/${api_url} if [ "$?" = 0 ];then - release_tag=$(cat ${TMPDIR}/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') - release_date=$(cat ${TMPDIR}/github_api | grep '"published_at":' | awk -F '"' '{print $4}') - update_date=$(cat ${TMPDIR}/github_api | grep '"updated_at":' | head -n 1 | awk -F '"' '{print $4}') + release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') + release_date=$(cat "$TMPDIR"/github_api | grep '"published_at":' | awk -F '"' '{print $4}') + update_date=$(cat "$TMPDIR"/github_api | grep '"updated_at":' | head -n 1 | awk -F '"' '{print $4}') [ -n "$(echo $cpucore | grep mips)" ] && cpu_type=mips || cpu_type=$cpucore - cat ${TMPDIR}/github_api | grep "browser_download_url" | grep -oE "https://github.com/${project}/releases/download.*linux.*${cpu_type}.*\.gz\"$" | sed 's/"//' > ${TMPDIR}/core.list - rm -rf ${TMPDIR}/github_api + cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE "https://github.com/${project}/releases/download.*linux.*${cpu_type}.*\.gz\"$" | sed 's/"//' > "$TMPDIR"/core.list + rm -rf "$TMPDIR"/github_api # - if [ -s ${TMPDIR}/core.list ];then + if [ -s "$TMPDIR"/core.list ];then echo "-----------------------------------------------" echo -e "内核版本:\033[36m$release_tag\033[0m" echo -e "发布时间:\033[33m$release_date\033[0m" echo -e "更新时间:\033[32m$update_date\033[0m" echo "-----------------------------------------------" echo -e "\033[33m请确认内核信息并选择:\033[0m" - cat ${TMPDIR}/core.list | grep -oE "$release_tag.*" | sed 's|.*/||' | awk '{print " "NR" "$1}' + cat "$TMPDIR"/core.list | grep -oE "$release_tag.*" | sed 's|.*/||' | awk '{print " "NR" "$1}' echo -e " 0 返回上级菜单" echo "-----------------------------------------------" read -p "请输入对应数字 > " num @@ -231,8 +338,8 @@ setcustcore(){ #自定义内核 setcustcore ;; [1-9]|[1-9][0-9]) - if [ "$num" -le "$(wc -l < ${TMPDIR}/core.list)" ];then - custcorelink=$(sed -n "$num"p ${TMPDIR}/core.list) + if [ "$num" -le "$(wc -l < "$TMPDIR"/core.list)" ];then + custcorelink=$(sed -n "$num"p "$TMPDIR"/core.list) getcore else errornum @@ -250,7 +357,7 @@ setcustcore(){ #自定义内核 echo -e "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m" sleep 1 fi - rm -rf ${TMPDIR}/core.list + rm -rf "$TMPDIR"/core.list } [ -z "$cpucore" ] && getcpucore echo "-----------------------------------------------" @@ -331,7 +438,7 @@ setcustcore(){ #自定义内核 setcore(){ #内核选择菜单 #获取核心及版本信息 [ -z "$crashcore" ] && crashcore="unknow" - [ ! -f ${CRASHDIR}/CrashCore.tar.gz -o ! -f ${BINDIR}/CrashCore.tar.gz ] && crashcore="未安装核心" + [ ! -f "$CRASHDIR"/CrashCore.tar.gz -o ! -f "$BINDIR"/CrashCore.tar.gz ] && crashcore="未安装核心" echo "$crashcore" | grep -q 'singbox' && core_old=singbox || core_old=clash [ -n "$custcorelink" ] && custcore="$(echo $custcorelink | sed 's#.*github.com##; s#/releases/download/#@#; s#-linux.*$##')" ### @@ -404,12 +511,12 @@ setcore(){ #内核选择菜单 ;; esac } - +#数据库 getgeo(){ #下载Geo文件 #生成链接 echo "-----------------------------------------------" echo 正在从服务器获取数据库文件………… - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/${geoname} bin/geodata/$geotype + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/${geoname} bin/geodata/$geotype if [ "$?" = "1" ];then echo "-----------------------------------------------" echo -e "\033[31m文件下载失败!\033[0m" @@ -420,11 +527,11 @@ getgeo(){ #下载Geo文件 [ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset } if echo "$geoname" | grep -Eq '.tar.gz';then - tar -zxf ${TMPDIR}/${geoname} ${tar_para} -C ${BINDIR}/${geofile} > /dev/null - [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf ${TMPDIR}/${geoname} && exit 1 - rm -rf ${TMPDIR}/${geoname} + tar -zxf "$TMPDIR"/${geoname} ${tar_para} -C "$BINDIR"/${geofile} > /dev/null + [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf "$TMPDIR"/${geoname} && exit 1 + rm -rf "$TMPDIR"/${geoname} else - mv -f ${TMPDIR}/${geoname} ${BINDIR}/${geofile}${geoname} + mv -f "$TMPDIR"/${geoname} "$BINDIR"/${geofile}${geoname} fi echo "-----------------------------------------------" echo -e "\033[32m$geotype数据库文件下载成功!\033[0m" @@ -437,7 +544,7 @@ setcustgeo(){ #下载自定义数据库文件 getcustgeo(){ echo "-----------------------------------------------" echo "正在获取数据库文件…………" - ${CRASHDIR}/start.sh webget ${TMPDIR}/$geoname $custgeolink + "$CRASHDIR"/start.sh webget "$TMPDIR"/$geoname $custgeolink if [ "$?" = "1" ];then echo "-----------------------------------------------" echo -e "\033[31m文件下载失败!\033[0m" @@ -447,7 +554,7 @@ setcustgeo(){ #下载自定义数据库文件 geofile='ruleset/' [ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset } - mv -f ${TMPDIR}/${geoname} ${BINDIR}/${geofile}${geoname} + mv -f "$TMPDIR"/${geoname} "$BINDIR"/${geofile}${geoname} echo "-----------------------------------------------" echo -e "\033[32m$geotype数据库文件下载成功!\033[0m" fi @@ -455,17 +562,17 @@ setcustgeo(){ #下载自定义数据库文件 } checkcustgeo(){ [ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag" - [ ! -s ${TMPDIR}/geo.list ] && { + [ ! -s "$TMPDIR"/geo.list ] && { echo -e "\033[32m正在查找可更新的数据库文件!\033[0m" - ${CRASHDIR}/start.sh webget ${TMPDIR}/github_api https://api.github.com/repos/${project}/releases/${api_url} - release_tag=$(cat ${TMPDIR}/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') - cat ${TMPDIR}/github_api | grep "browser_download_url" | grep -oE 'releases/download.*' | grep -oiE 'geosite.*\.dat"$|country.*\.mmdb"$|.*.mrs|.*.srs' | sed 's|.*/||' | sed 's/"//' > ${TMPDIR}/geo.list - rm -rf ${TMPDIR}/github_api + "$CRASHDIR"/start.sh webget "$TMPDIR"/github_api https://api.github.com/repos/${project}/releases/${api_url} + release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') + cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE 'releases/download.*' | grep -oiE 'geosite.*\.dat"$|country.*\.mmdb"$|.*.mrs|.*.srs' | sed 's|.*/||' | sed 's/"//' > "$TMPDIR"/geo.list + rm -rf "$TMPDIR"/github_api } - if [ -s ${TMPDIR}/geo.list ];then + if [ -s "$TMPDIR"/geo.list ];then echo -e "请选择需要更新的数据库文件:" echo "-----------------------------------------------" - cat ${TMPDIR}/geo.list | awk '{print " "NR" "$1}' + cat "$TMPDIR"/geo.list | awk '{print " "NR" "$1}' echo -e " 0 返回上级菜单" echo "-----------------------------------------------" read -p "请输入对应数字 > " num @@ -473,8 +580,8 @@ setcustgeo(){ #下载自定义数据库文件 0) ;; [1-99]) - if [ "$num" -le "$(wc -l < ${TMPDIR}/geo.list)" ];then - geotype=$(sed -n "$num"p ${TMPDIR}/geo.list) + if [ "$num" -le "$(wc -l < "$TMPDIR"/geo.list)" ];then + geotype=$(sed -n "$num"p "$TMPDIR"/geo.list) [ -n "$(echo $geotype | grep -oiE 'GeoSite.*dat')" ] && geoname=GeoSite.dat [ -n "$(echo $geotype | grep -oiE 'Country.*mmdb')" ] && geoname=Country.mmdb [ -n "$(echo $geotype | grep -oiE '.*(.srs|.mrs)')" ] && geoname=$geotype @@ -494,7 +601,7 @@ setcustgeo(){ #下载自定义数据库文件 sleep 1 fi } - rm -rf ${TMPDIR}/geo.list + rm -rf "$TMPDIR"/geo.list echo "-----------------------------------------------" echo -e "\033[36m此处数据库均源自互联网采集,此处致谢各位开发者!\033[0m" echo -e "\033[32m请点击或复制链接前往项目页面查看具体说明!\033[0m" @@ -555,7 +662,7 @@ setcustgeo(){ #下载自定义数据库文件 ;; esac } -setgeo(){ #数据库选择菜单 +setgeo(){ . $CFG_PATH > /dev/null [ -n "$cn_mini_v" ] && geo_type_des=精简版 || geo_type_des=全球版 echo "-----------------------------------------------" @@ -628,12 +735,12 @@ setgeo(){ #数据库选择菜单 read -p "确认清理?[1/0] > " res [ "$res" = '1' ] && { for file in cn_ip.txt cn_ipv6.txt Country.mmdb GeoSite.dat geoip.db geosite.db;do - rm -rf "$CRASHDIR"/$file + rm -rf $CRASHDIR/$file done for var in Country_v cn_mini_v china_ip_list_v china_ipv6_list_v geosite_v geoip_cn_v geosite_cn_v mrs_geosite_cn_v srs_geoip_cn_v srs_geosite_cn_v mrs_v srs_v;do setconfig $var done - rm -rf "$CRASHDIR"/ruleset/* + rm -rf $CRASHDIR/ruleset/* echo -e "\033[33m所有数据库文件均已清理!\033[0m" sleep 1 } @@ -644,12 +751,12 @@ setgeo(){ #数据库选择菜单 ;; esac } - -getdb(){ #下载Dashboard文件 +#Dashboard +getdb(){ dblink="${update_url}/" echo "-----------------------------------------------" echo 正在连接服务器获取安装文件………… - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz if [ "$?" = "1" ];then echo "-----------------------------------------------" echo -e "\033[31m文件下载失败!\033[0m" @@ -659,8 +766,8 @@ getdb(){ #下载Dashboard文件 else echo -e "\033[33m下载成功,正在解压文件!\033[0m" mkdir -p $dbdir > /dev/null - tar -zxf "${TMPDIR}/clashdb.tar.gz" ${tar_para} -C $dbdir > /dev/null - [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf ${TMPDIR}/clashfm.tar.gz && exit 1 + tar -zxf ""$TMPDIR"/clashdb.tar.gz" ${tar_para} -C $dbdir > /dev/null + [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf "$TMPDIR"/clashfm.tar.gz && exit 1 #修改默认host和端口 if [ "$db_type" = "clashdb" -o "$db_type" = "meta_db" -o "$db_type" = "zashboard" ];then sed -i "s/127.0.0.1/${host}/g" $dbdir/assets/*.js @@ -674,21 +781,21 @@ getdb(){ #下载Dashboard文件 setconfig hostdir "'$hostdir'" echo "-----------------------------------------------" echo -e "\033[32m面板安装成功!\033[36m如未生效,请使用【Ctrl+F5】强制刷新浏览器!!!\033[0m" - rm -rf ${TMPDIR}/clashdb.tar.gz + rm -rf "$TMPDIR"/clashdb.tar.gz fi sleep 1 } setdb(){ dbdir(){ - if [ -f /www/clash/CNAME -o -f ${CRASHDIR}/ui/CNAME ];then + if [ -f /www/clash/CNAME -o -f "$CRASHDIR"/ui/CNAME ];then echo "-----------------------------------------------" echo -e "\033[31m检测到您已经安装过本地面板了!\033[0m" echo "-----------------------------------------------" read -p "是否升级/覆盖安装?[1/0] > " res if [ "$res" = 1 ]; then - rm -rf ${BINDIR}/ui + rm -rf "$BINDIR"/ui [ -f /www/clash/CNAME ] && rm -rf /www/clash && dbdir=/www/clash - [ -f ${CRASHDIR}/ui/CNAME ] && rm -rf ${CRASHDIR}/ui && dbdir=${CRASHDIR}/ui + [ -f "$CRASHDIR"/ui/CNAME ] && rm -rf "$CRASHDIR"/ui && dbdir="$CRASHDIR"/ui getdb else setdb @@ -705,7 +812,7 @@ setdb(){ read -p "请输入对应数字 > " num if [ "$num" = '1' ]; then - dbdir=${CRASHDIR}/ui + dbdir="$CRASHDIR"/ui hostdir=":$db_port/ui" getdb elif [ "$num" = '2' ]; then @@ -717,7 +824,7 @@ setdb(){ echo -e "\033[33m安装已取消!\033[0m" fi else - dbdir=${CRASHDIR}/ui + dbdir="$CRASHDIR"/ui hostdir=":$db_port/ui" getdb fi @@ -774,8 +881,8 @@ setdb(){ read -p "确认卸载本地面板?(1/0) > " res if [ "$res" = 1 ];then rm -rf /www/clash - rm -rf ${CRASHDIR}/ui - rm -rf ${BINDIR}/ui + rm -rf "$CRASHDIR"/ui + rm -rf "$BINDIR"/ui echo "-----------------------------------------------" echo -e "\033[31m面板已经卸载!\033[0m" sleep 1 @@ -786,22 +893,22 @@ setdb(){ ;; esac } - -getcrt(){ #下载根证书文件 +#根证书 +getcrt(){ echo "-----------------------------------------------" echo "正在连接服务器获取安装文件…………" - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/ca-certificates.crt bin/fix/ca-certificates.crt + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/ca-certificates.crt bin/fix/ca-certificates.crt if [ "$?" = "1" ];then echo "-----------------------------------------------" echo -e "\033[31m文件下载失败!\033[0m" error_down else echo "-----------------------------------------------" - [ "$systype" = 'mi_snapshot' ] && cp -f ${TMPDIR}/ca-certificates.crt "$CRASHDIR"/tools #镜像化设备特殊处理 + [ "$systype" = 'mi_snapshot' ] && cp -f "$TMPDIR"/ca-certificates.crt $CRASHDIR/tools #镜像化设备特殊处理 [ -f $openssldir/certs ] && rm -rf $openssldir/certs #如果certs不是目录而是文件则删除并创建目录 mkdir -p $openssldir/certs - mv -f ${TMPDIR}/ca-certificates.crt $crtdir - ${CRASHDIR}/start.sh webget /dev/null https://baidu.com echooff rediron skipceroff + mv -f "$TMPDIR"/ca-certificates.crt $crtdir + "$CRASHDIR"/start.sh webget /dev/null https://baidu.com echooff rediron skipceroff if [ "$?" = "1" ];then export CURL_CA_BUNDLE=$crtdir echo "export CURL_CA_BUNDLE=$crtdir" >> /etc/profile @@ -844,11 +951,11 @@ setcrt(){ #安装源 setserver(){ [ -z "$release_type" ] && release_name=未指定 - [ -n "$release_type" ] && release_name=${release_type}'(回退)' + [ -n "$release_type" ] && release_name="$release_type(回退)" [ "$release_type" = stable ] && release_name=稳定版 [ "$release_type" = master ] && release_name=公测版 [ "$release_type" = dev ] && release_name=开发版 - [ -n "$url_id" ] && url_name=$(grep "$url_id" ${CRASHDIR}/configs/servers.list 2>/dev/null | awk '{print $2}') || url_name=$update_url + [ -n "$url_id" ] && url_name=$(grep "$url_id" "$CRASHDIR"/configs/servers.list 2>/dev/null | awk '{print $2}') || url_name="$update_url" saveserver(){ #写入配置文件 setconfig update_url "'$update_url'" @@ -861,7 +968,7 @@ setserver(){ echo -e "\033[30;47m切换ShellCrash版本及更新源地址\033[0m" echo -e "当前版本:\033[4;33m$release_name\033[0m 当前源:\033[4;32m$url_name\033[0m" echo "-----------------------------------------------" - grep -E "^1|$release_name" ${CRASHDIR}/configs/servers.list | awk '{print " "NR" "$2}' + grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$2}' echo "-----------------------------------------------" echo -e " a 切换至\033[32m稳定版-stable\033[0m" echo -e " b 切换至\033[36m公测版-master\033[0m" @@ -877,13 +984,13 @@ setserver(){ checkupdate=false ;; [1-99]) - url_id_new=$(grep -E "^1|$release_name" ${CRASHDIR}/configs/servers.list | sed -n ""$num"p" | awk '{print $1}') + url_id_new=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n ""$num"p" | awk '{print $1}') if [ -z "$url_id_new" ];then errornum sleep 1 setserver elif [ "$url_id_new" -ge 200 ];then - update_url=$(grep -E "^1|$release_name" ${CRASHDIR}/configs/servers.list | sed -n ""$num"p" | awk '{print $3}') + update_url=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n ""$num"p" | awk '{print $3}') url_id='' saveserver else @@ -934,16 +1041,16 @@ setserver(){ echo "-----------------------------------------------" if [ -n "$url_id" ] && [ "$url_id" -lt 200 ];then echo -ne "\033[32m正在获取版本信息!\033[0m\r" - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/release_version bin/release_version + "$CRASHDIR"/start.sh get_bin "$TMPDIR"/release_version bin/release_version if [ "$?" = "0" ];then echo -e "\033[31m请选择想要回退至的稳定版版本:\033[0m" - cat ${TMPDIR}/release_version | awk '{print " "NR" "$1}' + cat "$TMPDIR"/release_version | awk '{print " "NR" "$1}' echo -e " 0 返回上级菜单" read -p "请输入对应数字 > " num if [ -z "$num" -o "$num" = 0 ]; then setserver - elif [ $num -le $(cat ${TMPDIR}/release_version 2>/dev/null | awk 'END{print NR}') ]; then - release_type=$(cat ${TMPDIR}/release_version | awk '{print $1}' | sed -n "$num"p) + elif [ $num -le $(cat "$TMPDIR"/release_version 2>/dev/null | awk 'END{print NR}') ]; then + release_type=$(cat "$TMPDIR"/release_version | awk '{print $1}' | sed -n "$num"p) update_url='' saveserver else @@ -958,7 +1065,7 @@ setserver(){ sleep 1 setserver fi - rm -rf ${TMPDIR}/release_version + rm -rf "$TMPDIR"/release_version else echo -e "\033[31m当前源不支持版本回退,请尝试更换其他安装源!\033[0m" sleep 1 @@ -970,480 +1077,3 @@ setserver(){ ;; esac } -#检查更新 -checkupdate(){ - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/version_new version echooff - [ "$?" = "0" ] && { - version_new=$(cat ${TMPDIR}/version_new) - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/version_new bin/version echooff - } - if [ "$?" = "0" ];then - . ${TMPDIR}/version_new 2>/dev/null - else - echo -e "\033[31m检查更新失败!请尝试切换其他安装源!\033[0m" - setserver - [ "$checkupdate" = false ] || checkupdate - fi - rm -rf ${TMPDIR}/version_new -} -update(){ - echo "-----------------------------------------------" - echo -ne "\033[32m正在检查更新!\033[0m\r" - checkupdate - [ -z "$core_v" ] && core_v=$crashcore - core_v_new=$(eval echo \$${crashcore}_v) - echo -e "\033[30;47m欢迎使用更新功能:\033[0m" - echo "-----------------------------------------------" - echo -e "当前目录(\033[32m${CRASHDIR}\033[0m)剩余空间:\033[36m$(dir_avail ${CRASHDIR} -h)\033[0m" - [ "$(dir_avail ${CRASHDIR})" -le 5120 ] && [ "$CRASHDIR" = "$BINDIR" ] && { - echo -e "\033[33m当前目录剩余空间较低,建议开启小闪存模式!\033[0m" - sleep 1 - } - echo "-----------------------------------------------" - echo -e " 1 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$version_new \033[36m$release_type\033[0m" - echo -e " 2 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m" - echo -e " 3 更新\033[32m数据库文件\033[0m > \033[32m$GeoIP_v\033[0m" - echo -e " 4 安装本地\033[35mDashboard\033[0m面板" - echo -e " 5 安装/更新本地\033[33m根证书文件\033[0m" - echo -e " 6 查看\033[32mPAC\033[0m自动代理配置" - echo "-----------------------------------------------" - echo -e " 7 切换\033[36m安装源\033[0m及\033[36m安装版本\033[0m" - echo -e " 8 \033[32m配置自动更新\033[0m" - echo -e " 9 \033[31m卸载ShellCrash\033[0m" - echo "-----------------------------------------------" - echo -e "99 \033[36m鸣谢!\033[0m" - echo "-----------------------------------------------" - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 0) - ;; - 1) - setscripts - ;; - 2) - setcore - ;; - 3) - setgeo - update - ;; - 4) - setdb - update - ;; - 5) - setcrt - update - ;; - 6) - echo "-----------------------------------------------" - echo -e "PAC配置链接为:\033[30;47m http://$host:$db_port/ui/pac \033[0m" - echo -e "PAC的使用教程请参考:\033[4;32mhttps://juewuy.github.io/ehRUeewcv\033[0m" - sleep 2 - update - ;; - 7) - setserver - update - ;; - 8) - . ${CRASHDIR}/task/task.sh && task_add - update - ;; - 9) - uninstall - exit - ;; - 99) - echo "-----------------------------------------------" - echo -e "感谢:\033[32mClash项目 \033[0m作者\033[36m Dreamacro\033[0m" - echo -e "感谢:\033[32msing-box项目 \033[0m作者\033[36m SagerNet\033[0m 项目地址:\033[32mhttps://github.com/SagerNet/sing-box\033[0m" - echo -e "感谢:\033[32mMetaCubeX项目 \033[0m作者\033[36m MetaCubeX\033[0m 项目地址:\033[32mhttps://github.com/MetaCubeX\033[0m" - echo -e "感谢:\033[32mYACD面板项目 \033[0m作者\033[36m haishanh\033[0m 项目地址:\033[32mhttps://github.com/haishanh/yacd\033[0m" - echo -e "感谢:\033[32mzashboard项目 \033[0m作者\033[36m Zephyruso\033[0m 项目地址:\033[32mhttps://github.com/Zephyruso/zashboard\033[0m" - echo -e "感谢:\033[32mSubconverter \033[0m作者\033[36m tindy2013\033[0m 项目地址:\033[32mhttps://github.com/tindy2013/subconverter\033[0m" - echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m PuerNya\033[0m 项目地址:\033[32mhttps://github.com/PuerNya/sing-box\033[0m" - echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m reF1nd\033[0m 项目地址:\033[32mhttps://github.com/reF1nd/sing-box\033[0m" - echo -e "感谢:\033[32mDustinWin相关项目 \033[0m作者\033[36m DustinWin\033[0m 作者地址:\033[32mhttps://github.com/DustinWin\033[0m" - echo "-----------------------------------------------" - echo -e "特别感谢:\033[36m所有帮助及赞助过此项目的同仁们!\033[0m" - echo "-----------------------------------------------" - sleep 2 - update - ;; - *) - errornum - ;; - esac -} -#新手引导 -userguide(){ - - forwhat(){ - echo "-----------------------------------------------" - echo -e "\033[30;46m 欢迎使用ShellCrash新手引导! \033[0m" - echo "-----------------------------------------------" - echo -e "\033[33m请先选择你的使用环境: \033[0m" - echo -e "\033[0m(你之后依然可以在设置中更改各种配置)\033[0m" - echo "-----------------------------------------------" - echo -e " 1 \033[32m路由设备配置局域网透明代理\033[0m" - echo -e " 2 \033[36mLinux设备仅配置本机代理\033[0m" - [ -f "$CFG_PATH.bak" ] && echo -e " 3 \033[33m还原之前备份的设置\033[0m" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 1) - #设置运行模式 - redir_mod="混合模式" - [ -n "$(echo $cputype | grep -E "linux.*mips.*")" ] && { - if grep -qE '^TPROXY$' /proc/net/ip_tables_targets || modprobe xt_TPROXY >/dev/null 2>&1; then - redir_mod="Tproxy模式" - else - redir_mod="Redir模式" - fi - } - setconfig crashcore "meta" - setconfig redir_mod "$redir_mod" - setconfig dns_mod mix - setconfig firewall_area '1' - #默认启用绕过CN-IP - setconfig cn_ip_route 已开启 - #自动识别IPV6 - [ -n "$(ip a 2>&1 | grep -w 'inet6' | grep -E 'global' | sed 's/.*inet6.//g' | sed 's/scope.*$//g')" ] && { - setconfig ipv6_redir 已开启 - setconfig ipv6_support 已开启 - setconfig ipv6_dns 已开启 - setconfig cn_ipv6_route 已开启 - } - #设置开机启动 - [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ] && /etc/init.d/shellcrash enable - ckcmd systemctl && [ "$(cat /proc/1/comm)" = "systemd" ] && systemctl enable shellcrash.service > /dev/null 2>&1 - rm -rf ${CRASHDIR}/.dis_startup - autostart=enable - #检测IP转发 - if [ "$(cat /proc/sys/net/ipv4/ip_forward)" = "0" ];then - echo "-----------------------------------------------" - echo -e "\033[33m检测到你的设备尚未开启ip转发,局域网设备将无法正常连接网络,是否立即开启?\033[0m" - read -p "是否开启?(1/0) > " res - [ "$res" = 1 ] && { - echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf - sysctl -w net.ipv4.ip_forward=1 - } && echo "已成功开启ipv4转发,如未正常开启,请手动重启设备!" || echo "开启失败!请自行谷歌查找当前设备的开启方法!" - fi - #禁止docker启用的net.bridge.bridge-nf-call-iptables - sysctl -w net.bridge.bridge-nf-call-iptables=0 > /dev/null 2>&1 - sysctl -w net.bridge.bridge-nf-call-ip6tables=0 > /dev/null 2>&1 - ;; - 2) - setconfig redir_mod "Redir模式" - [ -n "$(echo $cputype | grep -E "linux.*mips.*")" ] && setconfig crashcore "clash" - setconfig common_ports "未开启" - setconfig firewall_area '2' - ;; - 3) - mv -f $CFG_PATH.bak $CFG_PATH - echo -e "\033[32m脚本设置已还原!\033[0m" - echo -e "\033[33m请重新启动脚本!\033[0m" - exit 0 - ;; - *) - errornum - forwhat - ;; - esac - } - forwhat - #检测小内存模式 - dir_size=$(dir_avail ${CRASHDIR}) - if [ "$dir_size" -lt 10240 ];then - echo "-----------------------------------------------" - echo -e "\033[33m检测到你的安装目录空间不足10M,是否开启小闪存模式?\033[0m" - echo -e "\033[0m开启后核心及数据库文件将被下载到内存中,这将占用一部分内存空间\033[0m" - echo -e "\033[0m每次开机后首次运行服务时都会自动的重新下载相关文件\033[0m" - echo "-----------------------------------------------" - read -p "是否开启?(1/0) > " res - [ "$res" = 1 ] && { - BINDIR=/tmp/ShellCrash - setconfig BINDIR /tmp/ShellCrash ${CRASHDIR}/configs/command.env - } - fi - #检测及下载根证书 - openssldir="$(openssl version -d 2>&1 | awk -F '"' '{print $2}')" - [ ! -d "$openssldir/certs" ] && openssldir=/etc/ssl - if [ -d $openssldir/certs -a ! -f $openssldir/certs/ca-certificates.crt ];then - echo "-----------------------------------------------" - echo -e "\033[33m当前设备未找到根证书文件\033[0m" - echo "-----------------------------------------------" - read -p "是否下载并安装根证书?(1/0) > " res - [ "$res" = 1 ] && checkupdate && getcrt - fi - #设置加密DNS - if [ -s $openssldir/certs/ca-certificates.crt ];then - dns_nameserver='https://dns.alidns.com/dns-query, https://doh.pub/dns-query' - dns_fallback='https://cloudflare-dns.com/dns-query, https://dns.google/dns-query, https://doh.opendns.com/dns-query' - dns_resolver='https://223.5.5.5/dns-query, 2400:3200::1' - setconfig dns_nameserver "'$dns_nameserver'" - setconfig dns_fallback "'$dns_fallback'" - setconfig dns_resolver "'$dns_resolver'" - fi - #开启公网访问 - sethost(){ - read -p "请输入你的公网IP地址 > " host - echo $host | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' - if [ -z "$host" ];then - echo -e "\033[31m请输入正确的IP地址!\033[0m" - sethost - fi - } - if ckcmd systemctl;then - echo "-----------------------------------------------" - echo -e "\033[32m是否开启公网访问Dashboard面板及socks服务?\033[0m" - echo -e "注意当前设备必须有公网IP才能从公网正常访问" - echo -e "\033[31m此功能会增加暴露风险请谨慎使用!\033[0m" - echo -e "vps设备可能还需要额外在服务商后台开启相关端口" - read -p "现在开启?(1/0) > " res - if [ "$res" = 1 ];then - read -p "请先设置面板访问秘钥 > " secret - read -p "请先修改Socks服务端口(1-65535) > " mix_port - read -p "请先设置Socks服务密码(账号默认为crash) > " sec - [ -z "$sec" ] && authentication=crash:$sec - host=$(curl ip.sb 2>/dev/null | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') - if [ -z "$host" ];then - sethost - fi - public_support=已开启 - setconfig secret $secret - setconfig mix_port $mix_port - setconfig host $host - setconfig public_support $public_support - setconfig authentication "'$authentication'" - fi - fi - #启用推荐的自动任务配置 - . ${CRASHDIR}/task/task.sh && task_recom - #小米设备软固化 - if [ "$systype" = "mi_snapshot" ];then - echo "-----------------------------------------------" - echo -e "\033[33m检测到为小米路由设备,启用软固化可防止路由升级后丢失SSH\033[0m" - read -p "是否启用软固化功能?(1/0) > " res - [ "$res" = 1 ] && autoSSH - fi - #提示导入订阅或者配置文件 - [ ! -s "$CRASHDIR"/yamls/config.yaml -a ! -s "$CRASHDIR"/jsons/config.json ] && { - echo "-----------------------------------------------" - echo -e "\033[32m是否导入配置文件?\033[0m(这是运行前的最后一步)" - echo -e "\033[0m你必须拥有一份配置文件才能运行服务!\033[0m" - echo "-----------------------------------------------" - read -p "现在开始导入?(1/0) > " res - [ "$res" = 1 ] && inuserguide=1 && { - if [ -f "$CRASHDIR"/v2b_api.sh ];then - . "$CRASHDIR"/v2b_api.sh - else - set_core_config - fi - set_core_config - inuserguide="" - } - } - #回到主界面 - echo "-----------------------------------------------" - echo -e "\033[36m很好!现在只需要执行启动就可以愉快的使用了!\033[0m" - echo "-----------------------------------------------" - read -p "立即启动服务?(1/0) > " res - [ "$res" = 1 ] && start_core && sleep 2 - main_menu -} -#测试菜单 -debug(){ - echo "$crashcore" | grep -q 'singbox' && config_tmp="$TMPDIR"/jsons || 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 -e " 6 后台运行完整启动流程,并配置防火墙劫持,且将错误日志打印到闪存:\033[32m$CRASHDIR/debug.log\033[0m" - echo "-----------------------------------------------" - echo -e " 8 后台运行完整启动流程,输出执行错误并查找上下文,之后关闭进程" - [ -s "$TMPDIR"/jsons/inbounds.json ] && echo -e " 9 将\033[32m$config_tmp\033[0m下json文件合并为$TMPDIR/debug.json" - echo "-----------------------------------------------" - echo " 0 返回上级目录!" - read -p "请输入对应数字 > " num - case "$num" in - 0) ;; - 1) - "$CRASHDIR"/start.sh stop - "$CRASHDIR"/start.sh bfstart - if echo "$crashcore" | grep -q 'singbox' ;then - "$TMPDIR"/CrashCore run -D "$BINDIR" -C "$TMPDIR"/jsons & - { sleep 4 ; kill $! >/dev/null 2>&1 & } - wait - else - ${TMPDIR}/CrashCore -t -d ${BINDIR} -f ${TMPDIR}/config.yaml - fi - rm -rf ${TMPDIR}/CrashCore - echo "-----------------------------------------------" - exit - ;; - 2) - "$CRASHDIR"/start.sh stop - "$CRASHDIR"/start.sh bfstart - $COMMAND - rm -rf ${TMPDIR}/CrashCore - 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 - ;; - 6) - echo -e "频繁写入闪存会导致闪存寿命降低,如非遇到会导致设备死机或重启的bug,请勿使用此功能!" - read -p "是否继续?(1/0) > " res - [ "$res" = 1 ] && "$CRASHDIR"/start.sh debug debug flash - main_menu - ;; - 8) - $0 -d - main_menu - ;; - 9) - ${CRASHDIR}/start.sh core_check && "$TMPDIR"/CrashCore merge "$TMPDIR"/debug.json -C "$TMPDIR"/jsons && echo -e "\033[32m合并成功!\033[0m" - rm -rf ${TMPDIR}/CrashCore - main_menu - ;; - *) - errornum - ;; - esac -} -testcommand(){ - echo "$crashcore" | grep -q '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 Debug模式运行内核" - echo " 2 查看系统DNS端口(:53)占用 " - echo " 3 测试ssl加密(aes-128-gcm)跑分" - echo " 4 查看ShellCrash相关路由规则" - echo " 5 查看内核配置文件前40行" - echo " 6 测试代理服务器连通性(google.tw)" - echo "-----------------------------------------------" - echo " 0 返回上级目录!" - read -p "请输入对应数字 > " num - case "$num" in - 0) - main_menu - ;; - 1) - debug - testcommand - ;; - 2) - echo "-----------------------------------------------" - netstat -ntulp |grep 53 - echo "-----------------------------------------------" - echo -e "可以使用\033[44m netstat -ntulp |grep xxx \033[0m来查询任意(xxx)端口" - exit; - ;; - 3) - echo "-----------------------------------------------" - openssl speed -multi 4 -evp aes-128-gcm - echo "-----------------------------------------------" - exit; - ;; - 4) - if [ "$firewall_mod" = "nftables" ];then - nft list table inet shellcrash - else - [ "$firewall_area" = 1 -o "$firewall_area" = 3 -o "$firewall_area" = 5 -o "$vm_redir" = "已开启" ] && { - echo "----------------Redir+DNS---------------------" - iptables -t nat -L PREROUTING --line-numbers - iptables -t nat -L shellcrash_dns --line-numbers - [ -n "$(echo $redir_mod | grep -E 'Redir模式|混合模式')" ] && iptables -t nat -L shellcrash --line-numbers - [ -n "$(echo $redir_mod | grep -E 'Tproxy模式|混合模式|Tun模式')" ] && { - echo "----------------Tun/Tproxy-------------------" - iptables -t mangle -L PREROUTING --line-numbers - iptables -t mangle -L shellcrash_mark --line-numbers - } - } - [ "$firewall_area" = 2 -o "$firewall_area" = 3 ] && { - echo "-------------OUTPUT-Redir+DNS----------------" - iptables -t nat -L OUTPUT --line-numbers - iptables -t nat -L shellcrash_dns_out --line-numbers - [ -n "$(echo $redir_mod | grep -E 'Redir模式|混合模式')" ] && iptables -t nat -L shellcrash_out --line-numbers - [ -n "$(echo $redir_mod | grep -E 'Tproxy模式|混合模式|Tun模式')" ] && { - echo "------------OUTPUT-Tun/Tproxy---------------" - iptables -t mangle -L OUTPUT --line-numbers - iptables -t mangle -L shellcrash_mark_out --line-numbers - } - } - [ "$ipv6_redir" = "已开启" ] && { - [ "$firewall_area" = 1 -o "$firewall_area" = 3 ] && { - ip6tables -t nat -L >/dev/null 2>&1 && { - echo "-------------IPV6-Redir+DNS-------------------" - ip6tables -t nat -L PREROUTING --line-numbers - ip6tables -t nat -L shellcrashv6_dns --line-numbers - [ -n "$(echo $redir_mod | grep -E 'Redir模式|混合模式')" ] && ip6tables -t nat -L shellcrashv6 --line-numbers - } - [ -n "$(echo $redir_mod | grep -E 'Tproxy模式|混合模式|Tun模式')" ] && { - echo "-------------IPV6-Tun/Tproxy------------------" - ip6tables -t mangle -L PREROUTING --line-numbers - ip6tables -t mangle -L shellcrashv6_mark --line-numbers - } - } - } - [ "$vm_redir" = "已开启" ] && { - echo "-------------vm-Redir-------------------" - iptables -t nat -L shellcrash_vm --line-numbers - iptables -t nat -L shellcrash_vm_dns --line-numbers - } - fi - exit; - ;; - 5) - echo "-----------------------------------------------" - sed -n '1,40p' ${config_path} - echo "-----------------------------------------------" - exit; - ;; - 6) - echo "注意:依赖curl(不支持wget),且测试结果不保证一定准确!" - delay=`curl -kx ${authentication}@127.0.0.1:$mix_port -o /dev/null -s -w '%{time_starttransfer}' 'https://google.tw' & { sleep 3 ; kill $! >/dev/null 2>&1 & }` > /dev/null 2>&1 - delay=`echo |awk "{print $delay*1000}"` > /dev/null 2>&1 - echo "-----------------------------------------------" - if [ `echo ${#delay}` -gt 1 ];then - echo -e "\033[32m连接成功!响应时间为:"$delay" ms\033[0m" - else - echo -e "\033[31m连接超时!请重试或检查节点配置!\033[0m" - fi - main_menu - ;; - *) - errornum - main_menu - ;; - esac -} - -case "$1" in - *) - $1 - ;; -esac From e62f485df4c259abba5eb72b4f6848d930239f60 Mon Sep 17 00:00:00 2001 From: juewuy Date: Wed, 24 Dec 2025 11:09:28 +0800 Subject: [PATCH 3/3] =?UTF-8?q?~=E7=BB=A7=E7=BB=AD=E6=8B=86=E5=88=86?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/init.sh | 23 +- scripts/libs/README.md | 20 +- scripts/libs/compare.sh | 10 + scripts/libs/logger.sh | 59 ++++ scripts/menu.sh | 271 +++++------------- scripts/menus/1_start.sh | 54 ++++ .../menus/{2-settings.sh => 2_settings.sh} | 1 + scripts/menus/{4-setboot.sh => 4_setboot.sh} | 0 scripts/menus/{5-task.sh => 5_task.sh} | 0 .../{6-core_config.sh => 6_core_config.sh} | 49 ++-- scripts/menus/{7-gateway.sh => 7_gateway.sh} | 0 scripts/menus/{8-tools.sh => 8_tools.sh} | 0 scripts/menus/{9-upgrade.sh => 9_upgrade.sh} | 3 +- scripts/menus/uninstall.sh | 67 +++++ scripts/start.sh | 74 +---- scripts/starts/README.md | 4 +- 16 files changed, 315 insertions(+), 320 deletions(-) create mode 100644 scripts/libs/compare.sh create mode 100644 scripts/libs/logger.sh create mode 100644 scripts/menus/1_start.sh rename scripts/menus/{2-settings.sh => 2_settings.sh} (99%) rename scripts/menus/{4-setboot.sh => 4_setboot.sh} (100%) rename scripts/menus/{5-task.sh => 5_task.sh} (100%) rename scripts/menus/{6-core_config.sh => 6_core_config.sh} (95%) rename scripts/menus/{7-gateway.sh => 7_gateway.sh} (100%) rename scripts/menus/{8-tools.sh => 8_tools.sh} (100%) rename scripts/menus/{9-upgrade.sh => 9_upgrade.sh} (99%) create mode 100644 scripts/menus/uninstall.sh diff --git a/scripts/init.sh b/scripts/init.sh index 7bb41ff4..3bd03a2b 100644 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -189,9 +189,8 @@ mkdir -p ${CRASHDIR}/configs [ -w /etc/systemd/system ] && sysdir=/etc/systemd/system if [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ]; then #设为init.d方式启动 - cp -f ${CRASHDIR}/shellcrash.procd /etc/init.d/shellcrash + cp -f ${CRASHDIR}/starts/shellcrash.procd /etc/init.d/shellcrash chmod 755 /etc/init.d/shellcrash - rm -rf ${CRASHDIR}/shellcrash.openrc elif [ -n "$sysdir" -a "$USER" = "root" -a "$(cat /proc/1/comm)" = "systemd" ]; then #创建shellcrash用户 userdel shellcrash 2>/dev/null @@ -204,23 +203,27 @@ elif [ -n "$sysdir" -a "$USER" = "root" -a "$(cat /proc/1/comm)" = "systemd" ]; echo "shellcrash:x:0:7890::/home/shellcrash:/bin/sh" >>/etc/passwd fi #配置systemd - mv -f ${CRASHDIR}/shellcrash.service $sysdir/shellcrash.service 2>/dev/null + mv -f ${CRASHDIR}/starts/shellcrash.service $sysdir/shellcrash.service 2>/dev/null sed -i "s%/etc/ShellCrash%$CRASHDIR%g" $sysdir/shellcrash.service systemctl daemon-reload + rm -rf ${CRASHDIR}/starts/shellcrash.procd elif rc-status -r >/dev/null 2>&1; then #设为openrc方式启动 - cp -f ${CRASHDIR}/shellcrash.openrc /etc/init.d/shellcrash + mv -f ${CRASHDIR}/starts/shellcrash.openrc /etc/init.d/shellcrash chmod 755 /etc/init.d/shellcrash - rm -rf ${CRASHDIR}/shellcrash.procd + rm -rf ${CRASHDIR}/starts/shellcrash.procd else #设为保守模式启动 setconfig start_old 已开启 + rm -rf ${CRASHDIR}/starts/shellcrash.procd fi +rm -rf ${CRASHDIR}/starts/shellcrash.service +rm -rf ${CRASHDIR}/starts/shellcrash.openrc #修饰文件及版本号 command -v bash >/dev/null 2>&1 && shtype=bash [ -x /bin/ash ] && shtype=ash -for file in start.sh menus/task.sh menu.sh; do +for file in start.sh menus/5-task.sh menu.sh; do sed -i "s|/bin/sh|/bin/$shtype|" ${CRASHDIR}/${file} 2>/dev/null chmod +x ${CRASHDIR}/${file} 2>/dev/null done @@ -279,16 +282,16 @@ fi [ -f "/etc/storage/started_script.sh" ] && mount -t tmpfs -o remount,rw,size=45M tmpfs /tmp #增加/tmp空间以适配新的内核压缩方式 #镜像化OpenWrt(snapshot)额外设置 if [ "$systype" = "mi_snapshot" -o "$systype" = "ng_snapshot" ]; then - chmod 755 ${CRASHDIR}/misnap_init.sh + chmod 755 ${CRASHDIR}/starts/snapshot_init.sh uci delete firewall.ShellClash 2>/dev/null uci delete firewall.ShellCrash 2>/dev/null uci set firewall.ShellCrash=include uci set firewall.ShellCrash.type='script' - uci set firewall.ShellCrash.path="$CRASHDIR/misnap_init.sh" + uci set firewall.ShellCrash.path="$CRASHDIR/starts/snapshot_init.sh" uci set firewall.ShellCrash.enabled='1' uci commit firewall else - rm -rf ${CRASHDIR}/misnap_init.sh + rm -rf ${CRASHDIR}/starts/snapshot_init.sh fi #华硕USB启动额外设置 [ "$usb_status" = "1" ] && { @@ -361,7 +364,7 @@ rm -rf /etc/init.d/clash rm -rf ${CRASHDIR}/rules rm -rf "$CRASHDIR/task/task.sh" [ "$systype" = "mi_snapshot" -a "$CRASHDIR" != '/data/clash' ] && rm -rf /data/clash -for file in CrashCore clash.sh getdate.sh core.new clashservice log shellcrash.service mark? mark.bak; do +for file in CrashCore clash.sh getdate.sh core.new clashservice log mark? mark.bak; do rm -rf "$CRASHDIR/$file" done #旧版变量改名 diff --git a/scripts/libs/README.md b/scripts/libs/README.md index 1454be14..380299a7 100644 --- a/scripts/libs/README.md +++ b/scripts/libs/README.md @@ -1,11 +1,11 @@ -用于存放脚本内置工具的脚本 - -引用方式必须为: - -```shell -. "$CRASHDIR"/libs/xxx.sh -``` - -返回码必须是return x而不能是exit x - +用于存放脚本内置工具的脚本 + +引用方式必须为: + +```shell +. "$CRASHDIR"/libs/xxx.sh +``` + +返回码必须是return x而不能是exit x + 此处脚本内容不应包含文字输出和log输出 \ No newline at end of file diff --git a/scripts/libs/compare.sh b/scripts/libs/compare.sh new file mode 100644 index 00000000..c0f3a684 --- /dev/null +++ b/scripts/libs/compare.sh @@ -0,0 +1,10 @@ +compare() { #对比文件 + if [ ! -f "$1" ] || [ ! -f "$2" ]; then + return 1 + elif ckcmd cmp; then + cmp -s "$1" "$2" + return $? + else + [ "$(cat "$1")" = "$(cat "$2")" ] && return 0 || return 1 + fi +} \ No newline at end of file diff --git a/scripts/libs/logger.sh b/scripts/libs/logger.sh new file mode 100644 index 00000000..7044586b --- /dev/null +++ b/scripts/libs/logger.sh @@ -0,0 +1,59 @@ +#日志工具 +#$1日志内容$2显示颜色$3是否推送 +logger() { + [ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m" + log_text="$(date "+%G-%m-%d_%H:%M:%S")~$1" + echo "$log_text" >>"$TMPDIR"/ShellCrash.log + [ "$(wc -l "$TMPDIR"/ShellCrash.log | awk '{print $1}')" -gt 99 ] && sed -i '1,50d' "$TMPDIR"/ShellCrash.log + #推送工具 + webpush() { + [ -n "$(pidof CrashCore)" ] && { + [ -n "$authentication" ] && auth="$authentication@" + export https_proxy="http://${auth}127.0.0.1:$mix_port" + } + if curl --version >/dev/null 2>&1; then + curl -kfsSl -X POST --connect-timeout 3 -H "Content-Type: application/json; charset=utf-8" "$1" -d "$2" >/dev/null 2>&1 + elif wget --version >/dev/null 2>&1; then + wget -Y on -q --timeout=3 -O - --method=POST --header="Content-Type: application/json; charset=utf-8" --body-data="$2" "$1" >/dev/null 2>&1 + fi + } + [ -z "$3" ] && { + [ -n "$device_name" ] && log_text="$log_text($device_name)" + [ -n "$push_TG" ] && { + url="https://api.telegram.org/bot${push_TG}/sendMessage" + [ "$push_TG" = 'publictoken' ] && url='https://tgbot.jwsc.eu.org/publictoken/sendMessage' + content="{\"chat_id\":\"${chat_ID}\",\"text\":\"$log_text\"}" + webpush "$url" "$content" & + } + [ -n "$push_bark" ] && { + url="${push_bark}" + content="{\"body\":\"${log_text}\",\"title\":\"ShellCrash日志推送\",\"level\":\"passive\",\"badge\":\"1\"}" + webpush "$url" "$content" & + } + [ -n "$push_Deer" ] && { + url="https://api2.pushdeer.com/message/push" + content="{\"pushkey\":\"${push_Deer}\",\"text\":\"$log_text\"}" + webpush "$url" "$content" & + } + [ -n "$push_Po" ] && { + url="https://api.pushover.net/1/messages.json" + content="{\"token\":\"${push_Po}\",\"user\":\"${push_Po_key}\",\"title\":\"ShellCrash日志推送\",\"message\":\"$log_text\"}" + webpush "$url" "$content" & + } + [ -n "$push_PP" ] && { + url="http://www.pushplus.plus/send" + content="{\"token\":\"${push_PP}\",\"title\":\"ShellCrash日志推送\",\"content\":\"$log_text\"}" + webpush "$url" "$content" & + } + [ -n "$push_Gotify" ] && { + url="${push_Gotify}" + content="{\"title\":\"ShellCrash日志推送\",\"message\":\"$log_text\",\"priority\":5}" + webpush "$url" "$content" & + } + [ -n "$push_SynoChat" ] && { + url="${push_ChatURL}/webapi/entry.cgi?api=SYNO.Chat.External&method=chatbot&version=2&token=${push_ChatTOKEN}" + content="payload={\"text\":\"${log_text}\", \"user_ids\":[${push_ChatUSERID}]}" + webpush "$url" "$content" & + } + } & +} diff --git a/scripts/menu.sh b/scripts/menu.sh index c7888fbc..586cfb66 100644 --- a/scripts/menu.sh +++ b/scripts/menu.sh @@ -6,15 +6,13 @@ CRASHDIR=$( pwd ) CFG_PATH="$CRASHDIR"/configs/ShellCrash.cfg -YAMLSDIR="$CRASHDIR"/yamls -JSONSDIR="$CRASHDIR"/jsons #加载执行目录,失败则初始化 . "$CRASHDIR"/configs/command.env 2>/dev/null [ -z "$BINDIR" -o -z "$TMPDIR" -o -z "$COMMAND" ] && . "$CRASHDIR"/init.sh >/dev/null 2>&1 [ ! -f "$TMPDIR" ] && mkdir -p "$TMPDIR" [ -n "$(tar --help 2>&1 | grep -o 'no-same-owner')" ] && tar_para='--no-same-owner' #tar命令兼容 -#加载工具 +#通用工具 . "$CRASHDIR"/libs/set_config.sh . "$CRASHDIR"/libs/check_cmd.sh errornum() { @@ -28,7 +26,8 @@ checkrestart() { read -p "是否现在重启服务?(1/0) > " res [ "$res" = 1 ] && start_service } -checkport() { #自动检查端口冲突 + +checkport() { #检查端口冲突 for portx in $dns_port $mix_port $redir_port $((redir_port + 1)) $db_port; do if [ -n "$(netstat -ntul 2>&1 | grep ':$portx ')" ]; then echo "-----------------------------------------------" @@ -36,14 +35,13 @@ checkport() { #自动检查端口冲突 echo $(netstat -ntul | grep :$portx | head -n 1) echo -e "\033[0m-----------------------------------------------" echo -e "\033[36m请修改默认端口配置!\033[0m" - setport + . "$CRASHDIR"/menus/2_settings.sh && set_adv_config . "$CFG_PATH" >/dev/null checkport fi done } -#脚本启动前检查 -ckstatus() { +ckstatus() { #脚本启动前检查 #检查/读取脚本配置文件 if [ -f "$CFG_PATH" ]; then [ -n "$(awk 'a[$0]++' $CFG_PATH)" ] && awk '!a[$0]++' "$CFG_PATH" >"$CFG_PATH" #检查重复行并去除 @@ -59,10 +57,7 @@ ckstatus() { [ -z "$fwmark" ] && fwmark=$redir_port [ -z "$db_port" ] && db_port=9999 [ -z "$dns_port" ] && dns_port=1053 - [ -z "$multiport" ] && multiport='22,80,143,194,443,465,587,853,993,995,5222,8080,8443' [ -z "$redir_mod" ] && redir_mod=纯净模式 - #检查mac地址记录 - [ ! -f "$CRASHDIR"/configs/mac ] && touch "$CRASHDIR"/configs/mac #获取本机host地址 [ -z "$host" ] && host=$(ubus call network.interface.lan status 2>&1 | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') [ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'lan' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1) @@ -132,7 +127,7 @@ ckstatus() { #检查新手引导 if [ -z "$userguide" ]; then setconfig userguide 1 - . "$CRASHDIR"/webget.sh && userguide + . "$CRASHDIR"/menus/8_tools.sh && userguide fi #检查执行权限 [ ! -x "$CRASHDIR"/start.sh ] && chmod +x "$CRASHDIR"/start.sh @@ -146,7 +141,7 @@ ckstatus() { core_v=$(/tmp/$file -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //') [ -z "$core_v" ] && core_v=$(/tmp/$file version 2>/dev/null | grep -Eo 'version .*' | sed 's/version //') if [ -n "$core_v" ]; then - . "$CRASHDIR"/webget.sh && setcoretype && + . "$CRASHDIR"/menus/9_upgrade.sh && setcoretype && mv -f /tmp/$file "$TMPDIR"/CrashCore && tar -zcf "$BINDIR"/CrashCore.tar.gz ${tar_para} -C "$TMPDIR" CrashCore && echo -e "\033[32m内核加载完成!\033[0m " && @@ -164,7 +159,7 @@ ckstatus() { echo "-----------------------------------------------" done #检查/tmp配置文件 - for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -iE '.yaml$|.yml$|config.json$'); do + for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -iE 'config.yaml$|config.yml$|config.json$'); do tmp_file=/tmp/$file echo -e "发现内核配置文件: \033[36m/tmp/$file\033[0m " read -p "是否加载为$crashcore的配置文件?(1/0) > " res @@ -186,121 +181,7 @@ ckstatus() { echo "-----------------------------------------------" } } -#启动相关 -startover() { - echo -ne " \r" - echo -e "\033[32m服务已启动!\033[0m" - echo -e "请使用 \033[4;36mhttp://$host$hostdir\033[0m 管理内置规则" - if [ "$redir_mod" = "纯净模式" ]; then - echo "-----------------------------------------------" - echo -e "其他设备可以使用PAC配置连接:\033[4;32mhttp://$host:$db_port/ui/pac\033[0m" - echo -e "或者使用HTTP/SOCK5方式连接:IP{\033[36m$host\033[0m}端口{\033[36m$mix_port\033[0m}" - fi - return 0 -} -start_core() { - if echo "$crashcore" | grep -q 'singbox'; then - core_config="$CRASHDIR"/jsons/config.json - else - core_config="$CRASHDIR"/yamls/config.yaml - fi - echo "-----------------------------------------------" - if [ ! -s $core_config -a -s "$CRASHDIR"/configs/providers.cfg ]; then - echo -e "\033[33m没有找到${crashcore}配置文件,尝试生成providers配置文件!\033[0m" - [ "$crashcore" = singboxr ] && coretype=singbox - [ "$crashcore" = meta -o "$crashcore" = clashpre ] && coretype=clash - . "$CRASHDIR"/webget.sh && gen_${coretype}_providers - elif [ -s $core_config -o -n "$Url" -o -n "$Https" ]; then - "$CRASHDIR"/start.sh start - #设置循环检测以判定服务启动是否成功 - i=1 - while [ -z "$test" -a "$i" -lt 30 ]; do - sleep 1 - if curl --version >/dev/null 2>&1; then - test=$(curl -s -H "Authorization: Bearer $secret" http://127.0.0.1:${db_port}/configs | grep -o port) - else - test=$(wget -q --header="Authorization: Bearer $secret" -O - http://127.0.0.1:${db_port}/configs | grep -o port) - fi - i=$((i + 1)) - done - [ -n "$test" -o -n "$(pidof CrashCore)" ] && startover - else - echo -e "\033[31m没有找到${crashcore}配置文件,请先导入配置文件!\033[0m" - . "$CRASHDIR"/webget.sh && set_core_config - fi -} -start_service() { - if [ "$firewall_area" = 5 ]; then - "$CRASHDIR"/start.sh start - echo -e "\033[32m已完成防火墙设置!\033[0m" - else - start_core - fi -} -#卸载 -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 - "$CRASHDIR"/start.sh cronset "task.sh" 2>/dev/null - #移除安装目录 - if [ -n "$CRASHDIR" ] && [ "$CRASHDIR" != '/' ]; then - read -p "是否保留脚本配置及订阅文件?[1/0] > " res - if [ "$res" = '1' ]; then - mv -f "$CRASHDIR"/configs /tmp/ShellCrash/configs_bak - mv -f "$CRASHDIR"/yamls /tmp/ShellCrash/yamls_bak - mv -f "$CRASHDIR"/jsons /tmp/ShellCrash/jsons_bak - rm -rf "$CRASHDIR"/* - mv -f /tmp/ShellCrash/configs_bak "$CRASHDIR"/configs - mv -f /tmp/ShellCrash/yamls_bak "$CRASHDIR"/yamls - mv -f /tmp/ShellCrash/jsons_bak "$CRASHDIR"/jsons - else - rm -rf "$CRASHDIR" - fi - else - echo -e "\033[31m环境变量配置有误,请尝试手动移除安装目录!\033[0m" - sleep 1 - fi - #移除其他内容 - sed -i "/alias $my_alias=*/"d /etc/profile 2>/dev/null - sed -i '/alias crash=*/'d /etc/profile 2>/dev/null - sed -i '/export CRASHDIR=*/'d /etc/profile 2>/dev/null - sed -i '/export crashdir=*/'d /etc/profile 2>/dev/null - [ -w ~/.zshrc ] && { - sed -i "/alias $my_alias=*/"d ~/.zshrc - sed -i '/export CRASHDIR=*/'d ~/.zshrc - } - 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 - rm -rf /usr/bin/crash - sed -i '/0:7890/d' /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 - else - echo -e "\033[31m操作已取消!\033[0m" - fi -} + #主菜单 main_menu() { ############################# @@ -324,12 +205,12 @@ main_menu() { exit ;; 1) - start_service + . "$CRASHDIR"/menus/1_start.sh && start_service exit ;; 2) checkcfg=$(cat "$CFG_PATH") - . "$CRASHDIR"/menus/2-settings.sh && settings + . "$CRASHDIR"/menus/2_settings.sh && settings if [ -n "$PID" ]; then checkcfg_new=$(cat "$CFG_PATH") [ "$checkcfg" != "$checkcfg_new" ] && checkrestart @@ -344,22 +225,22 @@ main_menu() { main_menu ;; 4) - . "$CRASHDIR"/menus/4-setboot.sh && setboot + . "$CRASHDIR"/menus/4_setboot.sh && setboot main_menu ;; 5) - . "$CRASHDIR"/menus/5-task.sh && task_menu + . "$CRASHDIR"/menus/5_task.sh && task_menu main_menu ;; 6) - . "$CRASHDIR"/menus/6-core_config.sh && set_core_config + . "$CRASHDIR"/menus/6_core_config.sh && set_core_config main_menu ;; 7) GT_CFG_PATH="$CRASHDIR"/configs/gateway.cfg touch "$GT_CFG_PATH" checkcfg=$(cat $GT_CFG_PATH) - . "$CRASHDIR"/menus/7-gateway.sh && gateway + . "$CRASHDIR"/menus/7_gateway.sh && gateway if [ -n "$PID" ]; then checkcfg_new=$(cat $GT_CFG_PATH) [ "$checkcfg" != "$checkcfg_new" ] && checkrestart @@ -367,12 +248,12 @@ main_menu() { main_menu ;; 8) - . "$CRASHDIR"/menus/8-tools.sh && tools + . "$CRASHDIR"/menus/8_tools.sh && tools main_menu ;; 9) checkcfg=$(cat "$CFG_PATH") - . "$CRASHDIR"/menus/9-upgrade.sh && upgrade + . "$CRASHDIR"/menus/9_upgrade.sh && upgrade if [ -n "$PID" ]; then checkcfg_new=$(cat "$CFG_PATH") [ "$checkcfg" != "$checkcfg_new" ] && checkrestart @@ -386,79 +267,65 @@ main_menu() { esac } -[ -z "$CRASHDIR" ] && { - echo "环境变量配置有误!正在初始化~~~" - CRASHDIR=$( - cd $(dirname $0) - pwd - ) - . "$CRASHDIR"/init.sh - sleep 1 - echo "请重启SSH窗口以完成初始化!" - exit -} - -[ -z "$1" ] && main_menu - case "$1" in --h) - echo ----------------------------------------- - echo "欢迎使用ShellCrash" - echo ----------------------------------------- - echo " -t 测试模式" - echo " -h 帮助列表" - echo " -u 卸载脚本" - echo " -i 初始化脚本" - echo " -d 测试运行" - echo ----------------------------------------- - echo " crash -s start 启动服务" - echo " crash -s stop 停止服务" - echo " 安装目录/start.sh init 开机初始化" - echo ----------------------------------------- - echo "在线求助:t.me/ShellClash" - echo "官方博客:juewuy.github.io" - echo "发布页面:github.com/juewuy/ShellCrash" - echo ----------------------------------------- + "") + main_menu ;; --t) - shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash - $shtype -x "$CRASHDIR"/menu.sh + -t) + shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash + $shtype -x "$CRASHDIR"/menu.sh ;; --s) - "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 + -s) + "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 ;; --i) - . "$CRASHDIR"/init.sh + -i) + . "$CRASHDIR"/init.sh ;; --st) - shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash - $shtype -x "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 + -st) + shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash + $shtype -x "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 ;; --d) - shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash - echo -e "正在测试运行!如发现错误请截图后前往\033[32;4mt.me/ShellClash\033[0m咨询" - $shtype "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh_bug.log - $shtype -x "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh.log - echo ----------------------------------------- - cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug - if [ -s "$TMPDIR"/sh_bug ]; then - while read line; do - echo -e "发现错误:\033[33;4m$line\033[0m" - grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log - echo ----------------------------------------- - done <"$TMPDIR"/sh_bug - rm -rf "$TMPDIR"/sh_bug - echo -e "\033[32m测试完成!\033[0m完整执行记录请查看:\033[36m$TMPDIR/debug_sh.log\033[0m" - else - echo -e "\033[32m测试完成!没有发现问题,请重新启动服务~\033[0m" - rm -rf "$TMPDIR"/debug_sh.log - fi - "$CRASHDIR"/start.sh stop + -d) + shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash + echo -e "正在测试运行!如发现错误请截图后前往\033[32;4mt.me/ShellClash\033[0m咨询" + $shtype "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh_bug.log + $shtype -x "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh.log + echo ----------------------------------------- + cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug + if [ -s "$TMPDIR"/sh_bug ]; then + while read line; do + echo -e "发现错误:\033[33;4m$line\033[0m" + grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log + echo ----------------------------------------- + done <"$TMPDIR"/sh_bug + rm -rf "$TMPDIR"/sh_bug + echo -e "\033[32m测试完成!\033[0m完整执行记录请查看:\033[36m$TMPDIR/debug_sh.log\033[0m" + else + echo -e "\033[32m测试完成!没有发现问题,请重新启动服务~\033[0m" + rm -rf "$TMPDIR"/debug_sh.log + fi + "$CRASHDIR"/start.sh stop ;; --u) - uninstall + -u) + . "$CRASHDIR"/menus/uninstall.sh && uninstall ;; -*) - $0 -h + *) + echo ----------------------------------------- + echo "欢迎使用ShellCrash" + echo ----------------------------------------- + echo " -t 测试模式" + echo " -h 帮助列表" + echo " -u 卸载脚本" + echo " -i 初始化脚本" + echo " -d 测试运行" + echo ----------------------------------------- + echo " crash -s start 启动服务" + echo " crash -s stop 停止服务" + echo " $CRASHDIR/start.sh init 开机初始化" + echo ----------------------------------------- + echo "在线求助:t.me/ShellClash" + echo "官方博客:juewuy.github.io" + echo "发布页面:github.com/juewuy/ShellCrash" + echo ----------------------------------------- ;; esac diff --git a/scripts/menus/1_start.sh b/scripts/menus/1_start.sh new file mode 100644 index 00000000..a2230883 --- /dev/null +++ b/scripts/menus/1_start.sh @@ -0,0 +1,54 @@ +#!/bin/sh +# Copyright (C) Juewuy + +#启动相关 +startover() { + echo -ne " \r" + echo -e "\033[32m服务已启动!\033[0m" + echo -e "请使用 \033[4;36mhttp://$host$hostdir\033[0m 管理内置规则" + if [ "$redir_mod" = "纯净模式" ]; then + echo "-----------------------------------------------" + echo -e "其他设备可以使用PAC配置连接:\033[4;32mhttp://$host:$db_port/ui/pac\033[0m" + echo -e "或者使用HTTP/SOCK5方式连接:IP{\033[36m$host\033[0m}端口{\033[36m$mix_port\033[0m}" + fi + return 0 +} +start_core() { + if echo "$crashcore" | grep -q 'singbox'; then + core_config="$CRASHDIR"/jsons/config.json + else + core_config="$CRASHDIR"/yamls/config.yaml + fi + echo "-----------------------------------------------" + if [ ! -s $core_config -a -s "$CRASHDIR"/configs/providers.cfg ]; then + echo -e "\033[33m没有找到${crashcore}配置文件,尝试生成providers配置文件!\033[0m" + [ "$crashcore" = singboxr ] && coretype=singbox + [ "$crashcore" = meta -o "$crashcore" = clashpre ] && coretype=clash + . "$CRASHDIR"/webget.sh && gen_${coretype}_providers + elif [ -s $core_config -o -n "$Url" -o -n "$Https" ]; then + "$CRASHDIR"/start.sh start + #设置循环检测以判定服务启动是否成功 + i=1 + while [ -z "$test" -a "$i" -lt 30 ]; do + sleep 1 + if curl --version >/dev/null 2>&1; then + test=$(curl -s -H "Authorization: Bearer $secret" http://127.0.0.1:${db_port}/configs | grep -o port) + else + test=$(wget -q --header="Authorization: Bearer $secret" -O - http://127.0.0.1:${db_port}/configs | grep -o port) + fi + i=$((i + 1)) + done + [ -n "$test" -o -n "$(pidof CrashCore)" ] && startover + else + echo -e "\033[31m没有找到${crashcore}配置文件,请先导入配置文件!\033[0m" + . "$CRASHDIR"/webget.sh && set_core_config + fi +} +start_service() { + if [ "$firewall_area" = 5 ]; then + "$CRASHDIR"/start.sh start + echo -e "\033[32m已完成防火墙设置!\033[0m" + else + start_core + fi +} diff --git a/scripts/menus/2-settings.sh b/scripts/menus/2_settings.sh similarity index 99% rename from scripts/menus/2-settings.sh rename to scripts/menus/2_settings.sh index 5b9fe0c8..3ca9ba94 100644 --- a/scripts/menus/2-settings.sh +++ b/scripts/menus/2_settings.sh @@ -695,6 +695,7 @@ set_adv_config() { #端口设置 [ -z "$secret" ] && secret=未设置 [ -z "$table" ] && table=100 [ -z "$authentication" ] && auth=未设置 || auth=****** + [ -z "$multiport" ] && multiport='22,80,143,194,443,465,587,853,993,995,5222,8080,8443' inputport() { read -p "请输入端口号(1-65535) > " portx . "$CRASHDIR"/menus/check_port.sh #加载测试函数 diff --git a/scripts/menus/4-setboot.sh b/scripts/menus/4_setboot.sh similarity index 100% rename from scripts/menus/4-setboot.sh rename to scripts/menus/4_setboot.sh diff --git a/scripts/menus/5-task.sh b/scripts/menus/5_task.sh similarity index 100% rename from scripts/menus/5-task.sh rename to scripts/menus/5_task.sh diff --git a/scripts/menus/6-core_config.sh b/scripts/menus/6_core_config.sh similarity index 95% rename from scripts/menus/6-core_config.sh rename to scripts/menus/6_core_config.sh index d1d1ebc2..a4bf4e2a 100644 --- a/scripts/menus/6-core_config.sh +++ b/scripts/menus/6_core_config.sh @@ -1,6 +1,9 @@ #!/bin/sh # Copyright (C) Juewuy +YAMLSDIR="$CRASHDIR"/yamls +JSONSDIR="$CRASHDIR"/jsons + #导入订阅、配置文件相关 setrules(){ #自定义规则 set_rule_type(){ @@ -43,7 +46,7 @@ setrules(){ #自定义规则 rule_group_set=$(echo $rule_group|cut -d'#' -f$num) rule_all="- ${rule_type_set},${rule_state_set},${rule_group_set}" [ -n "$(echo IP-CIDR SRC-IP-CIDR IP-CIDR6|grep "$rule_type_set")" ] && rule_all="${rule_all},no-resolve" - echo $rule_all >> $YAMLSDIR/rules.yaml + echo "$rule_all" >> "$YAMLSDIR"/rules.yaml echo "-----------------------------------------------" echo -e "\033[32m添加成功!\033[0m" fi @@ -55,8 +58,8 @@ setrules(){ #自定义规则 } del_rule_type(){ echo -e "输入对应数字即可移除相应规则:" - sed -i '/^ *$/d; /^#/d' $YAMLSDIR/rules.yaml - cat $YAMLSDIR/rules.yaml | grep -Ev '^#' | awk -F "#" '{print " "NR" "$1$2$3}' + sed -i '/^ *$/d; /^#/d' "$YAMLSDIR"/rules.yaml + cat "$YAMLSDIR"/rules.yaml | grep -Ev '^#' | awk -F "#" '{print " "NR" "$1$2$3}' echo "-----------------------------------------------" echo -e " 0 返回上级菜单" read -p "请输入对应数字 > " num @@ -64,8 +67,8 @@ setrules(){ #自定义规则 0) ;; '') ;; *) - if [ "$num" -le "$(wc -l < $YAMLSDIR/rules.yaml)" ];then - sed -i "${num}d" $YAMLSDIR/rules.yaml + if [ "$num" -le "$(wc -l < "$YAMLSDIR"/rules.yaml)" ];then + sed -i "${num}d" "$YAMLSDIR"/rules.yaml sleep 1 del_rule_type else @@ -100,7 +103,7 @@ setrules(){ #自定义规则 ;; 2) echo "-----------------------------------------------" - if [ -s $YAMLSDIR/rules.yaml ];then + if [ -s "$YAMLSDIR"/rules.yaml ];then del_rule_type else echo -e "请先添加自定义规则!" @@ -110,7 +113,7 @@ setrules(){ #自定义规则 ;; 3) read -p "确认清空全部自定义规则?(1/0) > " res - [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' $YAMLSDIR/rules.yaml + [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/rules.yaml setrules ;; 4) @@ -154,7 +157,7 @@ setgroups(){ #自定义clash策略组 fi set_group_add #添加自定义策略组 - cat >> $YAMLSDIR/proxy-groups.yaml <> "$YAMLSDIR"/proxy-groups.yaml </dev/null | sed "/#自定义策略组开始/,/#自定义策略组结束/d" | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/#.*//' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')" set_group_type setgroups ;; 2) echo "-----------------------------------------------" - cat $YAMLSDIR/proxy-groups.yaml + cat "$YAMLSDIR"/proxy-groups.yaml setgroups ;; 3) read -p "确认清空全部自定义策略组?(1/0) > " res - [ "$res" = "1" ] && echo '#用于添加自定义策略组' > $YAMLSDIR/proxy-groups.yaml + [ "$res" = "1" ] && echo '#用于添加自定义策略组' > "$YAMLSDIR"/proxy-groups.yaml setgroups ;; *) @@ -259,7 +262,7 @@ setproxies(){ #自定义clash节点 rule_group_add="${rule_group_add}#${rule_group_set}" done if [ -n "$rule_group_add" ];then - echo "- {$proxy_state_set}$rule_group_add" >> $YAMLSDIR/proxies.yaml + echo "- {$proxy_state_set}$rule_group_add" >> "$YAMLSDIR"/proxies.yaml echo "-----------------------------------------------" echo -e "\033[32m添加成功!\033[0m" unset rule_group_add @@ -284,21 +287,21 @@ setproxies(){ #自定义clash节点 ;; 1) proxy_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN MATCH" - proxy_group="$(cat $YAMLSDIR/proxy-groups.yaml $YAMLSDIR/config.yaml 2>/dev/null | sed "/#自定义策略组开始/,/#自定义策略组结束/d" | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/#.*//' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')" + proxy_group="$(cat "$YAMLSDIR"/proxy-groups.yaml "$YAMLSDIR"/config.yaml 2>/dev/null | sed "/#自定义策略组开始/,/#自定义策略组结束/d" | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/#.*//' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')" set_proxy_type setproxies ;; 2) echo "-----------------------------------------------" - sed -i '/^ *$/d' $YAMLSDIR/proxies.yaml 2>/dev/null - if [ -s $YAMLSDIR/proxies.yaml ];then + sed -i '/^ *$/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null + if [ -s "$YAMLSDIR"/proxies.yaml ];then echo -e "当前已添加的自定义节点为:" - cat $YAMLSDIR/proxies.yaml | grep -Ev '^#' | awk -F '[,,}]' '{print NR, $1, $NF}' | sed 's/- {//g' + cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | awk -F '[,,}]' '{print NR, $1, $NF}' | sed 's/- {//g' echo "-----------------------------------------------" echo -e "\033[33m输入节点对应数字可以移除对应节点\033[0m" read -p "请输入对应数字 > " num - if [ $num -le $(cat $YAMLSDIR/proxies.yaml | grep -Ev '^#' | wc -l) ];then - sed -i "$num{/^\s*[^#]/d}" $YAMLSDIR/proxies.yaml + if [ $num -le $(cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | wc -l) ];then + sed -i "$num{/^\s*[^#]/d}" "$YAMLSDIR"/proxies.yaml else errornum fi @@ -310,7 +313,7 @@ setproxies(){ #自定义clash节点 ;; 3) read -p "确认清空全部自定义节点?(1/0) > " res - [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' $YAMLSDIR/proxies.yaml 2>/dev/null + [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null setproxies ;; 4) @@ -699,12 +702,12 @@ setproviders(){ #自定义providers } set_clash_adv(){ #自定义clash高级规则 - [ ! -f $YAMLSDIR/user.yaml ] && cat > $YAMLSDIR/user.yaml < "$YAMLSDIR"/user.yaml < $YAMLSDIR/others.yaml < "$YAMLSDIR"/others.yaml < " 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 + "$CRASHDIR"/start.sh cronset "task.sh" 2>/dev/null + #移除安装目录 + if [ -n "$CRASHDIR" ] && [ "$CRASHDIR" != '/' ]; then + read -p "是否保留脚本配置及订阅文件?[1/0] > " res + if [ "$res" = '1' ]; then + mv -f "$CRASHDIR"/configs /tmp/ShellCrash/configs_bak + mv -f "$CRASHDIR"/yamls /tmp/ShellCrash/yamls_bak + mv -f "$CRASHDIR"/jsons /tmp/ShellCrash/jsons_bak + rm -rf "$CRASHDIR"/* + mv -f /tmp/ShellCrash/configs_bak "$CRASHDIR"/configs + mv -f /tmp/ShellCrash/yamls_bak "$CRASHDIR"/yamls + mv -f /tmp/ShellCrash/jsons_bak "$CRASHDIR"/jsons + else + rm -rf "$CRASHDIR" + fi + else + echo -e "\033[31m环境变量配置有误,请尝试手动移除安装目录!\033[0m" + sleep 1 + fi + #移除其他内容 + sed -i "/alias $my_alias=*/"d /etc/profile 2>/dev/null + sed -i '/alias crash=*/'d /etc/profile 2>/dev/null + sed -i '/export CRASHDIR=*/'d /etc/profile 2>/dev/null + sed -i '/export crashdir=*/'d /etc/profile 2>/dev/null + [ -w ~/.zshrc ] && { + sed -i "/alias $my_alias=*/"d ~/.zshrc + sed -i '/export CRASHDIR=*/'d ~/.zshrc + } + 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 + rm -rf /usr/bin/crash + sed -i '/0:7890/d' /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 + else + echo -e "\033[31m操作已取消!\033[0m" + fi +} diff --git a/scripts/start.sh b/scripts/start.sh index e5904b76..25b2aef2 100644 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -13,6 +13,8 @@ CRASHDIR=$( #加载工具 . "$CRASHDIR"/libs/set_config.sh . "$CRASHDIR"/libs/check_cmd.sh +. "$CRASHDIR"/libs/compare.sh +. "$CRASHDIR"/libs/logger.sh . "$CRASHDIR"/starts/fw_start.sh . "$CRASHDIR"/starts/fw_stop.sh @@ -86,77 +88,7 @@ ckgeo() { #查找及下载Geo数据文件 fi } } -compare() { #对比文件 - if [ ! -f "$1" ] || [ ! -f "$2" ]; then - return 1 - elif ckcmd cmp; then - cmp -s "$1" "$2" - else - [ "$(cat "$1")" = "$(cat "$2")" ] && return 0 || return 1 - fi -} -logger() { #日志工具 - #$1日志内容$2显示颜色$3是否推送 - [ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m" - log_text="$(date "+%G-%m-%d_%H:%M:%S")~$1" - echo "$log_text" >>"$TMPDIR"/ShellCrash.log - [ "$(wc -l "$TMPDIR"/ShellCrash.log | awk '{print $1}')" -gt 99 ] && sed -i '1,50d' "$TMPDIR"/ShellCrash.log - #推送工具 - webpush() { - [ -n "$(pidof CrashCore)" ] && { - [ -n "$authentication" ] && auth="$authentication@" - export https_proxy="http://${auth}127.0.0.1:$mix_port" - } - if curl --version >/dev/null 2>&1; then - curl -kfsSl -X POST --connect-timeout 3 -H "Content-Type: application/json; charset=utf-8" "$1" -d "$2" >/dev/null 2>&1 - elif wget --version >/dev/null 2>&1; then - wget -Y on -q --timeout=3 -O - --method=POST --header="Content-Type: application/json; charset=utf-8" --body-data="$2" "$1" >/dev/null 2>&1 - else - echo "找不到有效的curl或wget应用,请先安装!" - fi - } - [ -z "$3" ] && { - [ -n "$device_name" ] && log_text="$log_text($device_name)" - [ -n "$push_TG" ] && { - url="https://api.telegram.org/bot${push_TG}/sendMessage" - [ "$push_TG" = 'publictoken' ] && url='https://tgbot.jwsc.eu.org/publictoken/sendMessage' - content="{\"chat_id\":\"${chat_ID}\",\"text\":\"$log_text\"}" - webpush "$url" "$content" & - } - [ -n "$push_bark" ] && { - url="${push_bark}" - content="{\"body\":\"${log_text}\",\"title\":\"ShellCrash日志推送\",\"level\":\"passive\",\"badge\":\"1\"}" - webpush "$url" "$content" & - } - [ -n "$push_Deer" ] && { - url="https://api2.pushdeer.com/message/push" - content="{\"pushkey\":\"${push_Deer}\",\"text\":\"$log_text\"}" - webpush "$url" "$content" & - } - [ -n "$push_Po" ] && { - url="https://api.pushover.net/1/messages.json" - content="{\"token\":\"${push_Po}\",\"user\":\"${push_Po_key}\",\"title\":\"ShellCrash日志推送\",\"message\":\"$log_text\"}" - webpush "$url" "$content" & - } - [ -n "$push_PP" ] && { - url="http://www.pushplus.plus/send" - content="{\"token\":\"${push_PP}\",\"title\":\"ShellCrash日志推送\",\"content\":\"$log_text\"}" - webpush "$url" "$content" & - } - # 新增Gotify推送 - [ -n "$push_Gotify" ] && { - url="${push_Gotify}" - content="{\"title\":\"ShellCrash日志推送\",\"message\":\"$log_text\",\"priority\":5}" - webpush "$url" "$content" & - } - [ -n "$push_SynoChat" ] && { - url="${push_ChatURL}/webapi/entry.cgi?api=SYNO.Chat.External&method=chatbot&version=2&token=${push_ChatTOKEN}" - content="payload={\"text\":\"${log_text}\", \"user_ids\":[${push_ChatUSERID}]}" - webpush "$url" "$content" & - #curl -X POST "${push_ChatURL}/webapi/entry.cgi?api=SYNO.Chat.External&method=chatbot&version=2&token=${push_ChatTOKEN}" -H 'content-Type: application/json' -d "payload={\"text\":\"${log_text}\", \"user_ids\":[${push_ChatUSERID}]}" >/dev/null 2>&1 - } - } & -} + croncmd() { #定时任务工具 if [ -n "$(crontab -h 2>&1 | grep '\-l')" ]; then crontab "$1" diff --git a/scripts/starts/README.md b/scripts/starts/README.md index 4a6cf025..b7e2b4d6 100644 --- a/scripts/starts/README.md +++ b/scripts/starts/README.md @@ -1,3 +1,3 @@ -用于存放负责启动和服务相关的脚本 - +用于存放负责启动和服务相关的脚本 + 此处脚本内容不应包含任何具体中文说明,log内容的文字应当从相关lang文件调用 \ No newline at end of file