diff --git a/ShellCrash.tar.gz b/ShellCrash.tar.gz index 207e14a0..c395af97 100644 Binary files a/ShellCrash.tar.gz and b/ShellCrash.tar.gz differ diff --git a/bin/version b/bin/version index 537f3d26..48fe9b09 100644 --- a/bin/version +++ b/bin/version @@ -1,4 +1,4 @@ meta_v=v1.19.17 singboxr_v=1.13.0-alpha.27 -versionsh=1.9.5alpha3 +versionsh=1.9.5alpha4 GeoIP_v=20251205 diff --git a/scripts/lang/chs/common.lang b/scripts/lang/chs/common.lang index 0a553b51..0bdfae85 100644 --- a/scripts/lang/chs/common.lang +++ b/scripts/lang/chs/common.lang @@ -1,7 +1,12 @@ -COMMON_INPUT="请输入对应标号" +COMMON_INPUT="请输入对应数字" +COMMON_INPUT_L="请输入对应字母或数字" COMMON_BACK="返回上级菜单" -COMMON_SUCCESS="设置成功!" -COMMON_FAILED="设置失败!" +COMMON_SUCCESS="操作成功!" +COMMON_FAILED="操作失败!" COMMON_UNSET="未设置" COMMON_MOD="模式" +COMMON_ERR_NUM="请输入正确的数字!" +COMMON_ERR_LETTER="请输入正确的字母或数字!" +COMMON_ERR_INPUT="输入错误,请重新输入!" +COMMON_ERR_INPUT="操作已取消!" diff --git a/scripts/lang/chs/menu.lang b/scripts/lang/chs/menu.lang index f1ccbc57..25e01531 100644 --- a/scripts/lang/chs/menu.lang +++ b/scripts/lang/chs/menu.lang @@ -1,5 +1,4 @@ # ===== 通用提示 ===== -MENU_ERR_INPUT="请输入正确的字母或数字!" MENU_RESTART_NOTICE="检测到配置变更,是否立即重启服务以应用新配置:" diff --git a/scripts/lang/en/common.lang b/scripts/lang/en/common.lang index e7722726..8a089b1e 100644 --- a/scripts/lang/en/common.lang +++ b/scripts/lang/en/common.lang @@ -1,7 +1,12 @@ COMMON_INPUT="Please enter a number" +COMMON_INPUT_L="Enter a letter or a number" COMMON_BACK="Back" -COMMON_SUCCESS="Successfully set!" +COMMON_SUCCESS="Setup Success!" COMMON_FAILED="Setup failed!" COMMON_UNSET="Not set" COMMON_MOD="Mod" +COMMON_ERR_NUM="Please enter a valid number!" +COMMON_ERR_LETTER="Please enter a valid letter or number!" +COMMON_ERR_INPUT="Invalid input, please try again!" +COMMON_ERR_INPUT="Operation cancelled!" diff --git a/scripts/lang/en/menu.lang b/scripts/lang/en/menu.lang index 5f4fdf60..421aa035 100644 --- a/scripts/lang/en/menu.lang +++ b/scripts/lang/en/menu.lang @@ -1,5 +1,4 @@ # ===== Common Prompts ===== -MENU_ERR_INPUT="Please enter a valid letter or number!" MENU_RESTART_NOTICE="Changes have been detected. Please restart the service!" diff --git a/scripts/libs/logger.sh b/scripts/libs/logger.sh index 5d168ecb..5f71e7f0 100644 --- a/scripts/libs/logger.sh +++ b/scripts/libs/logger.sh @@ -1,3 +1,7 @@ + +[ -n "$__IS_LIB_LOGGER" ] && return +__IS_LIB_LOGGER=1 + #日志工具 . "$CRASHDIR"/libs/web_json.sh #$1日志内容$2显示颜色$3是否推送 diff --git a/scripts/menu.sh b/scripts/menu.sh index 63c0c63a..c079ce88 100644 --- a/scripts/menu.sh +++ b/scripts/menu.sh @@ -18,6 +18,7 @@ CFG_PATH="$CRASHDIR"/configs/ShellCrash.cfg . "$CRASHDIR"/libs/check_cmd.sh . "$CRASHDIR"/libs/check_autostart.sh . "$CRASHDIR"/libs/i18n.sh +. "$CRASHDIR"/menus/common.sh . "$CRASHDIR"/menus/1_start.sh . "$CRASHDIR"/menus/running_status.sh diff --git a/scripts/menus/6_core_config.sh b/scripts/menus/6_core_config.sh index b6ddacb1..c5a0e669 100644 --- a/scripts/menus/6_core_config.sh +++ b/scripts/menus/6_core_config.sh @@ -4,941 +4,314 @@ [ -n "$__IS_MODULE_6_CORECONFIG_LOADED" ] && return __IS_MODULE_6_CORECONFIG_LOADED=1 -YAMLSDIR="$CRASHDIR"/yamls -JSONSDIR="$CRASHDIR"/jsons - -# 导入订阅、配置文件相关 -# 自定义规则 -setrules() { - - set_rule_type() { - echo "-----------------------------------------------" - echo -e "\033[33m请选择规则类型\033[0m" - echo "$rule_type" | awk -F ' ' '{for(i=1;i<=NF;i++){print i" "$i}}' - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num - case "$num" in - "" | 0) ;; - [0-9]*) - if [ "$num" -gt $(echo $rule_type | awk -F " " '{print NF}') ]; then - errornum - sleep 1 - else - rule_type_set=$(echo "$rule_type" | cut -d' ' -f"$num") - echo "-----------------------------------------------" - echo -e "\033[33m请输入规则语句,可以是域名、泛域名、IP网段或者其他匹配规则类型的内容\033[0m" - read -p "请输入对应规则 > " rule_state_set - if [ -n "$rule_state_set" ]; then - set_group_type - else - errornum - slepp 1 - fi - fi - ;; - *) - errornum - sleep 1 - ;; - esac - } - - set_group_type() { - echo "-----------------------------------------------" - echo -e "\033[36m请选择具体规则\033[0m" - echo -e "\033[33m此处规则读取自现有配置文件,如果你后续更换配置文件时运行出错,请尝试重新添加\033[0m" - echo "$rule_group" | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}' - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num - case "$num" in - "" | 0) ;; - [0-9]*) - if [ "$num" -gt "$(echo "$rule_group" | awk -F "#" '{print NF}')" ]; then - errornum - sleep 1 - else - rule_group_set=$(echo "$rule_group" | cut -d'#' -f"$num") - rule_all="- ${rule_type_set},${rule_state_set},${rule_group_set}" - echo "IP-CIDR SRC-IP-CIDR IP-CIDR6" | grep -q -- "$rule_type_set" && rule_all="${rule_all},no-resolve" - - echo "$rule_all" >>"$YAMLSDIR"/rules.yaml - echo "-----------------------------------------------" - echo -e "\033[32m添加成功!\033[0m" - fi - ;; - *) - errornum - sleep 1 - ;; - esac - } - - del_rule_type() { - while true; do - echo -e "输入对应数字即可移除相应规则:" - 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 - case "$num" in - "" | 0) - break - ;; - *) - if [ "$num" -le "$(wc -l <"$YAMLSDIR"/rules.yaml)" ]; then - sed -i "${num}d" "$YAMLSDIR"/rules.yaml - sleep 1 - else - errornum - sleep 1 - break - fi - ;; - esac - done - } - - get_rule_group() { - . "$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' - } +if echo "$crashcore" | grep -q 'singbox';then + CONFIG_PATH="$CRASHDIR"/yamls/config.json +else + CONFIG_PATH="$CRASHDIR"/jsons/config.yaml +fi +# 配置文件主界面 +set_core_config() { while true; do - echo "-----------------------------------------------" - echo -e "\033[33m你可以在这里快捷管理自定义规则\033[0m" - echo -e "如需批量操作,请手动编辑:\033[36m $YAMLSDIR/rules.yaml\033[0m" - echo -e "\033[33msingbox和clash共用此处规则,可无缝切换!\033[0m" - echo -e "大量规则请尽量使用rule-set功能添加,\033[31m此处过量添加可能导致启动卡顿!\033[0m" - echo "-----------------------------------------------" - echo -e " 1 新增自定义规则" - echo -e " 2 移除自定义规则" - echo -e " 3 清空规则列表" - echo "$crashcore" | grep -q 'singbox' || echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m" - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num - case "$num" in - "" | 0) - break - ;; - 1) - rule_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN PROCESS-NAME" - rule_group="DIRECT#REJECT$(get_rule_group)" - set_rule_type - ;; - 2) - echo "-----------------------------------------------" - if [ -s "$YAMLSDIR"/rules.yaml ]; then - del_rule_type - else - echo -e "请先添加自定义规则!" - sleep 1 - fi - ;; - 3) - read -p "确认清空全部自定义规则?(1/0) > " res - [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/rules.yaml - ;; - 4) - echo "-----------------------------------------------" - if [ "$proxies_bypass" = "OFF" ]; then - echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" - echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" - read -p "启用节点绕过?(1/0) > " res - [ "$res" = "1" ] && proxies_bypass=ON - else - proxies_bypass=OFF - fi - setconfig proxies_bypass "$proxies_bypass" - sleep 1 - ;; - *) - errornum - sleep 1 - ;; - esac - done -} - -# 自定义clash策略组 -setgroups() { - set_group_type() { - echo "-----------------------------------------------" - echo -e "\033[33m注意策略组名称必须和【自定义规则】或【自定义节点】功能中指定的策略组一致!\033[0m" - echo -e "\033[33m建议先创建策略组,之后可在【自定义规则】或【自定义节点】功能中智能指定\033[0m" - echo -e "\033[33m如需在当前策略组下添加节点,请手动编辑$YAMLSDIR/proxy-groups.yaml\033[0m" - read -r -p "请输入自定义策略组名称(不支持纯数字且不要包含特殊字符!) > " new_group_name - - echo "-----------------------------------------------" - echo -e "\033[32m请选择策略组【$new_group_name】的类型!\033[0m" - echo "$group_type_cn" | awk '{for(i=1;i<=NF;i++){print i" "$i}}' - read -r -p "请输入对应数字 > " num - new_group_type=$(echo "$group_type" | awk '{print $'"$num"'}') - if [ "$num" = "1" ]; then - unset new_group_url interval - else - read -r -p "请输入测速地址,回车则默认使用https://www.gstatic.com/generate_204 > " new_group_url - [ -z "$new_group_url" ] && new_group_url=https://www.gstatic.com/generate_204 - new_group_url="url: '$new_group_url'" - interval="interval: 300" - fi - set_group_add - # 添加自定义策略组 - cat >>"$YAMLSDIR"/proxy-groups.yaml < " char - case "$char" in - "" | 0) ;; - *) - for num in $char; do - rule_group_set=$(echo "$proxy_group" | cut -d'#' -f"$num") - rule_group_add="${rule_group_add}#${rule_group_set}" - done - if [ -n "$rule_group_add" ]; then - new_group_name="$new_group_name$rule_group_add" - unset rule_group_add - else - errornum - sleep 1 - fi - ;; - esac - } - - while true; do - echo "-----------------------------------------------" - echo -e "\033[33m你可以在这里快捷管理自定义策略组\033[0m" - echo -e "\033[36m如需修改或批量操作,请手动编辑:$YAMLSDIR/proxy-groups.yaml\033[0m" - echo "-----------------------------------------------" - echo -e " 1 添加自定义策略组" - echo -e " 2 查看自定义策略组" - echo -e " 3 清空自定义策略组" - echo -e " 0 返回上级菜单" - read -r -p "请输入对应数字 > " num - case "$num" in - "" | 0) - break - ;; - 1) - group_type="select url-test fallback load-balance" - group_type_cn="手动选择 自动选择 故障转移 负载均衡" - 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_group_type - ;; - 2) - echo "-----------------------------------------------" - cat "$YAMLSDIR"/proxy-groups.yaml - ;; - 3) - read -p "确认清空全部自定义策略组?(1/0) > " res - [ "$res" = "1" ] && echo '#用于添加自定义策略组' >"$YAMLSDIR"/proxy-groups.yaml - ;; - *) - errornum - sleep 1 - ;; - esac - done -} - -# 自定义clash节点 -setproxies() { - set_proxy_type() { - echo "-----------------------------------------------" - echo -e "\033[33m注意节点格式必须是单行,不包括括号,name:必须写在最前,例如:\033[0m" - echo -e "\033[36m【name: \"test\", server: 192.168.1.1, port: 12345, type: socks5, udp: true】\033[0m" - echo -e "更多写法请参考:\033[32m https://juewuy.github.io/ \033[0m" - read -r -p "请输入节点 > " proxy_state_set - if echo "$proxy_state_set" | grep -q "#"; then - echo -e "\033[33m绝对禁止包含【#】号!!!\033[0m" - elif echo "$proxy_state_set" | grep -Eq "^name:"; then - set_group_add - else - errornum - sleep 1 - fi - } - - set_group_add() { - echo "-----------------------------------------------" - echo -e "\033[36m请选择想要将节点添加到的策略组\033[0m" - echo -e "\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m" - echo -e "\033[33m如需自定义策略组,请先使用【管理自定义策略组功能】添加\033[0m" - echo "-----------------------------------------------" - echo "$proxy_group" | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}' - echo "-----------------------------------------------" - echo -e " 0 返回上级菜单" - read -r -p "请输入对应数字(多个用空格隔开) > " char - case "$char" in - "" | 0) ;; - *) - for num in $char; do - rule_group_set=$(echo "$proxy_group" | cut -d'#' -f"$num") - 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 "-----------------------------------------------" - echo -e "\033[32m添加成功!\033[0m" - unset rule_group_add - else - errornum - sleep 1 - fi - ;; - esac - } - - while true; do - echo "-----------------------------------------------" - echo -e "\033[33m你可以在这里快捷管理自定义节点\033[0m" - echo -e "\033[36m如需批量操作,请手动编辑:$YAMLSDIR/proxies.yaml\033[0m" - echo "-----------------------------------------------" - echo -e " 1 添加自定义节点" - echo -e " 2 管理自定义节点" - echo -e " 3 清空自定义节点" - echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m" - echo -e " 0 返回上级菜单" - read -r -p "请输入对应数字 > " num - case "$num" in - "" | 0) - break - ;; - 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/#//')" - set_proxy_type - ;; - 2) - echo "-----------------------------------------------" - 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' - echo "-----------------------------------------------" - echo -e "\033[33m输入节点对应数字可以移除对应节点\033[0m" - read -r -p "请输入对应数字 > " num - if [ "$num" -le $(cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | wc -l) ]; then - sed -i "$num{/^\s*[^#]/d}" "$YAMLSDIR"/proxies.yaml - else - errornum - fi - else - echo -e "请先添加自定义节点!" - sleep 1 - fi - ;; - 3) - read -r -p "确认清空全部自定义节点?(1/0) > " res - [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null - ;; - 4) - echo "-----------------------------------------------" - if [ "$proxies_bypass" = "OFF" ]; then - echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" - echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" - read -r -p "启用节点绕过?(1/0) > " res - [ "$res" = "1" ] && proxies_bypass=ON - else - proxies_bypass=OFF - fi - setconfig proxies_bypass "$proxies_bypass" - sleep 1 - setrules - break - ;; - *) - errornum - sleep 1 - ;; - esac - done -} - -gen_clash_providers(){ #生成clash的providers配置文件 - gen_clash_providers_txt(){ - if [ -n "$(echo $2|grep -E '^./')" ];then - local type=file - local path=$2 - local download_url= - else - local type=http - local path="./providers/${1}.yaml" - local download_url=$2 - fi - cat >> $TMPDIR/providers/providers.yaml <> $TMPDIR/providers/providers.yaml </dev/null | + awk '{print " " NR ") " $1 "\t" substr($2,1,30) "..."}' + separator_line "-" } - } - if [ -z "$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg)" ];then - provider_temp_file="$(sed -n "1 p" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $2}')" - else - provider_temp_file=$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') - fi - echo "-----------------------------------------------" - if [ -s "$provider_temp_file" ];then - ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file - else - echo -e "\033[33m正在获取在线模版!\033[0m" - 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" - . "$CRASHDIR"/menus/9_upgrade.sh && setserver + content_line "a) \033[32m添加提供者\033[0m(支持订阅/节点/本地文件)" + content_line "b) \033[36m本地生成配置文件\033[0m(基于providers,推荐!)" + content_line "c) \033[33m在线生成配置文件\033[0m(Subconverter)" + content_line "d) \033[31m清空提供者列表\033[0m" + content_line "e) \033[36m自定义配置文件\033[0m" + content_line "f) \033[33m还原配置文件\033[0m" + + common_back + read -r -p "$COMMON_INPUT_L > " num + case "$num" in + "" | 0) + break + ;; + [1-9] | [1-9][0-9]) + line=$(cat "$CRASHDIR"/configs/providers.cfg "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null |sed -n "$num p") setproviders - } - fi - #生成proxy_providers模块 - mkdir -p "$TMPDIR"/providers - #预创建文件并写入对应文件头 - echo 'proxy-providers:' > "$TMPDIR"/providers/providers.yaml - #切割模版文件 - sed -n '/^proxy-groups:/,/^[a-z]/ { /^rule/d; p; }' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/proxy-groups.yaml - sed -n '/^rule/,$p' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/rules.yaml - rm -rf "$TMPDIR"/provider_temp_file - #生成providers模块 - if [ -n "$2" ];then - gen_clash_providers_txt $1 $2 - providers_tags=$1 - echo ' - {name: '${1}', type: url-test, tolerance: 100, lazy: true, use: ['${1}']}' >> "$TMPDIR"/providers/proxy-groups.yaml - else - providers_tags='' - while read line;do - tag=$(echo $line | awk '{print $1}') - url=$(echo $line | awk '{print $2}') - providers_tags=$(echo "$providers_tags, $tag" | sed 's/^, //') - gen_clash_providers_txt $tag $url - echo ' - {name: '${tag}', type: url-test, tolerance: 100, lazy: true, use: ['${tag}']}' >> "$TMPDIR"/providers/proxy-groups.yaml - done < "$CRASHDIR"/configs/providers.cfg - fi - #修饰模版文件并合并 - sed -i "s/{providers_tags}/$providers_tags/g" "$TMPDIR"/providers/proxy-groups.yaml - cut -c 1- "$TMPDIR"/providers/providers.yaml "$TMPDIR"/providers/proxy-groups.yaml "$TMPDIR"/providers/rules.yaml > "$TMPDIR"/config.yaml - rm -rf "$TMPDIR"/providers - #调用内核测试 - . "$CRASHDIR"/starts/check_core.sh && check_core && "$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 && cronset '更新订阅' - exit - } - else - rm -rf "$TMPDIR"/CrashCore - rm -rf "$TMPDIR"/config.yaml - echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" - fi -} -gen_singbox_providers(){ #生成singbox的providers配置文件 - gen_singbox_providers_txt(){ - if [ -n "$(echo $2|grep -E '^./')" ];then - cat >> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json < "$TMPDIR"/providers/providers.json < "$TMPDIR"/providers/outbounds_add.json <> "$TMPDIR"/providers/outbounds_add.json - else - providers_tags='' - while read line;do - tag=$(echo $line | awk '{print $1}') - url=$(echo $line | awk '{print $2}') - providers_tags=$(echo "$providers_tags, \"$tag\"" | sed 's/^, //') - gen_singbox_providers_txt $tag $url - echo '{ "tag": "'${tag}'", "type": "urltest", "tolerance": 100, "providers": ["'${tag}'"], "include": ".*" },' >> "$TMPDIR"/providers/outbounds_add.json - done < "$CRASHDIR"/configs/providers.cfg - fi - #修复文件格式 - sed -i '$s/},/}]}/' "$TMPDIR"/providers/outbounds_add.json - sed -i '$s/},/}]}/' "$TMPDIR"/providers/providers.json - #使用模版生成outbounds和rules模块 - cat "$TMPDIR"/provider_temp_file | sed "s/{providers_tags}/$providers_tags/g" | sed "s/\"providers_tags\"/$providers_tags/g" > "$TMPDIR"/providers/outbounds.json - rm -rf "$TMPDIR"/provider_temp_file - #调用内核测试 - . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers - if [ "$?" = 0 ];then - echo -e "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m" - mkdir -p "$CRASHDIR"/jsons - mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json - rm -rf "$TMPDIR"/providers - read -p "是否立即启动/重启服务?(1/0) > " res - [ "$res" = 1 ] && { - start_core && cronset '更新订阅' - exit - } - else - echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" - rm -rf "$TMPDIR"/CrashCore - rm -rf "$TMPDIR"/providers - fi -} - -# 自定义providers -setproviders() { - . "$CRASHDIR"/libs/set_cron.sh - . "$CRASHDIR"/libs/web_get_bin.sh - while true; do - # 获取模版名称 - 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}') - else - provider_temp_file=$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') - provider_temp_des=$(grep "$provider_temp_file" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}') - [ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file - fi - echo "-----------------------------------------------" - echo -e "\033[33m你可以在这里快捷管理与生成自定义的providers服务商\033[0m" - echo -e "\033[33m支持在线及本地的Yaml格式配置导入\033[0m" - [ -s "$CRASHDIR"/configs/providers.cfg ] && { - echo "-----------------------------------------------" - echo -e "\033[36m输入对应数字可管理providers服务商\033[0m" - cat "$CRASHDIR"/configs/providers.cfg | awk -F "#" '{print " "NR" "$1" "$2}' - } - echo -e " d \033[31m清空\033[0mproviders服务商列表" - echo -e " e \033[33m清理\033[0mproviders目录文件" - echo "-----------------------------------------------" - echo -e "\033[36m按照a-b-c的顺序即可完成配置生成\033[0m" - echo -e " a \033[36m添加\033[0mproviders服务商/节点" - echo -e " b 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" - echo -e " c \033[32m生成\033[0m基于providers的配置文件" - echo "-----------------------------------------------" - echo -e " 0 返回上级菜单" - read -p "请输入对应字母或数字 > " num - case "$num" in - "" | 0) - break - ;; - [1-9] | [1-9][0-9]) - provider_name=$(sed -n "$num p" "$CRASHDIR"/configs/providers.cfg | awk '{print $1}') - provider_url=$(sed -n "$num p" "$CRASHDIR"/configs/providers.cfg | awk '{print $2}') - if [ -z "$provider_name" ]; then - errornum - else - echo "-----------------------------------------------" - echo -e " 1 修改名称:\033[36m$provider_name\033[0m" - echo -e " 2 修改链接地址:\033[32m$provider_url\033[0m" - echo -e " 3 生成\033[33m仅包含此链接\033[0m的配置文件" - echo -e " 4 \033[31m移除此链接\033[0m" - echo "-----------------------------------------------" - echo -e " 0 返回上级菜单" - read -p "请选择需要执行的操作 > " num - case "$num" in - "" | 0) ;; - 1) - read -p "请输入名称或者代号(不可重复,不支持纯数字) > " name - if [ -n "$name" ] && [ -z "$(echo "$name" | grep -E '^[0-9]+$')" ] && ! grep -q "$name" "$CRASHDIR"/configs/providers.cfg; then - sed -i "s|$provider_name $provider_url|$name $provider_url|" "$CRASHDIR"/configs/providers.cfg - else - echo -e "\033[31m输入错误,请重新输入!\033[0m" - fi - ;; - 2) - read -p "请输入链接地址或本地相对路径 > " link - if [ -n "$(echo $link | grep -E '.*\..*|^\./')" ] && [ -z "$(grep "$link" "$CRASHDIR"/configs/providers.cfg)" ]; then - link=$(echo $link | sed 's/\&/\\\&/g') #特殊字符添加转义 - sed -i "s|$provider_name $provider_url|$provider_name $link|" "$CRASHDIR"/configs/providers.cfg - else - echo -e "\033[31m输入错误,请重新输入!\033[0m" - fi - ;; - 3) - gen_${coretype}_providers $provider_name $provider_url - ;; - 4) - sed -i "/^$provider_name /d" "$CRASHDIR"/configs/providers.cfg - ;; - *) - errornum - ;; - esac - fi - sleep 1 - ;; - a) - echo "-----------------------------------------------" - echo -e "支持填写在线的\033[32mYClash订阅地址\033[0m或者\033[32m本地Clash配置文件\033[0m" - echo -e "本地配置文件请放在\033[32m$CRASHDIR\033[0m目录下,并填写相对路径如【\033[32m./providers/test.yaml\033[0m】" - echo "-----------------------------------------------" - read -p "请输入链接地址或本地相对路径 > " link - link=$(echo $link | sed 's/ //g') #去空格 - [ -n "$(echo $link | grep -E '.*\..*|^\./')" ] && { - read -p "请输入名称或代号(不可重复,不支持纯数字) > " name - name=$(echo $name | sed 's/ //g') - [ -n "$name" ] && [ -z "$(echo "$name" | grep -E '^[0-9]+$')" ] && ! grep -q "$name" "$CRASHDIR"/configs/providers.cfg && { - echo "-----------------------------------------------" - echo -e "名称:\033[36m$name\033[0m" - echo -e "链接地址/路径:\033[32m$link\033[0m" - read -p "确认添加?(1/0) > " res - [ "$res" = 1 ] && { - echo "$name $link" >>"$CRASHDIR"/configs/providers.cfg - echo -e "\033[32mproviders已添加!\033[0m" - } - } - } - [ "$?" != 0 ] && echo -e "\033[31m输入错误,操作已取消!\033[0m" - sleep 1 + ;; + b) + if [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ];then + if [ "$crashcore" = meta ] || [ "$crashcore" = singboxr ]; then + . "$CRASHDIR"/menus/providers.sh + providers + else + error_report "\033[33m仅限Mihomo/singboxr内核使用,请更换内核!\033[0m" + fi + else + error_report "请先添加提供者!" + fi ;; c) - echo "-----------------------------------------------" - if [ -s "$CRASHDIR"/configs/providers.cfg ]; then - echo -e "\033[33msingboxr与mihomo内核的providers配置文件不互通!\033[0m" - echo "-----------------------------------------------" - read -p "确认生成${coretype}配置文件?(1/0) > " res - [ "$res" = "1" ] && { - gen_${coretype}_providers - } - else - echo -e "\033[31m你还未添加链接或本地配置文件,请先添加!\033[0m" - sleep 1 - fi - ;; - b) - echo "-----------------------------------------------" - echo -e "当前规则模版为:\033[32m$provider_temp_des\033[0m" - echo -e "\033[33m请选择在线模版:\033[0m" - echo "-----------------------------------------------" - cat "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print " "NR" "$1}' - echo "-----------------------------------------------" - echo -e " a 使用\033[36m本地模版\033[0m" - echo "-----------------------------------------------" - read -p "请输入对应字母或数字 > " num - case "$num" in - "" | 0) ;; - a) - read -p "请输入模版的路径(绝对路径) > " dir - if [ -s $dir ]; then - provider_temp_file=$dir - setconfig provider_temp_${coretype} $provider_temp_file - echo -e "\033[32m设置成功!\033[0m" - else - echo -e "\033[31m输入错误,找不到对应模版文件!\033[0m" - fi - sleep 1 - ;; - *) - provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/${coretype}_providers.list 2>/dev/null | awk '{print $2}') - if [ -z "$provider_temp_file" ]; then - errornum - sleep 1 - else - setconfig provider_temp_${coretype} $provider_temp_file - fi - ;; - esac + if [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ];then + . "$CRASHDIR"/menus/subconverter.sh + subconverter + else + error_report "请先添加提供者!" + fi ;; d) - read -p "确认清空全部链接?(1/0) > " res - [ "$res" = "1" ] && rm -rf "$CRASHDIR"/configs/providers.cfg - ;; + separator_line "=" + content_line "\033[33m警告:这将删除所有提供者且无法还原!\033[0m" + separator_line "-" + read -r -p "确认清空提供者列表?(1/0) > " res + [ "$res" = 1 ] && { + rm -f "$CRASHDIR"/configs/providers.cfg + rm -f "$CRASHDIR"/configs/providers_uri.cfg + common_success + } + ;; e) - echo -e "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" - read -p "是否继续?(1/0) > " res - [ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers + checkcfg=$(cat $CFG_PATH) + override + if [ -n "$PID" ]; then + checkcfg_new=$(cat $CFG_PATH) + [ "$checkcfg" != "$checkcfg_new" ] && checkrestart + fi ;; + f) + if [ ! -f "$CONFIG_PATH".bak ]; then + echo "-----------------------------------------------" + content_line "\033[31m没有找到配置文件的备份!\033[0m" + else + echo "-----------------------------------------------" + content_line "备份文件共有\033[32m$(wc -l <$"$CONFIG_PATH".bak)\033[0m行内容" + content_line "当前文件共有\033[32m$(wc -l <$"$CONFIG_PATH")\033[0m行内容" + read -p "确认还原配置文件?此操作不可逆![1/0] > " res + if [ "$res" = '1' ]; then + mv "$CONFIG_PATH".bak "$CONFIG_PATH" + echo "----------------------------------------------" + content_line "\033[32m配置文件已还原!请手动重启服务!\033[0m" + sleep 1 + break + else + echo "-----------------------------------------------" + content_line "\033[31m操作已取消!返回上级菜单!\033[0m" + sleep 1 + fi + fi + ;; + *) - errornum - sleep 1 + error_letter break ;; esac done } -set_clash_adv(){ #自定义clash高级规则 - [ ! -f "$YAMLSDIR"/user.yaml ] && cat > "$YAMLSDIR"/user.yaml < "$YAMLSDIR"/others.yaml < " num + link_info=$(echo "$link$link_uri" | cut -c 1-30) + common_tittle "\033[36m支持添加订阅链接/分享链接/本地文件作为提供者\033[0m" + content_line "1) 设置\033[36m名称或代号\033[0m \033[32m$name\033[0m" + content_line "2) 设置\033[32m链接或路径\033[0m: \033[36m$link_info...\033[0m" + [ -n "$link" ] && { + separator_line '-' + content_line "3) 设置\033[33m健康检查间隔\033[0m:\t\033[47;30m$interval\033[0m" + content_line "4) 设置\033[36m自动更新间隔\033[0m:\t\033[47;30m$interval2\033[0m" + content_line "5) 设置\033[31m排除节点正则\033[0m:\t\033[47;30m$exclude\033[0m" + content_line "6) 设置\033[32m包含节点正则\033[0m:\t\033[47;30m$include\033[0m" + echo "$link" | grep -q '^http' && + content_line "7) 设置\033[33m虚拟浏览器UA\033[0m:\t\033[47;30m$ua\033[0m" + } + separator_line "-" + content_line "a) \033[32m添加此提供者\033[0m" + [ -n "$link" ] && + content_line "b) \033[32m本地生成\033[0m仅包含此提供者的配置文件" + echo "$link$link_uri" | grep -q '://' && + content_line "c) \033[33m在线生成\033[0m仅包含此提供者的配置文件" + [ -n "$link" ] && + content_line "e) 直接使用此配置文件(不经过转换)" + content_line "d) \033[31m删除此提供者\033[0m" + common_back + read -r -p "请输入对应数字> " num case "$num" in "" | 0) break ;; - 1) - if [ -n "$(pidof CrashCore)" ]; then - echo "-----------------------------------------------" - echo -e "\033[33m检测到服务正在运行,需要先停止服务!\033[0m" - read -p "是否停止服务?(1/0) > " res - if [ "$res" = "1" ]; then - "$CRASHDIR"/start.sh stop - setport - fi - else - setport - fi - ;; + 1) + separator_line "=" + content_line "注意:名称或代号不可重复,且不支持纯数字!" + separator_line "-" + read -p "请输入具体名称或代号 > " text + text=$(echo $text | sed 's/ //g') #去空格 + if [ -n "$text" ] && [ -z "$(echo "$text" | grep -E '^[0-9]+$')" ] && ! grep -q "$text" "$CRASHDIR"/configs/providers.cfg;then + name="$text" + else + error_input + fi + ;; 2) - setrules - ;; - 3) - setproxies - ;; - 4) - setgroups - ;; - 5) - echo "$crashcore" | grep -q 'singbox' && set_singbox_adv || set_clash_adv - sleep 3 - ;; - 9) - echo "-----------------------------------------------" - echo -e "\033[33m此功能可能会导致严重问题!启用后脚本中大部分功能都将禁用!!!\033[0m" - echo -e "如果你不是非常了解$crashcore的运行机制,切勿开启!\033[0m" - echo -e "\033[33m继续后如出现任何问题,请务必自行解决,一切提问恕不受理!\033[0m" - echo "-----------------------------------------------" - sleep 2 - read -p "我确认遇到问题可以自行解决[1/0] > " res - [ "$res" = '1' ] && { - disoverride=1 - setconfig disoverride $disoverride - echo "-----------------------------------------------" - echo -e "\033[32m设置成功!\033[0m" - } - ;; - *) - errornum - sleep 1 - break - ;; - esac - done + separator_line "=" + content_line "订阅链接-支持https/http开头的clash配置文件订阅链接" + content_line "分享链接-支持ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)..." + content_line "本地文件-必须放在此目录下:\033[32m$CRASHDIR/providers\033[0m" + separator_line "-" + read -p "请输入具体链接或文件名 > " text + text=$(echo "$text" | sed 's/ //g') #去空格 + if echo "$text" | grep -q '^http';then + text=$(echo "$text" | sed 's/ *(.*)//g; s/#.*//g') #处理注释及超链接 + link="$text" + elif [ -n "$(echo $text | grep -E '^ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)')" ];then + link_uri=$(echo "$text" | sed 's/#.*//g') # 删除注释 + [ -z "$name" ] && name=$(echo "$text" | grep -o '#.*$' | cut -c2-) + elif [ -f "$CRASHDIR/providers/$text" ];then + link="./providers/$text" + else + error_input + fi + ;; + 3) + read -p "请输入健康检查间隔(单位:分钟) > " num + if [ -n "$num" ];then + interval="$num" + else + errornum + fi + ;; + 4) + read -p "请输入自动更新间隔(单位:小时) > " num + if [ -n "$num" ];then + interval2="$num" + else + errornum + fi + ;; + 5) + read -p "请输入需要排除的节点关键字(支持正则) > " text + if [ -n "$text" ];then + exclude="$text" + else + error_input + fi + ;; + 6) + read -p "请输入需要筛选使用的节点关键字(支持正则) > " text + if [ -n "$text" ];then + include="$text" + else + error_input + fi + ;; + 7) + read -p "请输入浏览器UA > " text + if [ -n "$text" ];then + ua="$text" + else + error_input + fi + ;; + a) + addproviders && common_success + break + ;; + b) + if echo "$link" | grep -q '^http';then + addproviders + . "$CRASHDIR"/menus/providers.sh + gen_${coretype}_providers "$name" "$link" "$interval" "$interval2" "$exclude" "$include" + else + content_line "\033[31m$请先完成必填选项!\033[0m" + fi + ;; + c) + if [ -n "$name" ] && [ -n "$link$link_uri" ];then + addproviders + Url="$link$link_uri" + Https='' + setconfig Url "'$Url'" + setconfig Https + # 获取在线文件 + jump_core_config + else + content_line "\033[31m请先完成必填选项!\033[0m" + fi + ;; + d) + if [ -n "$name" ] && [ -n "$link" ];then + sed -i "/^$name /d" "$CRASHDIR"/configs/providers.cfg + content_line "\033[32m$COMMON_SUCCESS\033[0m" + elif [ -n "$name" ] && [ -n "$link_uri" ];then + sed -i "/^$name /d" "$CRASHDIR"/configs/providers_uri.cfg + content_line "\033[32m$COMMON_SUCCESS\033[0m" + fi + break + ;; + e) + if [ -n "$link" ];then + content_line "注意:\033[31m此功能不兼容“跳过证书验证”功能\033[0m" + content_line "\033[31m请确认你完全理解自己在做什么\033[0m" + read -p "我确认遇到问题可以自行解决(1/0) > " res + [ "$res" = "1" ] && { + if [ -s "$CRASHDIR/$link" ];then + [ -n "$name" ] && addproviders + ln -sf "$CRASHDIR/$link" "$CONFIG_PATH" + elif [ -n "$link" ];then + [ -n "$name" ] && addproviders + Https="$link" + Url='' + setconfig Https "'$Https'" + setconfig Url + # 获取在线文件 + jump_core_config + fi + } + else + content_line "\033[31m$请先完成必填选项!\033[0m" + fi + ;; + *) + error_letter + break + ;; + esac + done } -gen_link_config(){ #选择在线规则 - echo "-----------------------------------------------" - echo 当前使用规则为:$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}') - grep -aE '^5' "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$2$4}' - echo "-----------------------------------------------" - echo 0 返回上级菜单 - read -p "请输入对应数字 > " num - totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list ) - if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then - errornum - elif [ "$num" = 0 ];then - echo - elif [ "$num" -le "$totalnum" ];then - #将对应标记值写入配置 - rule_link=$num - setconfig rule_link $rule_link - echo "-----------------------------------------------" - echo -e "\033[32m设置成功!返回上级菜单\033[0m" +addproviders() { + [ -n "$name" ] && { + [ -s "$CRASHDIR"/configs/providers.cfg ] && sed -i "/^$name /d" "$CRASHDIR"/configs/providers.cfg + [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && sed -i "/^$name /d" "$CRASHDIR"/configs/providers_uri.cfg + } + if [ -n "$name" ] && [ -n "$link" ];then + echo "$name $link $interval $interval2 $ua $exclude $include" >>"$CRASHDIR"/configs/providers.cfg + return 0 + elif [ -n "$name" ] && [ -n "$link_uri" ];then + echo "$name $link_uri" >>"$CRASHDIR"/configs/providers_uri.cfg + return 0 + else + error_report "\033[31m请先完成必填选项!\033[0m" + return 1 fi } -gen_link_server(){ #选择在线服务器 - echo "-----------------------------------------------" - echo -e "\033[36m以下为互联网采集的第三方服务器,具体安全性请自行斟酌!\033[0m" - echo -e "\033[32m感谢以下作者的无私奉献!!!\033[0m" - echo 当前使用后端为:$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}') - grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$3" "$2}' - echo "-----------------------------------------------" - echo 0 返回上级菜单 - read -p "请输入对应数字 > " num - totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list ) - if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then - errornum - elif [ "$num" = 0 ];then - echo - elif [ "$num" -le "$totalnum" ];then - #将对应标记值写入配置 - server_link=$num - setconfig server_link $server_link - echo "-----------------------------------------------" - echo -e "\033[32m设置成功!返回上级菜单\033[0m" - fi -} -gen_link_flt(){ #在线生成节点过滤 - [ -z "$exclude" ] && exclude="未设置" - echo "-----------------------------------------------" - echo -e "\033[33m当前过滤关键字:\033[47;30m$exclude\033[0m" - echo "-----------------------------------------------" - echo -e "\033[33m匹配关键字的节点会在导入时被【屏蔽】!!!\033[0m" - echo -e "多个关键字可以用\033[30;47m | \033[0m号分隔" - echo -e "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代" - echo "-----------------------------------------------" - echo -e " 000 \033[31m删除\033[0m关键字" - echo -e " 回车 取消输入并返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入关键字 > " exclude - if [ "$exclude" = '000' ]; then - echo "-----------------------------------------------" - exclude='' - echo -e "\033[31m 已删除节点过滤关键字!!!\033[0m" - fi - setconfig exclude "'$exclude'" -} -gen_link_ele(){ #在线生成节点筛选 - [ -z "$include" ] && include="未设置" - echo "-----------------------------------------------" - echo -e "\033[33m当前筛选关键字:\033[47;30m$include\033[0m" - echo "-----------------------------------------------" - echo -e "\033[33m仅有匹配关键字的节点才会被【导入】!!!\033[0m" - echo -e "多个关键字可以用\033[30;47m | \033[0m号分隔" - echo -e "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代" - echo "-----------------------------------------------" - echo -e " 000 \033[31m删除\033[0m关键字" - echo -e " 回车 取消输入并返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入关键字 > " include - if [ "$include" = '000' ]; then - echo "-----------------------------------------------" - include='' - echo -e "\033[31m 已删除节点匹配关键字!!!\033[0m" - fi - setconfig include "'$include'" -} -jump_core_config(){ #调用工具下载 +# 调用工具在线获取配置文件 +jump_core_config(){ . "$CRASHDIR"/starts/core_config.sh && get_core_config if [ "$?" = 0 ];then if [ "$inuserguide" != 1 ];then @@ -948,282 +321,3 @@ jump_core_config(){ #调用工具下载 fi fi } -gen_core_config_link(){ #在线生成工具 - echo "-----------------------------------------------" - echo -e "\033[30;47m 欢迎使用在线生成配置文件功能!\033[0m" - echo "-----------------------------------------------" - #设置输入循环 - i=1 - while [ $i -le 99 ] - do - echo "-----------------------------------------------" - echo -e "\033[33m本功能依赖第三方在线subconverter服务实现,脚本本身不提供任何代理服务!\033[0m" - echo -e "\033[31m严禁使用本脚本从事任何非法活动,否则一切后果请自负!\033[0m" - echo "-----------------------------------------------" - echo -e "支持批量(<=99)导入订阅链接、分享链接" - echo "-----------------------------------------------" - echo -e " 1 \033[36m开始生成配置文件\033[0m(原文件将被备份)" - echo -e " 2 设置\033[31m节点过滤\033[0m关键字 \033[47;30m$exclude\033[0m" - echo -e " 3 设置\033[32m节点筛选\033[0m关键字 \033[47;30m$include\033[0m" - echo -e " 4 选取在线\033[33m配置规则模版\033[0m" - echo -e " 5 \033[0m选取在线生成服务器\033[0m" - echo -e " 0 \033[31m撤销输入并返回上级菜单\033[0m" - echo "-----------------------------------------------" - read -p "请直接输入第${i}个链接或对应数字选项 > " link - link=$(echo $link | sed 's/\&/%26/g') #处理分隔符 - test=$(echo $link | grep "://") - link=`echo ${link/\#*/''}` #删除链接附带的注释内容 - link=`echo ${link/\ \(*\)/''}` #删除恶心的超链接内容 - link=`echo ${link/*\&url\=/""}` #将完整链接还原成单一链接 - link=`echo ${link/\&config\=*/""}` #将完整链接还原成单一链接 - - if [ -n "$test" ];then - if [ -z "$Url_link" ];then - Url_link="$link" - else - Url_link="$Url_link"\|"$link" - fi - i=$((i+1)) - - elif [ "$link" = '1' ]; then - if [ -n "$Url_link" ];then - i=100 - #将用户链接写入配置 - Url="$Url_link" - Https='' - setconfig Https - setconfig Url "'$Url'" - #获取在线yaml文件 - jump_core_config - else - echo "-----------------------------------------------" - echo -e "\033[31m请先输入订阅或分享链接!\033[0m" - sleep 1 - fi - - elif [ "$link" = '2' ]; then - gen_link_flt - - elif [ "$link" = '3' ]; then - gen_link_ele - - elif [ "$link" = '4' ]; then - gen_link_config - - elif [ "$link" = '5' ]; then - gen_link_server - - elif [ "$link" = 0 ];then - Url_link="" - i=100 - - else - echo "-----------------------------------------------" - echo -e "\033[31m请输入正确的链接或者数字!\033[0m" - sleep 1 - fi - done -} - -# 直接导入配置 -set_core_config_link() { - while true; do - echo "-----------------------------------------------" - echo -e "\033[32m仅限导入完整的配置文件链接!!!\033[0m" - echo "-----------------------------------------------" - echo -e "注意:\033[31m此功能不兼容“跳过证书验证”功能,部分老旧\n设备可能出现x509报错导致节点不通\033[0m" - echo -e "你也可以搭配在线订阅转换网站或者自建SubStore使用" - echo "$crashcore" | grep -q 'singbox' && echo -e "singbox内核建议使用\033[32;4mhttps://subv.jwsc.eu.org/\033[0m转换" - echo "-----------------------------------------------" - echo -e "\033[33m0 返回上级菜单\033[0m" - echo "-----------------------------------------------" - read -p "请输入完整链接 > " link - test=$(echo $link | grep -iE "tp.*://") - link=$(echo ${link/\ \(*\)/''}) # 删除恶心的超链接内容 - link=$(echo ${link//\&/\\&}) # 处理分隔符 - if [ -n "$link" -a -n "$test" ]; then - echo "-----------------------------------------------" - echo -e "请检查输入的链接是否正确:" - echo -e "\033[4;32m$link\033[0m" - read -p "确认导入配置文件?原配置文件将被备份![1/0] > " res - if [ "$res" = '1' ]; then - # 将用户链接写入配置 - Url='' - Https="$link" - setconfig Https "'$Https'" - setconfig Url - # 获取在线yaml文件 - jump_core_config - break - fi - elif [ "$link" = 0 ]; then - i= - break - else - echo "-----------------------------------------------" - echo -e "\033[31m请输入正确的配置文件链接地址!!!\033[0m" - echo -e "\033[33m仅支持http、https、ftp以及ftps链接!\033[0m" - sleep 1 - fi - done -} - -# 配置文件主界面 -set_core_config() { - while true; do - [ -z "$rule_link" ] && rule_link=1 - [ -z "$server_link" ] && server_link=1 - echo "$crashcore" | grep -q 'singbox' && config_path="$JSONSDIR"/config.json || config_path="$YAMLSDIR"/config.yaml - echo "-----------------------------------------------" - echo -e "\033[30;47m ShellCrash配置文件管理\033[0m" - echo "-----------------------------------------------" - echo -e " 1 在线\033[32m生成配置文件\033[0m(基于Subconverter订阅转换)" - if [ -f "$CRASHDIR"/v2b_api.sh ]; then - echo -e " 2 登录\033[33m获取订阅(推荐!)\033[0m" - else - echo -e " 2 在线\033[33m获取配置文件\033[0m(基于订阅提供者)" - fi - echo -e " 3 本地\033[32m生成配置文件\033[0m(基于内核providers,推荐!)" - echo -e " 4 本地\033[33m上传完整配置文件\033[0m" - echo -e " 5 设置\033[36m自动更新\033[0m" - echo -e " 6 \033[32m自定义\033[0m配置文件" - echo -e " 7 \033[33m更新\033[0m配置文件" - echo -e " 8 \033[36m还原\033[0m配置文件" - echo -e " 9 自定义浏览器UA \033[32m$user_agent\033[0m" - echo "-----------------------------------------------" - [ "$inuserguide" = 1 ] || echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num - case "$num" in - "" | 0) - break - ;; - 1) - if [ -n "$Url" ]; then - echo "-----------------------------------------------" - echo -e "\033[33m检测到已记录的链接内容:\033[0m" - echo -e "\033[4;32m$Url\033[0m" - echo "-----------------------------------------------" - read -p "清空链接/追加导入?[1/0] > " res - if [ "$res" = '1' ]; then - Url_link="" - echo "-----------------------------------------------" - echo -e "\033[31m链接已清空!\033[0m" - else - Url_link=$Url - fi - fi - gen_core_config_link - ;; - 2) - if [ -f "$CRASHDIR"/v2b_api.sh ]; then - . "$CRASHDIR"/v2b_api.sh - else - set_core_config_link - fi - ;; - 3) - if [ "$crashcore" = meta -o "$crashcore" = clashpre ]; then - coretype=clash - setproviders - elif [ "$crashcore" = singboxr ]; then - coretype=singbox - setproviders - else - echo -e "\033[33msingbox官方内核及Clash基础内核不支持此功能,请先更换内核!\033[0m" - sleep 1 - checkupdate && setcore - fi - ;; - 4) - echo "-----------------------------------------------" - echo -e "\033[33m请将本地配置文件上传到/tmp目录并重命名为config.yaml或者config.json\033[0m" - echo -e "\033[32m之后重新运行本脚本即可自动弹出导入提示!\033[0m" - sleep 2 - exit - ;; - 5) - . "$CRASHDIR"/menus/5_task.sh && task_menu - break - ;; - 6) - checkcfg=$(cat $CFG_PATH) - override - if [ -n "$PID" ]; then - checkcfg_new=$(cat $CFG_PATH) - [ "$checkcfg" != "$checkcfg_new" ] && checkrestart - fi - ;; - 7) - if [ -z "$Url" -a -z "$Https" ]; then - echo "-----------------------------------------------" - echo -e "\033[31m没有找到你的配置文件/订阅链接!请先输入链接!\033[0m" - sleep 1 - else - echo "-----------------------------------------------" - echo -e "\033[33m当前系统记录的链接为:\033[0m" - echo -e "\033[4;32m$Url$Https\033[0m" - echo "-----------------------------------------------" - read -p "确认更新配置文件?[1/0] > " res - if [ "$res" = '1' ]; then - jump_core_config - break - fi - fi - ;; - 8) - if [ ! -f ${config_path}.bak ]; then - echo "-----------------------------------------------" - echo -e "\033[31m没有找到配置文件的备份!\033[0m" - else - echo "-----------------------------------------------" - echo -e 备份文件共有"\033[32m$(wc -l <${config_path}.bak)\033[0m"行内容,当前文件共有"\033[32m$(wc -l <${config_path})\033[0m"行内容 - read -p "确认还原配置文件?此操作不可逆![1/0] > " res - if [ "$res" = '1' ]; then - mv ${config_path}.bak ${config_path} - echo "----------------------------------------------" - echo -e "\033[32m配置文件已还原!请手动重启服务!\033[0m" - sleep 1 - break - else - echo "-----------------------------------------------" - echo -e "\033[31m操作已取消!返回上级菜单!\033[0m" - sleep 1 - fi - fi - ;; - 9) - echo "-----------------------------------------------" - echo -e "\033[36m如果6-1或者6-2无法正确获取配置文件时可以尝试使用\033[0m" - echo -e " 1 使用自动UA" - echo -e " 2 不使用UA" - echo -e " 3 使用自定义UA:\033[32m$user_agent\033[0m" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case "$num" in - 0) - user_agent='' - ;; - 1) - user_agent='auto' - ;; - 2) - user_agent='none' - ;; - 3) - read -p "请输入自定义UA(不要包含空格和特殊符号!) > " text - [ -n "$text" ] && user_agent="$text" - ;; - *) - errornum - ;; - esac - [ "$num" -le 3 ] && setconfig user_agent "$user_agent" - ;; - *) - errornum - sleep 1 - break - ;; - esac - done -} diff --git a/scripts/menus/common.sh b/scripts/menus/common.sh new file mode 100644 index 00000000..b8f0986c --- /dev/null +++ b/scripts/menus/common.sh @@ -0,0 +1,44 @@ + +error_report() { + line_break + separator_line "=" + content_line "\033[31m$1\033[0m" + separator_line "=" + sleep 1 +} + +common_tittle() { + line_break + separator_line "=" + content_line "$1" + separator_line "-" +} + +common_back() { + content_line "0) $COMMON_BACK" + separator_line "=" +} + +errornum() { + error_report "\033[31m$COMMON_ERR_NUM\033[0m" +} + +error_letter() { + error_report "\033[31m$COMMON_ERR_LETTER\033[0m" +} + +error_input() { + error_report "\033[31m$COMMON_ERR_INPUT\033[0m" +} + +cancel_back() { + separator_line "-" + content_line "$COMMON_CANCEL" + sleep 1 +} + +common_success() { + separator_line "-" + content_line "\033[32m$COMMON_SUCCESS\033[0m" + sleep 1 +} diff --git a/scripts/menus/override.sh b/scripts/menus/override.sh new file mode 100644 index 00000000..ad950dc3 --- /dev/null +++ b/scripts/menus/override.sh @@ -0,0 +1,483 @@ +#!/bin/sh +# Copyright (C) Juewuy + +[ -n "$__IS_MODULE_OVERRIDE" ] && return +__IS_MODULE_OVERRIDE=1 + +# 配置文件覆写 +override() { + while true; do + [ -z "$rule_link" ] && rule_link=1 + [ -z "$server_link" ] && server_link=1 + echo "-----------------------------------------------" + echo -e "\033[30;47m 欢迎使用配置文件覆写功能!\033[0m" + echo "-----------------------------------------------" + echo -e " 1 自定义\033[32m端口及秘钥\033[0m" + echo -e " 2 管理\033[36m自定义规则\033[0m" + echo "$crashcore" | grep -q 'singbox' || { + echo -e " 3 管理\033[33m自定义节点\033[0m" + echo -e " 4 管理\033[36m自定义策略组\033[0m" + } + echo -e " 5 \033[32m自定义\033[0m高级功能" + [ "$disoverride" != 1 ] && echo -e " 9 \033[33m禁用\033[0m配置文件覆写" + echo "-----------------------------------------------" + [ "$inuserguide" = 1 ] || echo -e " 0 返回上级菜单" + read -p "请输入对应数字 > " num + case "$num" in + "" | 0) + break + ;; + 1) + if [ -n "$(pidof CrashCore)" ]; then + echo "-----------------------------------------------" + echo -e "\033[33m检测到服务正在运行,需要先停止服务!\033[0m" + read -p "是否停止服务?(1/0) > " res + if [ "$res" = "1" ]; then + "$CRASHDIR"/start.sh stop + setport + fi + else + setport + fi + ;; + 2) + setrules + ;; + 3) + setproxies + ;; + 4) + setgroups + ;; + 5) + echo "$crashcore" | grep -q 'singbox' && set_singbox_adv || set_clash_adv + sleep 3 + ;; + 9) + echo "-----------------------------------------------" + echo -e "\033[33m此功能可能会导致严重问题!启用后脚本中大部分功能都将禁用!!!\033[0m" + echo -e "如果你不是非常了解$crashcore的运行机制,切勿开启!\033[0m" + echo -e "\033[33m继续后如出现任何问题,请务必自行解决,一切提问恕不受理!\033[0m" + echo "-----------------------------------------------" + sleep 2 + read -p "我确认遇到问题可以自行解决[1/0] > " res + [ "$res" = '1' ] && { + disoverride=1 + setconfig disoverride $disoverride + echo "-----------------------------------------------" + echo -e "\033[32m设置成功!\033[0m" + } + ;; + *) + errornum + sleep 1 + break + ;; + esac + done +} + +setrules() { # 自定义规则 + + set_rule_type() { + echo "-----------------------------------------------" + echo -e "\033[33m请选择规则类型\033[0m" + echo "$rule_type" | awk -F ' ' '{for(i=1;i<=NF;i++){print i" "$i}}' + echo -e " 0 返回上级菜单" + read -p "请输入对应数字 > " num + case "$num" in + "" | 0) ;; + [0-9]*) + if [ "$num" -gt $(echo $rule_type | awk -F " " '{print NF}') ]; then + errornum + sleep 1 + else + rule_type_set=$(echo "$rule_type" | cut -d' ' -f"$num") + echo "-----------------------------------------------" + echo -e "\033[33m请输入规则语句,可以是域名、泛域名、IP网段或者其他匹配规则类型的内容\033[0m" + read -p "请输入对应规则 > " rule_state_set + if [ -n "$rule_state_set" ]; then + set_group_type + else + errornum + slepp 1 + fi + fi + ;; + *) + errornum + sleep 1 + ;; + esac + } + + set_group_type() { + echo "-----------------------------------------------" + echo -e "\033[36m请选择具体规则\033[0m" + echo -e "\033[33m此处规则读取自现有配置文件,如果你后续更换配置文件时运行出错,请尝试重新添加\033[0m" + echo "$rule_group" | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}' + echo -e " 0 返回上级菜单" + read -p "请输入对应数字 > " num + case "$num" in + "" | 0) ;; + [0-9]*) + if [ "$num" -gt "$(echo "$rule_group" | awk -F "#" '{print NF}')" ]; then + errornum + sleep 1 + else + rule_group_set=$(echo "$rule_group" | cut -d'#' -f"$num") + rule_all="- ${rule_type_set},${rule_state_set},${rule_group_set}" + echo "IP-CIDR SRC-IP-CIDR IP-CIDR6" | grep -q -- "$rule_type_set" && rule_all="${rule_all},no-resolve" + + echo "$rule_all" >>"$YAMLSDIR"/rules.yaml + echo "-----------------------------------------------" + echo -e "\033[32m添加成功!\033[0m" + fi + ;; + *) + errornum + sleep 1 + ;; + esac + } + + del_rule_type() { + while true; do + echo -e "输入对应数字即可移除相应规则:" + 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 + case "$num" in + "" | 0) + break + ;; + *) + if [ "$num" -le "$(wc -l <"$YAMLSDIR"/rules.yaml)" ]; then + sed -i "${num}d" "$YAMLSDIR"/rules.yaml + sleep 1 + else + errornum + sleep 1 + break + fi + ;; + esac + done + } + + get_rule_group() { + . "$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' + } + + while true; do + echo "-----------------------------------------------" + echo -e "\033[33m你可以在这里快捷管理自定义规则\033[0m" + echo -e "如需批量操作,请手动编辑:\033[36m $YAMLSDIR/rules.yaml\033[0m" + echo -e "\033[33msingbox和clash共用此处规则,可无缝切换!\033[0m" + echo -e "大量规则请尽量使用rule-set功能添加,\033[31m此处过量添加可能导致启动卡顿!\033[0m" + echo "-----------------------------------------------" + echo -e " 1 新增自定义规则" + echo -e " 2 移除自定义规则" + echo -e " 3 清空规则列表" + echo "$crashcore" | grep -q 'singbox' || echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m" + echo -e " 0 返回上级菜单" + read -p "请输入对应数字 > " num + case "$num" in + "" | 0) + break + ;; + 1) + rule_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN PROCESS-NAME" + rule_group="DIRECT#REJECT$(get_rule_group)" + set_rule_type + ;; + 2) + echo "-----------------------------------------------" + if [ -s "$YAMLSDIR"/rules.yaml ]; then + del_rule_type + else + echo -e "请先添加自定义规则!" + sleep 1 + fi + ;; + 3) + read -p "确认清空全部自定义规则?(1/0) > " res + [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/rules.yaml + ;; + 4) + echo "-----------------------------------------------" + if [ "$proxies_bypass" = "OFF" ]; then + echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" + echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" + read -p "启用节点绕过?(1/0) > " res + [ "$res" = "1" ] && proxies_bypass=ON + else + proxies_bypass=OFF + fi + setconfig proxies_bypass "$proxies_bypass" + sleep 1 + ;; + *) + errornum + sleep 1 + ;; + esac + done +} + +setgroups() { # 自定义clash策略组 + set_group_type() { + echo "-----------------------------------------------" + echo -e "\033[33m注意策略组名称必须和【自定义规则】或【自定义节点】功能中指定的策略组一致!\033[0m" + echo -e "\033[33m建议先创建策略组,之后可在【自定义规则】或【自定义节点】功能中智能指定\033[0m" + echo -e "\033[33m如需在当前策略组下添加节点,请手动编辑$YAMLSDIR/proxy-groups.yaml\033[0m" + read -r -p "请输入自定义策略组名称(不支持纯数字且不要包含特殊字符!) > " new_group_name + + echo "-----------------------------------------------" + echo -e "\033[32m请选择策略组【$new_group_name】的类型!\033[0m" + echo "$group_type_cn" | awk '{for(i=1;i<=NF;i++){print i" "$i}}' + read -r -p "请输入对应数字 > " num + new_group_type=$(echo "$group_type" | awk '{print $'"$num"'}') + if [ "$num" = "1" ]; then + unset new_group_url interval + else + read -r -p "请输入测速地址,回车则默认使用https://www.gstatic.com/generate_204 > " new_group_url + [ -z "$new_group_url" ] && new_group_url=https://www.gstatic.com/generate_204 + new_group_url="url: '$new_group_url'" + interval="interval: 300" + fi + set_group_add + # 添加自定义策略组 + cat >>"$YAMLSDIR"/proxy-groups.yaml < " char + case "$char" in + "" | 0) ;; + *) + for num in $char; do + rule_group_set=$(echo "$proxy_group" | cut -d'#' -f"$num") + rule_group_add="${rule_group_add}#${rule_group_set}" + done + if [ -n "$rule_group_add" ]; then + new_group_name="$new_group_name$rule_group_add" + unset rule_group_add + else + errornum + sleep 1 + fi + ;; + esac + } + + while true; do + echo "-----------------------------------------------" + echo -e "\033[33m你可以在这里快捷管理自定义策略组\033[0m" + echo -e "\033[36m如需修改或批量操作,请手动编辑:$YAMLSDIR/proxy-groups.yaml\033[0m" + echo "-----------------------------------------------" + echo -e " 1 添加自定义策略组" + echo -e " 2 查看自定义策略组" + echo -e " 3 清空自定义策略组" + echo -e " 0 返回上级菜单" + read -r -p "请输入对应数字 > " num + case "$num" in + "" | 0) + break + ;; + 1) + group_type="select url-test fallback load-balance" + group_type_cn="手动选择 自动选择 故障转移 负载均衡" + 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_group_type + ;; + 2) + echo "-----------------------------------------------" + cat "$YAMLSDIR"/proxy-groups.yaml + ;; + 3) + read -p "确认清空全部自定义策略组?(1/0) > " res + [ "$res" = "1" ] && echo '#用于添加自定义策略组' >"$YAMLSDIR"/proxy-groups.yaml + ;; + *) + errornum + sleep 1 + ;; + esac + done +} + +setproxies() { # 自定义clash节点 + set_proxy_type() { + echo "-----------------------------------------------" + echo -e "\033[33m注意节点格式必须是单行,不包括括号,name:必须写在最前,例如:\033[0m" + echo -e "\033[36m【name: \"test\", server: 192.168.1.1, port: 12345, type: socks5, udp: true】\033[0m" + echo -e "更多写法请参考:\033[32m https://juewuy.github.io/ \033[0m" + read -r -p "请输入节点 > " proxy_state_set + if echo "$proxy_state_set" | grep -q "#"; then + echo -e "\033[33m绝对禁止包含【#】号!!!\033[0m" + elif echo "$proxy_state_set" | grep -Eq "^name:"; then + set_group_add + else + errornum + sleep 1 + fi + } + + set_group_add() { + echo "-----------------------------------------------" + echo -e "\033[36m请选择想要将节点添加到的策略组\033[0m" + echo -e "\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m" + echo -e "\033[33m如需自定义策略组,请先使用【管理自定义策略组功能】添加\033[0m" + echo "-----------------------------------------------" + echo "$proxy_group" | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}' + echo "-----------------------------------------------" + echo -e " 0 返回上级菜单" + read -r -p "请输入对应数字(多个用空格隔开) > " char + case "$char" in + "" | 0) ;; + *) + for num in $char; do + rule_group_set=$(echo "$proxy_group" | cut -d'#' -f"$num") + 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 "-----------------------------------------------" + echo -e "\033[32m添加成功!\033[0m" + unset rule_group_add + else + errornum + sleep 1 + fi + ;; + esac + } + + while true; do + echo "-----------------------------------------------" + echo -e "\033[33m你可以在这里快捷管理自定义节点\033[0m" + echo -e "\033[36m如需批量操作,请手动编辑:$YAMLSDIR/proxies.yaml\033[0m" + echo "-----------------------------------------------" + echo -e " 1 添加自定义节点" + echo -e " 2 管理自定义节点" + echo -e " 3 清空自定义节点" + echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m" + echo -e " 0 返回上级菜单" + read -r -p "请输入对应数字 > " num + case "$num" in + "" | 0) + break + ;; + 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/#//')" + set_proxy_type + ;; + 2) + echo "-----------------------------------------------" + 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' + echo "-----------------------------------------------" + echo -e "\033[33m输入节点对应数字可以移除对应节点\033[0m" + read -r -p "请输入对应数字 > " num + if [ "$num" -le $(cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | wc -l) ]; then + sed -i "$num{/^\s*[^#]/d}" "$YAMLSDIR"/proxies.yaml + else + errornum + fi + else + echo -e "请先添加自定义节点!" + sleep 1 + fi + ;; + 3) + read -r -p "确认清空全部自定义节点?(1/0) > " res + [ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null + ;; + 4) + echo "-----------------------------------------------" + if [ "$proxies_bypass" = "OFF" ]; then + echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" + echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" + read -r -p "启用节点绕过?(1/0) > " res + [ "$res" = "1" ] && proxies_bypass=ON + else + proxies_bypass=OFF + fi + setconfig proxies_bypass "$proxies_bypass" + sleep 1 + setrules + break + ;; + *) + errornum + sleep 1 + ;; + esac + done +} + +set_clash_adv(){ #自定义clash高级规则 + [ ! -f "$YAMLSDIR"/user.yaml ] && cat > "$YAMLSDIR"/user.yaml < "$YAMLSDIR"/others.yaml <> $TMPDIR/providers/providers.yaml <> $TMPDIR/providers/providers.yaml < "$TMPDIR"/providers/providers.yaml + #切割模版文件 + sed -n '/^proxy-groups:/,/^[a-z]/ { /^rule/d; p; }' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/proxy-groups.yaml + sed -n '/^rule/,$p' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/rules.yaml + rm -rf "$TMPDIR"/provider_temp_file + #生成providers模块 + if [ -n "$2" ];then + gen_clash_providers_txt $1 $2 + providers_tags=$1 + echo ' - {name: '${1}', type: url-test, tolerance: 100, lazy: true, use: ['${1}']}' >> "$TMPDIR"/providers/proxy-groups.yaml + else + providers_tags='' + while read line;do + tag=$(echo $line | awk '{print $1}') + url=$(echo $line | awk '{print $2}') + providers_tags=$(echo "$providers_tags, $tag" | sed 's/^, //') + gen_clash_providers_txt $tag $url + echo ' - {name: '${tag}', type: url-test, tolerance: 100, lazy: true, use: ['${tag}']}' >> "$TMPDIR"/providers/proxy-groups.yaml + done < "$CRASHDIR"/configs/providers.cfg + fi + #修饰模版文件并合并 + sed -i "s/{providers_tags}/$providers_tags/g" "$TMPDIR"/providers/proxy-groups.yaml + cut -c 1- "$TMPDIR"/providers/providers.yaml "$TMPDIR"/providers/proxy-groups.yaml "$TMPDIR"/providers/rules.yaml > "$TMPDIR"/config.yaml + rm -rf "$TMPDIR"/providers + #调用内核测试 + . "$CRASHDIR"/starts/check_core.sh && check_core && "$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 && cronset '更新订阅' + exit + } + else + rm -rf "$TMPDIR"/CrashCore + rm -rf "$TMPDIR"/config.yaml + echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" + fi +} +gen_singbox_providers(){ #生成singbox的providers配置文件 + gen_singbox_providers_txt(){ + if [ -n "$(echo $2|grep -E '^./')" ];then + cat >> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json < "$TMPDIR"/providers/providers.json < "$TMPDIR"/providers/outbounds_add.json <> "$TMPDIR"/providers/outbounds_add.json + else + providers_tags='' + while read line;do + tag=$(echo $line | awk '{print $1}') + url=$(echo $line | awk '{print $2}') + providers_tags=$(echo "$providers_tags, \"$tag\"" | sed 's/^, //') + gen_singbox_providers_txt $tag $url + echo '{ "tag": "'${tag}'", "type": "urltest", "tolerance": 100, "providers": ["'${tag}'"], "include": ".*" },' >> "$TMPDIR"/providers/outbounds_add.json + done < "$CRASHDIR"/configs/providers.cfg + fi + #修复文件格式 + sed -i '$s/},/}]}/' "$TMPDIR"/providers/outbounds_add.json + sed -i '$s/},/}]}/' "$TMPDIR"/providers/providers.json + #使用模版生成outbounds和rules模块 + cat "$TMPDIR"/provider_temp_file | sed "s/{providers_tags}/$providers_tags/g" | sed "s/\"providers_tags\"/$providers_tags/g" > "$TMPDIR"/providers/outbounds.json + rm -rf "$TMPDIR"/provider_temp_file + #调用内核测试 + . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers + if [ "$?" = 0 ];then + echo -e "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m" + mkdir -p "$CRASHDIR"/jsons + mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json + rm -rf "$TMPDIR"/providers + read -p "是否立即启动/重启服务?(1/0) > " res + [ "$res" = 1 ] && { + start_core && cronset '更新订阅' + exit + } + else + echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" + rm -rf "$TMPDIR"/CrashCore + rm -rf "$TMPDIR"/providers + fi +} + +#providers +providers() { + . "$CRASHDIR"/libs/web_get_bin.sh + while true; do + # 获取模版名称 + 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}') + else + provider_temp_file=$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') + provider_temp_des=$(grep "$provider_temp_file" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}') + [ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file + fi + echo "-----------------------------------------------" + echo -e " 1 \033[32m生成\033[0m包含全部节点/订阅的配置文件" + echo -e " 2 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" + echo -e " 3 \033[33m清理\033[0mproviders目录文件" + echo "-----------------------------------------------" + echo -e " 0 返回上级菜单" + read -p "请输入对应字母或数字 > " num + case "$num" in + "" | 0) + break + ;; + 1) + echo "-----------------------------------------------" + if [ -s "$CRASHDIR"/configs/providers.cfg ]; then + echo -e "\033[33msingboxr与mihomo内核的providers配置文件不互通!\033[0m" + echo "-----------------------------------------------" + read -p "确认生成${coretype}配置文件?(1/0) > " res + [ "$res" = "1" ] && { + gen_${coretype}_providers + } + else + echo -e "\033[31m你还未添加链接或本地配置文件,请先添加!\033[0m" + sleep 1 + fi + ;; + 2) + echo "-----------------------------------------------" + echo -e "当前规则模版为:\033[32m$provider_temp_des\033[0m" + echo -e "\033[33m请选择在线模版:\033[0m" + echo "-----------------------------------------------" + cat "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print " "NR" "$1}' + echo "-----------------------------------------------" + echo -e " a 使用\033[36m本地模版\033[0m" + echo "-----------------------------------------------" + read -p "请输入对应字母或数字 > " num + case "$num" in + "" | 0) ;; + a) + read -p "请输入模版的路径(绝对路径) > " dir + if [ -s $dir ]; then + provider_temp_file=$dir + setconfig provider_temp_${coretype} $provider_temp_file + echo -e "\033[32m设置成功!\033[0m" + else + echo -e "\033[31m输入错误,找不到对应模版文件!\033[0m" + fi + sleep 1 + ;; + *) + provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/${coretype}_providers.list 2>/dev/null | awk '{print $2}') + if [ -z "$provider_temp_file" ]; then + errornum + sleep 1 + else + setconfig provider_temp_${coretype} $provider_temp_file + fi + ;; + esac + ;; + 3) + echo -e "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" + read -p "是否继续?(1/0) > " res + [ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers + ;; + *) + errornum + sleep 1 + break + ;; + esac + done +} diff --git a/scripts/menus/subconverter.sh b/scripts/menus/subconverter.sh new file mode 100644 index 00000000..ce2cbd3d --- /dev/null +++ b/scripts/menus/subconverter.sh @@ -0,0 +1,171 @@ +#!/bin/sh +# Copyright (C) Juewuy + +[ -n "$__IS_MODULE_SUBCONVERTER" ] && return +__IS_MODULE_SUBCONVERTER=1 + +[ -z "$rule_link" ] && rule_link=1 +[ -z "$server_link" ] && server_link=1 + +#Subconverter在线订阅转换 +subconverter() { + while true; do + separator_line "-" + content_line " 1 \033[36m开始生成配置文件\033[0m" + content_line " 2 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m" + content_line " 3 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m" + content_line " 4 选择\033[33m在线规则模版\033[0m" + content_line " 5 选择\033[0mSubconverter服务器\033[0m" + content_line " 6 自定义浏览器UA \033[32m$user_agent\033[0m" + common_back + read -r -p "请输入对应数字 > " num + case "$num" in + "" | 0) + break + ;; + 1) + providers_link=$(grep -v '^#' "$CRASHDIR"/configs/providers.cfg 2>/dev/null |awk '{print $2}' |paste -sd '|') + uri_link=$(grep -v '^#' "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null |awk -F '#' '{print $1}' |paste -sd '|') + Url=$(echo "$providers_link|$uri_link" |sed 's/^|// ; s/|$//') + setconfig Url "'$Url'" + setconfig Https + # 获取在线文件 + jump_core_config + ;; + 2) + gen_link_flt + ;; + 3) + gen_link_ele + ;; + 4) + gen_link_config + ;; + 5) + gen_link_server + ;; + 6) + set_sub_ua + ;; + *) + errornum + break + ;; + esac + done +} + +gen_link_flt() { # 排除节点正则 + [ -z "$exclude" ] && exclude="未设置" + separator_line "-" + content_line "\033[33m当前过滤关键字:\033[47;30m$exclude\033[0m" + separator_line "-" + content_line "\033[33m匹配关键字的节点会在导入时被【屏蔽】!!!\033[0m" + content_line "多个关键字可以用\033[30;47m | \033[0m号分隔" + content_line "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代" + separator_line "-" + content_line " 000 \033[31m删除\033[0m关键字" + content_line " 回车 取消输入并返回上级菜单" + separator_line "-" + read -r -p "请输入关键字 > " exclude + if [ "$exclude" = '000' ]; then + separator_line "-" + exclude='' + content_line "\033[31m 已删除节点过滤关键字!!!\033[0m" + fi + setconfig exclude "'$exclude'" +} + +gen_link_ele() { # 包含节点正则 + [ -z "$include" ] && include="未设置" + separator_line "-" + content_line "\033[33m当前筛选关键字:\033[47;30m$include\033[0m" + separator_line "-" + content_line "\033[33m仅有匹配关键字的节点才会被【导入】!!!\033[0m" + content_line "多个关键字可以用\033[30;47m | \033[0m号分隔" + content_line "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代" + separator_line "-" + content_line " 000 \033[31m删除\033[0m关键字" + content_line " 回车 取消输入并返回上级菜单" + separator_line "-" + read -r -p "请输入关键字 > " include + if [ "$include" = '000' ]; then + separator_line "-" + include='' + content_line "\033[31m 已删除节点匹配关键字!!!\033[0m" + fi + setconfig include "'$include'" +} + +gen_link_config() { #选择在线规则模版 + separator_line "-" + echo 当前使用规则为:$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}') + grep -aE '^5' "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$2$4}' + separator_line "-" + echo 0 返回上级菜单 + read -r -p "请输入对应数字 > " num + totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list ) + if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then + errornum + elif [ "$num" = 0 ];then + echo + elif [ "$num" -le "$totalnum" ];then + #将对应标记值写入配置 + rule_link=$num + setconfig rule_link $rule_link + separator_line "-" + content_line "\033[32m设置成功!返回上级菜单\033[0m" + fi +} + +gen_link_server() { #选择Subconverter服务器 + separator_line "-" + content_line "\033[36m以下为互联网采集的第三方服务器,具体安全性请自行斟酌!\033[0m" + content_line "\033[32m感谢以下作者的无私奉献!!!\033[0m" + echo 当前使用后端为:$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}') + grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$3" "$2}' + separator_line "-" + echo 0 返回上级菜单 + read -r -p "请输入对应数字 > " num + totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list ) + if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then + errornum + elif [ "$num" = 0 ];then + echo + elif [ "$num" -le "$totalnum" ];then + #将对应标记值写入配置 + server_link=$num + setconfig server_link $server_link + separator_line "-" + content_line "\033[32m设置成功!返回上级菜单\033[0m" + fi +} + +set_sub_ua() { + separator_line "-" + content_line "\033[36m无法正确获取配置文件时可尝试使用\033[0m" + content_line " 1 使用自动UA(默认)" + content_line " 2 不使用UA" + content_line " 3 使用自定义UA:\033[32m$user_agent\033[0m" + separator_line "-" + read -r -p "请输入对应数字 > " num + case "$num" in + 0) + user_agent='' + ;; + 1) + user_agent='auto' + ;; + 2) + user_agent='none' + ;; + 3) + read -r -p "请输入自定义UA(不要包含空格和特殊符号!) > " text + [ -n "$text" ] && user_agent="$text" + ;; + *) + errornum + ;; + esac + [ "$num" -le 3 ] && setconfig user_agent "$user_agent" +} diff --git a/scripts/starts/core_config.sh b/scripts/starts/core_config.sh index de1bd553..5ed30281 100644 --- a/scripts/starts/core_config.sh +++ b/scripts/starts/core_config.sh @@ -6,6 +6,7 @@ . "$CRASHDIR"/libs/web_get_bin.sh . "$CRASHDIR"/libs/compare.sh . "$CRASHDIR"/libs/set_config.sh +. "$CRASHDIR"/libs/logger.sh update_servers() { #更新servers.list get_bin "$TMPDIR"/servers.list public/servers.list @@ -44,7 +45,7 @@ get_core_config() { #下载内核配置文件 fi #输出 echo "-----------------------------------------------" - logger "正在连接服务器获取【$target】配置文件…………" + logger "正在连接服务器获取【$target】配置文件…………" 36 echo -e "链接地址为:\033[4;32m$Https\033[0m" echo 可以手动复制该链接到浏览器打开并查看数据是否正常! #获取在线config文件 diff --git a/version b/version index faea0a17..f31f81e5 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.9.5alpha3 +1.9.5alpha4