From a1835b7113ebcc5517ba2f1c5cfafd05559e07b7 Mon Sep 17 00:00:00 2001 From: juewuy Date: Thu, 25 Dec 2025 21:07:21 +0800 Subject: [PATCH] =?UTF-8?q?~=E8=84=9A=E6=9C=AC=E6=8B=86=E5=88=86=E5=90=8Eb?= =?UTF-8?q?ug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/init.sh | 7 +- scripts/libs/gen_base64.sh | 26 ++++ scripts/menu.sh | 4 +- scripts/menus/6_core_config.sh | 21 +-- scripts/menus/7_gateway.sh | 251 +++++++++++++++++++-------------- scripts/menus/8_tools.sh | 51 +------ scripts/menus/bot_tg_bind.sh | 47 ++++++ scripts/menus/task_cmd.sh | 146 +++++++++++++++++++ scripts/start.sh | 3 +- 9 files changed, 390 insertions(+), 166 deletions(-) create mode 100644 scripts/libs/gen_base64.sh create mode 100644 scripts/menus/bot_tg_bind.sh create mode 100644 scripts/menus/task_cmd.sh diff --git a/scripts/init.sh b/scripts/init.sh index c7e0f286..c1047b07 100644 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -73,7 +73,8 @@ 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 starts/bfstart.sh starts/afstart.sh menu.sh menus/task_cmd.sh; do +#批量授权 +for file in start.sh starts/bfstart.sh starts/afstart.sh menu.sh menus/task_cmd.sh menus/bot_tg.sh; do sed -i "s|/bin/sh|/bin/$shtype|" "$CRASHDIR/$file" 2>/dev/null chmod +x "$CRASHDIR/$file" 2>/dev/null done @@ -190,10 +191,6 @@ mv -f "$CRASHDIR"/ruleset/geosite-cn.mrs "$CRASHDIR"/ruleset/cn.mrs 2>/dev/null #数据库移动 mv -f "$CRASHDIR"/*.srs "$CRASHDIR"/ruleset/ 2>/dev/null mv -f "$CRASHDIR"/*.mrs "$CRASHDIR"/ruleset/ 2>/dev/null -#内核改名 -mv -f "$CRASHDIR"/clash "$CRASHDIR"/CrashCore 2>/dev/null -#内核压缩 -[ -f "$CRASHDIR"/CrashCore ] && tar -zcf "$CRASHDIR"/CrashCore.tar.gz -C "$CRASHDIR" CrashCore for file in dropbear_rsa_host_key authorized_keys tun.ko ShellDDNS.sh; do mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/tools/"$file" 2>/dev/null done diff --git a/scripts/libs/gen_base64.sh b/scripts/libs/gen_base64.sh new file mode 100644 index 00000000..a3b36a87 --- /dev/null +++ b/scripts/libs/gen_base64.sh @@ -0,0 +1,26 @@ +#生成指定位数的加密秘钥,符合ss2022协议 +gen_random() { + if ckcmd openssl;then + openssl rand --base64 "$1" + elif ckcmd base64;then + head -c "$1" /dev/urandom | base64 | tr -d '\n' + elif busybox base64 --help >/dev/null 2>&1;then + head -c "$1" /dev/urandom | base64 | tr -d '\n' + elif ckcmd uuencode;then + head -c "$1" /dev/urandom | uuencode -m - | sed -n '2p' + else + return 1 + fi +} +#对指定字符串进行base64转码 +gen_base64() { + if ckcmd base64;then + echo -n "$1" | base64 | tr -d '\n' + elif busybox base64 --help >/dev/null 2>&1;then + echo -n "$1" | busybox base64 | tr -d '\n' + elif ckcmd openssl;then + echo -n "$1" | openssl base64 -A + else + return 1 + fi +} \ No newline at end of file diff --git a/scripts/menu.sh b/scripts/menu.sh index 14d96e80..4651d60f 100644 --- a/scripts/menu.sh +++ b/scripts/menu.sh @@ -226,10 +226,10 @@ main_menu() { 7) GT_CFG_PATH="$CRASHDIR"/configs/gateway.cfg touch "$GT_CFG_PATH" - checkcfg=$(cat $GT_CFG_PATH) + checkcfg=$(cat "$CFG_PATH" "$GT_CFG_PATH") . "$CRASHDIR"/menus/7_gateway.sh && gateway if [ -n "$PID" ]; then - checkcfg_new=$(cat $GT_CFG_PATH) + checkcfg_new=$(cat "$CFG_PATH" "$GT_CFG_PATH") [ "$checkcfg" != "$checkcfg_new" ] && checkrestart fi main_menu diff --git a/scripts/menus/6_core_config.sh b/scripts/menus/6_core_config.sh index 19fe3b93..41032f99 100644 --- a/scripts/menus/6_core_config.sh +++ b/scripts/menus/6_core_config.sh @@ -78,7 +78,8 @@ setrules(){ #自定义规则 esac } get_rule_group(){ - "$CRASHDIR"/start.sh get_save http://127.0.0.1:${db_port}/proxies | sed 's/:{/!/g' | awk -F '!' '{for(i=1;i<=NF;i++) print $i}' | grep -aE '"Selector|URLTest|LoadBalance"' | grep -aoE '"name":.*"now":".*",' | awk -F '"' '{print "#"$4}' | tr -d '\n' + . "$CRASHDIR"/libs/web_save.sh + get_save http://127.0.0.1:${db_port}/proxies | sed 's/:{/!/g' | awk -F '!' '{for(i=1;i<=NF;i++) print $i}' | grep -aE '"Selector|URLTest|LoadBalance"' | grep -aoE '"name":.*"now":".*",' | awk -F '"' '{print "#"$4}' | tr -d '\n' } echo "-----------------------------------------------" echo -e "\033[33m你可以在这里快捷管理自定义规则\033[0m" @@ -377,10 +378,10 @@ EOF ln -sf ${provider_temp_file} ${TMPDIR}/provider_temp_file else echo -e "\033[33m正在获取在线模版!\033[0m" - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/provider_temp_file rules/${coretype}_providers/${provider_temp_file} + get_bin ${TMPDIR}/provider_temp_file rules/${coretype}_providers/${provider_temp_file} [ -z "$(grep -o 'rules' ${TMPDIR}/provider_temp_file)" ] && { echo -e "\033[31m下载失败,请尝试更换安装源!\033[0m" - setserver + . "$CRASHDIR"/menus/9_upgrade.sh && setserver setproviders } fi @@ -412,14 +413,14 @@ EOF cut -c 1- ${TMPDIR}/providers/providers.yaml ${TMPDIR}/providers/proxy-groups.yaml ${TMPDIR}/providers/rules.yaml > ${TMPDIR}/config.yaml rm -rf ${TMPDIR}/providers #调用内核测试 - . "$CRASHDIR"/libs/core_webget.sh && core_find && ${TMPDIR}/CrashCore -t -d ${BINDIR} -f ${TMPDIR}/config.yaml + . "$CRASHDIR"/libs/core_tools.sh && core_find && ${TMPDIR}/CrashCore -t -d ${BINDIR} -f ${TMPDIR}/config.yaml if [ "$?" = 0 ];then echo -e "\033[32m配置文件生成成功!\033[0m" mkdir -p ${CRASHDIR}/yamls mv -f ${TMPDIR}/config.yaml ${CRASHDIR}/yamls/config.yaml read -p "是否立即启动/重启服务?(1/0) > " res [ "$res" = 1 ] && { - start_core && $CRASHDIR/start.sh cronset '更新订阅' + start_core && cronset '更新订阅' exit } else @@ -474,10 +475,10 @@ EOF ln -sf ${provider_temp_file} ${TMPDIR}/provider_temp_file else echo -e "\033[33m正在获取在线模版!\033[0m" - ${CRASHDIR}/start.sh get_bin ${TMPDIR}/provider_temp_file rules/${coretype}_providers/${provider_temp_file} + get_bin ${TMPDIR}/provider_temp_file rules/${coretype}_providers/${provider_temp_file} [ -z "$(grep -o 'route' ${TMPDIR}/provider_temp_file)" ] && { echo -e "\033[31m下载失败,请尝试更换安装源!\033[0m" - setserver + . "$CRASHDIR"/menus/9_upgrade.sh && setserver setproviders } fi @@ -514,7 +515,7 @@ EOF cat ${TMPDIR}/provider_temp_file | sed "s/{providers_tags}/$providers_tags/g" > ${TMPDIR}/providers/outbounds.json rm -rf ${TMPDIR}/provider_temp_file #调用内核测试 - . "$CRASHDIR"/libs/core_webget.sh && core_find && ${TMPDIR}/CrashCore merge ${TMPDIR}/config.json -C ${TMPDIR}/providers + . "$CRASHDIR"/libs/core_tools.sh && core_find && ${TMPDIR}/CrashCore merge ${TMPDIR}/config.json -C ${TMPDIR}/providers if [ "$?" = 0 ];then echo -e "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m" mkdir -p ${CRASHDIR}/jsons @@ -522,7 +523,7 @@ EOF rm -rf ${TMPDIR}/providers read -p "是否立即启动/重启服务?(1/0) > " res [ "$res" = 1 ] && { - start_core && $CRASHDIR/start.sh cronset '更新订阅' + start_core && cronset '更新订阅' exit } else @@ -532,6 +533,8 @@ EOF fi } setproviders(){ #自定义providers + . "$CRASHDIR"/libs/set_cron.sh + . "$CRASHDIR"/libs/web_get_bin.sh #获取模版名称 if [ -z "$(grep "provider_temp_${coretype}" ${CRASHDIR}/configs/ShellCrash.cfg)" ];then provider_temp_des=$(sed -n "1 p" ${CRASHDIR}/configs/${coretype}_providers.list | awk '{print $1}') diff --git a/scripts/menus/7_gateway.sh b/scripts/menus/7_gateway.sh index a0c5c25b..7c7f747e 100644 --- a/scripts/menus/7_gateway.sh +++ b/scripts/menus/7_gateway.sh @@ -2,11 +2,12 @@ # Copyright (C) Juewuy . "$GT_CFG_PATH" . "$CRASHDIR"/menus/check_port.sh +. "$CRASHDIR"/libs/gen_base64.sh gateway(){ #访问与控制主菜单 - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e "\033[30;47m欢迎使用访问与控制菜单:\033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 1 配置\033[33m公网访问防火墙\033[0m" echo -e " 2 配置\033[36mTelegram专属控制机器人\033[0m \033[32m$bot_tg_service\033[0m" echo -e " 3 配置\033[36mDDNS自动域名\033[0m" @@ -17,7 +18,7 @@ gateway(){ #访问与控制主菜单 echo -e " 7 配置\033[36mWireguard客户端\033[0m(限Singbox) \033[32m$wg_service\033[0m" } echo -e " 0 返回上级菜单" - echo ----------------------------------------------- + echo "-----------------------------------------------" read -p "请输入对应数字 > " num case "$num" in 0) ;; @@ -64,17 +65,17 @@ gateway(){ #访问与控制主菜单 } set_fw_wan() { #公网防火墙设置 [ -z "$fw_wan" ] && fw_wan=ON - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e "\033[31m注意:\033[0m如在vps运行,还需在vps安全策略对相关端口同时放行" [ -n "$fw_wan_ports" ] && echo -e "当前放行端口:\033[36m$fw_wan_ports\033[0m" echo -e "默认拦截端口:\033[33m$dns_port,$mix_port,$db_port\033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 1 启用/关闭公网防火墙: \033[36m$fw_wan\033[0m" echo -e " 2 添加放行端口(可包含默认拦截端口)" echo -e " 3 移除指定放行端口" echo -e " 0 返回上级菜单" - echo ----------------------------------------------- + echo "-----------------------------------------------" read -p "请输入对应数字 > " num case $num in 1) @@ -120,30 +121,11 @@ set_fw_wan() { #公网防火墙设置 ;; esac } -set_bot_tg_init(){ - echo ----------------------------------------------- - echo -e "请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m" - echo ----------------------------------------------- - read -p "请输入你获取到的API TOKEN > " TOKEN - echo ----------------------------------------------- - echo -e "请向\033[32m你申请的机器人\033[31m而不是BotFather\033[0m,发送任意几条消息!" - echo ----------------------------------------------- - read -p "我已经发送完成(1/0) > " res - if [ "$res" = 1 ]; then - . "$CRASHDIR"/libs/web_json.sh #加载web工具 - bot_api=https://api.telegram.org/bot$TOKEN - chat=$(web_json_get "$bot_api/getUpdates" | tail -n -1) - [ -n "$chat" ] && chat_ID=$(echo $chat | grep -oE '"id":.*,"is_bot":false' | sed s'/"id"://'g | sed s'/,"is_bot":false//'g) - [ -z "$chat_ID" ] && { - echo -e "\033[31m无法获取对话ID,请确认使用的不是已经被绑定的机器人,或手动输入ChatID!\033[0m" - echo -e "通常访问 $url_tg 即可看到ChatID,也可以尝试其他方法\033[0m" - read -p "请手动输入ChatID > " chat_ID - } - if [ -n "$chat_ID" ]; then - setconfig TG_TOKEN $TOKEN "$CFG" - setconfig TG_CHATID $chat_ID "$CFG" - #设置机器人快捷命令 - JSON=$(cat </dev/null 2>&1 else bot_tg_service=ON - [ -z "$PID" ] && "$CRASHDIR"/menus/bot_tg.sh & + [ -n "$(pidof CrashCore)" ] && [ -z "$PID" ] && "$CRASHDIR"/menus/bot_tg.sh & fi setconfig bot_tg_service "$bot_tg_service" } set_bot_tg(){ [ -n "$ts_auth_key" ] && ts_auth_key_info='已设置' - echo ----------------------------------------------- + [ -n "$TG_CHATID" ] && TG_CHATID_info='已绑定' + echo "-----------------------------------------------" echo -e "\033[31m注意:\033[0m由于网络环境原因,此机器人仅限服务启动时运行!" - echo -e "此机器人与推送机器人互不影响,请尽量不要设置成同一机器人" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 1 启用/关闭TG-BOT服务 \033[32m$bot_tg_service\033[0m" - echo -e " 2 TG-BOT绑定设置" + echo -e " 2 TG-BOT绑定设置 \033[32m$TG_CHATID_info\033[0m" echo -e " 0 返回上级菜单 \033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" read -p "请输入对应数字 > " num case "$num" in 0) ;; 1) - . "$CFG" + . "$GT_CFG_PATH" if [ -n "$TG_CHATID" ];then set_bot_tg_service else - set_bot_tg_init && set_bot_tg_service + echo -e "\033[31m请先绑定TG-BOT!\033[0m" fi sleep 1 set_bot_tg ;; 2) - set_bot_tg_init && set_bot_tg_service + if [ -n "$chat_ID" ] && [ -n "$push_TG" ] && [ "$push_TG" != 'publictoken' ]; then + read -p "检测到已经绑定了TG推送BOT,是否直接使用?(1/0) > " res + if [ "$res" = 1 ]; then + TOKEN="$push_TG" + set_bot_tg_config + set_bot_tg + return + fi + fi + set_bot_tg_init set_bot_tg ;; *) @@ -207,17 +203,19 @@ set_bot_tg(){ esac } set_vmess(){ - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e "\033[31m注意:\033[0m设置的端口会添加到公网访问防火墙并自动放行!\n 脚本只提供基础功能,更多需求请用自定义配置文件功能!" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 1 \033[32m启用/关闭\033[0mVmess入站 \033[32m$vms_service\033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 2 设置\033[36m监听端口\033[0m: \033[36m$vms_port\033[0m" echo -e " 3 设置\033[33mWS-path(可选)\033[0m: \033[33m$vms_ws_path\033[0m" echo -e " 4 设置\033[36m秘钥-uuid\033[0m: \033[36m$vms_uuid\033[0m" echo -e " 5 一键生成\033[32m随机秘钥\033[0m" + gen_base64 1 >/dev/null 2>&1 && + echo -e " 6 一键生成分享链接" echo -e " 0 返回上级菜单 \033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" read -p "请输入对应数字 > " num case "$num" in 0) ;; @@ -233,10 +231,12 @@ set_vmess(){ ;; 2) read -p "请输入端口号(输入0删除) > " text - [ "$text" = 0 ] && unset vms_port - if check_port "$text"; then + if [ "$text" = 0 ];then + vms_port='' + setconfig vms_port "" "$GT_CFG_PATH" + elif check_port "$text"; then vms_port="$text" - setconfig vms_port "$text" "$CFG" + setconfig vms_port "$text" "$GT_CFG_PATH" fw_wan_ports=$(echo "$fw_wan_ports,$vms_port" | sed "s/^,//") setconfig fw_wan_ports "$fw_wan_ports" else @@ -246,10 +246,12 @@ set_vmess(){ ;; 3) read -p "请输入ws-path路径(输入0删除) > " text - [ "$text" = 0 ] && unset vms_ws_path - if echo "$text" |grep -qE '^/';then + if [ "$text" = 0 ];then + vms_ws_path='' + setconfig vms_ws_path "" "$GT_CFG_PATH" + elif echo "$text" |grep -qE '^/';then vms_ws_path="$text" - setconfig vms_ws_path "$text" "$CFG" + setconfig vms_ws_path "$text" "$GT_CFG_PATH" else echo -e "\033[31m不是合法的path路径,必须以【/】开头!\033[0m" sleep 1 @@ -258,10 +260,12 @@ set_vmess(){ ;; 4) read -p "请输入UUID(输入0删除) > " text - [ "$text" = 0 ] && unset vms_uuid - if echo "$text" |grep -qiE '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$';then + if [ "$text" = 0 ];then + vms_uuid='' + setconfig vms_uuid "" "$GT_CFG_PATH" + elif echo "$text" |grep -qiE '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$';then vms_uuid="$text" - setconfig vms_uuid "$text" "$CFG" + setconfig vms_uuid "$text" "$GT_CFG_PATH" else echo -e "\033[31m不是合法的UUID格式,请重新输入或使用随机生成功能!\033[0m" sleep 1 @@ -270,7 +274,34 @@ set_vmess(){ ;; 5) vms_uuid=$(cat /proc/sys/kernel/random/uuid) - setconfig vms_uuid "$vms_uuid" "$CFG" + setconfig vms_uuid "$vms_uuid" "$GT_CFG_PATH" + sleep 1 + set_vmess + ;; + 6) + read -p "请输入本机公网IP(4/6)或域名 > " host_wan + if [ -n "$host_wan" ] && [ -n "$vms_port" ] && [ -n "$vms_uuid" ];then + [ -n "$vms_ws_path" ] && vms_net=ws + vms_json=$(cat </dev/null 2>&1 && + echo -e " 5 一键生成分享链接" echo -e " 0 返回上级菜单 \033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" read -p "请输入对应数字 > " num case "$num" in 0) ;; @@ -304,10 +337,12 @@ set_shadowsocks(){ ;; 2) read -p "请输入端口号(输入0删除) > " text - [ "$text" = 0 ] && unset sss_port - if check_port "$text"; then + if [ "$text" = 0 ];then + sss_port='' + setconfig sss_port "" "$GT_CFG_PATH" + elif check_port "$text"; then sss_port="$text" - setconfig sss_port "$text" "$CFG" + setconfig sss_port "$text" "$GT_CFG_PATH" fw_wan_ports=$(echo "$fw_wan_ports,$sss_port" | sed "s/^,//") setconfig fw_wan_ports "$fw_wan_ports" else @@ -316,55 +351,55 @@ set_shadowsocks(){ set_shadowsocks ;; 3) - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 1 \033[32mxchacha20-ietf-poly1305\033[0m" echo -e " 2 \033[32mchacha20-ietf-poly1305\033[0m" echo -e " 3 \033[32maes-128-gcm\033[0m" echo -e " 4 \033[32maes-256-gcm\033[0m" - ckcmd openssl && { - echo ----------------------------------------------- - echo -e "\033[31m注意:\033[0m2022系列加密必须使用OpenSSL随机生成的password!" + gen_random 1 >/dev/null && { + echo "-----------------------------------------------" + echo -e "\033[31m注意:\033[0m2022系列加密必须使用随机生成的password!" echo -e " 5 \033[32m2022-blake3-chacha20-poly1305\033[0m" echo -e " 6 \033[32m2022-blake3-aes-128-gcm\033[0m" echo -e " 7 \033[32m2022-blake3-aes-256-gcm\033[0m" } - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 0 返回上级菜单" read -p "请选择要使用的加密协议 > " num case "$num" in 1) sss_cipher=xchacha20-ietf-poly1305 - sss_pwd=$(cat /proc/sys/kernel/random/uuid) + sss_pwd=$(gen_random 16) ;; 2) sss_cipher=chacha20-ietf-poly1305 - sss_pwd=$(cat /proc/sys/kernel/random/uuid) + sss_pwd=$(gen_random 16) ;; 3) sss_cipher=aes-128-gcm - sss_pwd=$(cat /proc/sys/kernel/random/uuid) + sss_pwd=$(gen_random 16) ;; 4) sss_cipher=aes-256-gcm - sss_pwd=$(cat /proc/sys/kernel/random/uuid) + sss_pwd=$(gen_random 16) ;; 5) sss_cipher=2022-blake3-chacha20-poly1305 - sss_pwd=$(openssl rand --base64 32) + sss_pwd=$(gen_random 32) ;; 6) sss_cipher=2022-blake3-aes-128-gcm - sss_pwd=$(openssl rand --base64 16) + sss_pwd=$(gen_random 16) ;; 7) sss_cipher=2022-blake3-aes-256-gcm - sss_pwd=$(openssl rand --base64 32) + sss_pwd=$(gen_random 32) ;; *) ;; esac - setconfig sss_cipher "$sss_cipher" "$CFG" - setconfig sss_pwd "$sss_pwd" "$CFG" + setconfig sss_cipher "$sss_cipher" "$GT_CFG_PATH" + setconfig sss_pwd "$sss_pwd" "$GT_CFG_PATH" set_shadowsocks ;; 4) @@ -375,27 +410,39 @@ set_shadowsocks(){ read -p "请输入秘钥(输入0删除) > " text [ "$text" = 0 ] && unset sss_pwd sss_pwd="$text" - setconfig sss_pwd "$text" "$CFG" + setconfig sss_pwd "$text" "$GT_CFG_PATH" fi set_shadowsocks ;; + 5) + read -p "请输入本机公网IP(4/6)或域名 > " text + if [ -n "$text" ] && [ -n "$sss_port" ] && [ -n "$sss_pwd" ];then + ss_link="ss://$(gen_base64 "$sss_cipher":"$sss_pwd")@${text}:${sss_port}#ShellCrash_ss_in" + echo "-----------------------------------------------" + echo -e "你的分享链接是(请勿随意分享给他人):\n\033[32m$ss_link\033[0m" + else + echo -e "\033[31m请先完成必选设置!\033[0m" + fi + sleep 1 + set_shadowsocks + ;; *) errornum ;; esac } set_tailscale(){ [ -n "$ts_auth_key" ] && ts_auth_key_info='*********' - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译Tailscale模块\n如需使用请先前往自定义内核更新完整版内核文件!" echo -e "创建秘钥:\033[32;4mhttps://login.tailscale.com/admin/settings/keys\033[0m" echo -e "访问非本机目标需允许通告:\033[32;4mhttps://login.tailscale.com\033[0m" echo -e "访问非本机目标需在终端设置使用Subnet或EXIT-NODE模式" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 1 \033[32m启用/关闭\033[0mTailscale服务 \033[32m$ts_service\033[0m" echo -e " 2 设置\033[36m秘钥\033[0m(Auth Key) $ts_auth_key_info" echo -e " 3 通告路由\033[33m内网地址\033[0m(Subnet) \033[36m$ts_subnet\033[0m" echo -e " 4 通告路由\033[31m全部流量\033[0m(EXIT-NODE) \033[36m$ts_exit_node\033[0m" echo -e " 0 返回上级菜单 \033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" read -p "请输入对应数字 > " num case "$num" in 0) ;; @@ -412,17 +459,17 @@ set_tailscale(){ 2) read -p "请输入秘钥(输入0删除) > " text [ "$text" = 0 ] && unset ts_auth_key ts_auth_key_info || ts_auth_key="$text" - [ -n "$ts_auth_key" ] && setconfig ts_auth_key "$ts_auth_key" "$CFG" + setconfig ts_auth_key "$ts_auth_key" "$GT_CFG_PATH" set_tailscale ;; 3) [ "$ts_subnet" = true ] && ts_subnet=false || ts_subnet=true - setconfig ts_subnet "$ts_subnet" "$CFG" + setconfig ts_subnet "$ts_subnet" "$GT_CFG_PATH" set_tailscale ;; 4) [ "$ts_exit_node" = true ] && ts_exit_node=false || ts_exit_node=true - setconfig ts_exit_node "$ts_exit_node" "$CFG" + setconfig ts_exit_node "$ts_exit_node" "$GT_CFG_PATH" set_tailscale ;; *) errornum ;; @@ -432,21 +479,21 @@ set_wireguard(){ [ -n "$wg_public_key" ] && wgp_key_info='*********' || unset wgp_key_info [ -n "$wg_private_key" ] && wgv_key_info='*********' || unset wgv_key_info [ -n "$wg_pre_shared_key" ] && wgpsk_key_info='*********' || unset wgpsk_key_info - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译WireGuard模块\n如需使用请先前往自定义内核更新完整版内核文件!" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 1 \033[32m启用/关闭\033[0mWireguard服务 \033[32m$wg_service\033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 2 设置\033[36mEndpoint地址\033[0m: \033[36m$wg_server\033[0m" echo -e " 3 设置\033[36mEndpoint端口\033[0m: \033[36m$wg_port\033[0m" echo -e " 4 设置\033[36m公钥-PublicKey\033[0m: \033[36m$wgp_key_info\033[0m" echo -e " 5 设置\033[36m密钥-PresharedKey\033[0m: \033[36m$wgpsk_key_info\033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" echo -e " 6 设置\033[33m私钥-PrivateKey\033[0m: \033[33m$wgv_key_info\033[0m" echo -e " 7 设置\033[33m组网IPV4地址\033[0m: \033[33m$wg_ipv4\033[0m" echo -e " 8 可选\033[33m组网IPV6地址\033[0m: \033[33m$wg_ipv6\033[0m" echo -e " 0 返回上级菜单 \033[0m" - echo ----------------------------------------------- + echo "-----------------------------------------------" read -p "请输入对应数字 > " num case "$num" in 0) ;; @@ -466,31 +513,31 @@ set_wireguard(){ case "$num" in 2) wg_server="$text" - setconfig wg_server "$text" "$CFG" + setconfig wg_server "$text" "$GT_CFG_PATH" ;; 3) wg_port="$text" - setconfig wg_port "$text" "$CFG" + setconfig wg_port "$text" "$GT_CFG_PATH" ;; 4) wg_public_key="$text" - setconfig wg_public_key "$text" "$CFG" + setconfig wg_public_key "$text" "$GT_CFG_PATH" ;; 5) wg_pre_shared_key="$text" - setconfig wg_pre_shared_key "$text" "$CFG" + setconfig wg_pre_shared_key "$text" "$GT_CFG_PATH" ;; 6) wg_private_key="$text" - setconfig wg_private_key "$text" "$CFG" + setconfig wg_private_key "$text" "$GT_CFG_PATH" ;; 7) wg_ipv4="$text" - setconfig wg_ipv4 "$text" "$CFG" + setconfig wg_ipv4 "$text" "$GT_CFG_PATH" ;; 8) wg_ipv6="$text" - setconfig wg_ipv6 "$text" "$CFG" + setconfig wg_ipv6 "$text" "$GT_CFG_PATH" ;; esac diff --git a/scripts/menus/8_tools.sh b/scripts/menus/8_tools.sh index a10939df..7713782e 100644 --- a/scripts/menus/8_tools.sh +++ b/scripts/menus/8_tools.sh @@ -1,6 +1,6 @@ #!/bin/sh # Copyright (C) Juewuy -#工具脚本 + #工具与优化 tools() { ssh_tools() { @@ -250,51 +250,8 @@ log_pusher() { } else #echo -e "\033[33m详细设置指南请参考 https://juewuy.github.io/ \033[0m" - private_bot() { - echo -e "请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m" - echo "-----------------------------------------------" - read -p "请输入你获取到的API TOKEN > " TOKEN - echo "-----------------------------------------------" - echo -e "请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m" - url_tg=https://api.telegram.org/bot${TOKEN}/getUpdates - } - public_bot() { - echo -e "请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m" - TOKEN=publictoken - url_tg=https://tgbot.jwsc.eu.org/publictoken/getUpdates - } - set_bot() { - echo -e "发送此秘钥: \033[30;46m$public_key\033[0m" - echo "-----------------------------------------------" - read -p "我已经发送完成(1/0) > " res - if [ "$res" = 1 ]; then - [ -n "$authentication" ] && auth="$authentication@" - export https_proxy="http://${auth}127.0.0.1:$mix_port" - if curl --version >/dev/null 2>&1; then - chat=$(curl -kfsSl $url_tg 2>/dev/null) - else - chat=$(wget -Y on -q -O - $url_tg) - fi - [ -n "$chat" ] && chat_ID=$(echo $chat | sed 's/"update_id":/{\n"update_id":/g' | grep "$public_key" | head -n1 | grep -oE '"id":.*,"is_bot' | sed s'/"id"://' | sed s'/,"is_bot//') - [ -z "$chat_ID" ] && [ "$TOKEN" != 'publictoken' ] && { - echo -e "\033[31m无法获取对话ID,请返回重新设置或手动输入ChatID!\033[0m" - echo -e "通常访问 \033[32;4m$url_tg\033[0m \n\033[36m即可看到ChatID\033[0m" - read -p "请手动输入ChatID > " chat_ID - } - if echo "$chat_ID" | grep -qE '^[0-9]{8,}$'; then - push_TG=$TOKEN - setconfig push_TG $TOKEN - setconfig chat_ID $chat_ID - "$CRASHDIR"/start.sh logger "已完成Telegram日志推送设置!" 32 - else - echo -e "\033[31m无法获取对话ID,请重新配置!\033[0m" - sleep 1 - chose_bot - fi - fi - } + . "$CRASHDIR"/menus/bot_tg_bind.sh chose_bot() { - public_key=$(cat /proc/sys/kernel/random/boot_id | sed 's/.*-//') echo "-----------------------------------------------" echo -e " 1 使用公共机器人 ——不依赖内核服务" echo -e " 2 使用私人机器人 ——需要额外申请" @@ -303,11 +260,11 @@ log_pusher() { case $num in 1) public_bot - set_bot + set_bot && tg_push_token || chose_bot ;; 2) private_bot - set_bot + set_bot && tg_push_token || chose_bot ;; *) errornum diff --git a/scripts/menus/bot_tg_bind.sh b/scripts/menus/bot_tg_bind.sh new file mode 100644 index 00000000..a0f2842e --- /dev/null +++ b/scripts/menus/bot_tg_bind.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +. "$CRASHDIR"/libs/web_json.sh + +private_bot() { + echo "-----------------------------------------------" + echo -e "请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m" + echo "-----------------------------------------------" + read -p "请输入你获取到的API TOKEN > " TOKEN + echo "-----------------------------------------------" + echo -e "请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m" + url_tg=https://api.telegram.org/bot${TOKEN}/getUpdates +} +public_bot() { + echo -e "请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m" + TOKEN=publictoken + url_tg=https://tgbot.jwsc.eu.org/publictoken/getUpdates +} +tg_push_token(){ + push_TG="$TOKEN" + setconfig push_TG "$TOKEN" + setconfig chat_ID "$chat_ID" + "$CRASHDIR"/start.sh logger "已完成Telegram日志推送设置!" 32 +} +set_bot() { + public_key=$(cat /proc/sys/kernel/random/boot_id | sed 's/.*-//') + echo -e "发送此秘钥: \033[30;46m$public_key\033[0m" + echo "-----------------------------------------------" + read -p "我已经发送完成(1/0) > " res + if [ "$res" = 1 ]; then + chat=$(web_json_get $url_tg 2>/dev/null) + [ -n "$chat" ] && chat_ID=$(echo $chat | sed 's/"update_id":/{\n"update_id":/g' | grep "$public_key" | head -n1 | grep -oE '"id":.*,"is_bot' | sed s'/"id"://' | sed s'/,"is_bot//') + [ -z "$chat_ID" ] && [ "$TOKEN" != 'publictoken' ] && { + echo -e "\033[31m无法获取对话ID,请返回重新设置或手动输入ChatID!\033[0m" + echo -e "通常访问 \033[32;4m$url_tg\033[0m \n\033[36m即可看到ChatID\033[0m" + read -p "请手动输入ChatID > " chat_ID + } + if echo "$chat_ID" | grep -qE '^[0-9]{8,}$'; then + return 0 + else + echo -e "\033[31m无法获取对话ID,请重新配置!\033[0m" + sleep 1 + return 1 + fi + fi +} + diff --git a/scripts/menus/task_cmd.sh b/scripts/menus/task_cmd.sh new file mode 100644 index 00000000..5f3094e1 --- /dev/null +++ b/scripts/menus/task_cmd.sh @@ -0,0 +1,146 @@ +#!/bin/sh +# Copyright (C) Juewuy + +#加载全局变量 +[ -z "$CRASHDIR" ] && CRASHDIR=$( cd $(dirname $0);cd ..;pwd) +. "$CRASHDIR"/libs/get_config.sh +#加载工具 +. "$CRASHDIR"/libs/check_cmd.sh +. "$CRASHDIR"/libs/set_config.sh +. "$CRASHDIR"/libs/web_get_bin.sh +. "$CRASHDIR"/libs/logger.sh + +task_logger(){ + [ "$task_push" = 1 ] && push= || push=off + [ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m" + [ "$3" = 'off' ] && push=off + echo "$1" |grep -qE '(每隔|时每)([1-9]|[1-9][0-9])分钟' && push=off + logger "$1" 0 "$push" +} + +#任务命令 +check_update(){ #检查更新工具 + get_bin "$TMPDIR"/crashversion "$1" echooff + [ "$?" = "0" ] && . "$TMPDIR"/crashversion 2>/dev/null + rm -rf "$TMPDIR"/crashversion +} +update_core(){ #自动更新内核 + #检查版本 + check_update bin/version + crash_v_new=$(eval echo \$${crashcore}_v) + if [ -z "$crash_v_new" -o "$crash_v_new" = "$core_v" ];then + task_logger "任务【自动更新内核】中止-未检测到版本更新" + return 0 + else + . "$CRASHDIR"/libs/core_webget.sh && core_webget #调用下载工具 + case "$?" in + 0) + task_logger "任务【自动更新内核】下载完成,正在重启服务!" + "$CRASHDIR"/start.sh start + return 0 + ;; + 1) + task_logger "任务【自动更新内核】出错-下载失败!" + return 1 + ;; + *) + task_logger "任务【自动更新内核】出错-内核校验失败!" + "$CRASHDIR"/start.sh start + return 1 + ;; + esac + fi +} +update_scripts(){ #自动更新脚本 + #检查版本 + check_update version + if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ];then + task_logger "任务【自动更新脚本】中止-未检测到版本更新" + return 0 + else + get_bin "$TMPDIR"/clashfm.tar.gz "bin/update.tar.gz" + if [ "$?" != "0" ];then + rm -rf "$TMPDIR"/clashfm.tar.gz + task_logger "任务【自动更新内核】出错-下载失败!" + return 1 + else + #停止服务 + "$CRASHDIR"/start.sh stop + #解压 + tar -zxf "$TMPDIR"/clashfm.tar.gz ${tar_para} -C "$CRASHDIR"/ + if [ $? -ne 0 ];then + rm -rf "$TMPDIR"/clashfm.tar.gz + task_logger "任务【自动更新内核】出错-解压失败!" + "$CRASHDIR"/start.sh start + return 1 + else + . "$CRASHDIR"/init.sh >/dev/null + "$CRASHDIR"/start.sh start + return 0 + fi + fi + fi +} +update_mmdb(){ #自动更新数据库 + getgeo(){ + #检查版本 + check_update bin/version + geo_v="$(echo $2 | awk -F "." '{print $1}')_v" #获取版本号类型比如Country_v + geo_v_new=$GeoIP_v + geo_v_now=$(eval echo \$$geo_v) + if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ];then + task_logger "任务【自动更新数据库文件】跳过-未检测到$2版本更新" + else + #更新文件 + get_bin "$TMPDIR"/$1 "bin/geodata/$2" + if [ "$?" != "0" ];then + task_logger "任务【自动更新数据库文件】更新【$2】下载失败!" + rm -rf "$TMPDIR"/$1 + else + mv -f "$TMPDIR"/$1 "$BINDIR"/$1 + setconfig $geo_v $GeoIP_v + task_logger "任务【自动更新数据库文件】更新【$2】成功!" + fi + fi + } + [ -n "${cn_mini_v}" -a -s "$CRASHDIR"/Country.mmdb ] && getgeo Country.mmdb cn_mini.mmdb + [ -n "${china_ip_list_v}" -a -s "$CRASHDIR"/cn_ip.txt ] && getgeo cn_ip.txt china_ip_list.txt + [ -n "${china_ipv6_list_v}" -a -s "$CRASHDIR"/cn_ipv6.txt ] && getgeo cn_ipv6.txt china_ipv6_list.txt + [ -n "${geosite_v}" -a -s "$CRASHDIR"/GeoSite.dat ] && getgeo GeoSite.dat geosite.dat + [ -n "${geoip_cn_v}" -a -s "$CRASHDIR"/geoip.db ] && getgeo geoip.db geoip_cn.db + [ -n "${geosite_cn_v}" -a -s "$CRASHDIR"/geosite.db ] && getgeo geosite.db geosite_cn.db + return 0 +} +reset_firewall(){ #重设透明路由防火墙 + "$CRASHDIR"/start.sh stop_firewall + "$CRASHDIR"/start.sh afstart +} +ntp(){ + [ "$crashcore" != singbox ] && ckcmd ntpd && ntpd -n -q -p 203.107.6.88 >/dev/null 2>&1 || exit 0 +} +web_save_auto(){ + . "$CRASHDIR"/libs/web_save.sh && web_save +} +update_config() { #更新订阅并重启 + . "$CRASHDIR"/starts/core_config.sh && get_core_config && "$CRASHDIR"/start.sh start +} +hotupdate() { #热更新订阅 + . "$CRASHDIR"/starts/core_config.sh && get_core_config && + . "$CRASHDIR"/starts/check_core.sh && check_core && + . "$CRASHDIR"/starts/"$target"_modify.sh && modify_"$format" && rm -rf "$TMPDIR"/CrashCore && + . "$CRASHDIR"/libs/web_restore.sh && put_save "http://127.0.0.1:$db_port/configs" "{\"path\":\"$CRASHDIR/config.$format\"}" + exit $? +} + +case "$1" in + [1-9][0-9][0-9]) + task_command=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}') + task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $3}') + #task_logger "任务$task_name 开始执行" + eval $task_command && task_res=成功 || task_res=失败 + task_logger "任务【$2】执行$task_res" + ;; + *) + "$1" + ;; +esac diff --git a/scripts/start.sh b/scripts/start.sh index 4501c568..d2445ff2 100644 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -74,6 +74,8 @@ stop) cronset '保守模式守护进程' cronset '运行时每' cronset '流媒体预解析' + #停止tg机器人 + PID=$(pidof /bin/sh "$CRASHDIR"/menus/bot_tg.sh) && [ -n "$PID" ] && kill -9 $PID >/dev/null 2>&1 #多种方式结束进程 if [ "$start_old" != "已开启" -a "$USER" = "root" -a "$(cat /proc/1/comm)" = "systemd" ]; then @@ -89,7 +91,6 @@ stop) stop_firewall #清理路由策略 fi PID=$(pidof CrashCore) && [ -n "$PID" ] && kill -9 $PID >/dev/null 2>&1 - PID=$(pidof /bin/sh "$CRASHDIR"/menus/bot_tg.sh) && [ -n "$PID" ] && kill -9 $PID >/dev/null 2>&1 #清理缓存目录 rm -rf "$TMPDIR"/CrashCore ;;