Merge branch 'juewuy:dev' into patch-4

This commit is contained in:
Sofia
2026-01-15 02:53:11 +08:00
committed by GitHub
28 changed files with 1478 additions and 1067 deletions

View File

@@ -3,49 +3,65 @@
[ -n "$__IS_MODULE_1_START_LOADED" ] && return
__IS_MODULE_1_START_LOADED=1
load_lang 1_start
#启动相关
# ===== 启动完成提示 =====
startover() {
echo -ne " \r"
echo -e "\033[32m服务已启动!\033[0m"
echo -e "请使用 \033[4;36mhttp://$host$hostdir\033[0m 管理内置规则"
echo -e "\033[32m$START_SERVICE_OK\033[0m"
echo -e "$START_WEB_HINT \033[4;36mhttp://$host$hostdir\033[0m $START_WEB_HINT2"
if [ "$redir_mod" = "纯净模式" ]; then
echo "-----------------------------------------------"
echo -e "其他设备可以使用PAC配置连接\033[4;32mhttp://$host:$db_port/ui/pac\033[0m"
echo -e "或者使用HTTP/SOCK5方式连接IP{\033[36m$host\033[0m}Port{\033[36m$mix_port\033[0m}"
echo -e "$START_PAC_HINT \033[4;32mhttp://$host:$db_port/ui/pac\033[0m"
echo -e "$START_PROXY_HINT IP{\033[36m$host\033[0m} Port{\033[36m$mix_port\033[0m}"
fi
return 0
}
# ===== 启动核心 =====
start_core() {
if echo "$crashcore" | grep -q 'singbox'; then
core_config="$CRASHDIR"/jsons/config.json
core_config="$CRASHDIR/jsons/config.json"
else
core_config="$CRASHDIR"/yamls/config.yaml
core_config="$CRASHDIR/yamls/config.yaml"
fi
echo "-----------------------------------------------"
if [ ! -s $core_config -a -s "$CRASHDIR"/configs/providers.cfg ]; then
echo -e "\033[33m没有找到${crashcore}配置文件尝试生成providers配置文件\033[0m"
if [ ! -s "$core_config" ] && [ -s "$CRASHDIR/configs/providers.cfg" ]; then
echo -e "\033[33m$START_NO_CORE_CFG_TRY_GEN\033[0m"
[ "$crashcore" = singboxr ] && coretype=singbox
[ "$crashcore" = meta -o "$crashcore" = clashpre ] && coretype=clash
. "$CRASHDIR"/menus/6_core_config.sh && gen_${coretype}_providers
elif [ -s $core_config -o -n "$Url" -o -n "$Https" ]; then
"$CRASHDIR"/start.sh start
#设置循环检测以判定服务启动是否成功
. "$CRASHDIR"/libs/start_wait.sh
[ -n "$test" -o -n "$(pidof CrashCore)" ] && {
#启动TG机器人
[ "$bot_tg_service" = ON ] && . "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_start
startover
}
. "$CRASHDIR/menus/6_core_config.sh" && gen_${coretype}_providers
elif [ -s "$core_config" ] || [ -n "$Url" ] || [ -n "$Https" ]; then
"$CRASHDIR/start.sh" start
# 循环检测服务启动状态
. "$CRASHDIR/libs/start_wait.sh"
[ -n "$test" ] || pidof CrashCore >/dev/null && {
# 启动 TG 机器人
if [ "$bot_tg_service" = ON ]; then
. "$CRASHDIR/menus/bot_tg_service.sh" && bot_tg_start
fi
startover
}
else
echo -e "\033[31m没有找到${crashcore}配置文件,请先导入配置文件!\033[0m"
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
echo -e "\033[31m$START_NO_CORE_CFG_IMPORT_FIRST\033[0m"
. "$CRASHDIR/menus/6_core_config.sh" && set_core_config
fi
}
# ===== 启动服务入口 =====
start_service() {
if [ "$firewall_area" = 5 ]; then
"$CRASHDIR"/start.sh start
echo -e "\033[32m已完成防火墙设置!\033[0m"
"$CRASHDIR/start.sh" start
echo -e "\033[32m$START_FIREWALL_DONE\033[0m"
else
start_core
fi

View File

@@ -372,13 +372,13 @@ EOF
}
}
if [ -z "$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg)" ];then
provider_temp_file="$TMPDIR/$(sed -n "1 p" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $2}')"
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
if [ -s "$TMPDIR/$provider_temp_file" ];then
ln -sf "$TMPDIR/$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"
@@ -416,7 +416,7 @@ 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_tools.sh && core_find && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml
. "$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
@@ -518,7 +518,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_tools.sh && core_find && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers
. "$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
@@ -988,205 +988,206 @@ gen_core_config_link(){ #在线生成工具
fi
done
}
set_core_config_link(){ #直接导入配置
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
else
set_core_config_link
fi
elif [ "$link" = 0 ];then
i=
else
echo "-----------------------------------------------"
echo -e "\033[31m请输入正确的配置文件链接地址\033[0m"
echo -e "\033[33m仅支持http、https、ftp以及ftps链接\033[0m"
sleep 1
set_core_config_link
fi
# 直接导入配置
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(){
[ -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)
;;
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
set_core_config
;;
2)
if [ -f "$CRASHDIR"/v2b_api.sh ];then
. "$CRASHDIR"/v2b_api.sh
set_core_config
else
set_core_config_link
fi
set_core_config
;;
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
set_core_config
;;
4)
echo "-----------------------------------------------"
echo -e "\033[33m请将本地配置文件上传到/tmp目录并重命名为config.yaml或者config.json\033[0m"
echo -e "\033[32m之后重新运行本脚本即可自动弹出导入提示\033[0m"
exit
;;
5)
. "$CRASHDIR"/menus/5_task.sh && task_menu
set_core_config
;;
6)
checkcfg=$(cat $CFG_PATH)
override
if [ -n "$PID" ];then
checkcfg_new=$(cat $CFG_PATH)
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi
set_core_config
;;
7)
if [ -z "$Url" -a -z "$Https" ];then
echo "-----------------------------------------------"
echo -e "\033[31m没有找到你的配置文件/订阅链接!请先输入链接!\033[0m"
sleep 1
set_core_config
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
else
set_core_config
fi
fi
;;
8)
if [ ! -f ${config_path}.bak ];then
echo "-----------------------------------------------"
echo -e "\033[31m没有找到配置文件的备份\033[0m"
set_core_config
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
else
echo "-----------------------------------------------"
echo -e "\033[31m操作已取消返回上级菜单\033[0m"
set_core_config
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"
set_core_config
;;
*)
errornum
;;
esac
# 配置文件主界面
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
}

File diff suppressed because it is too large Load Diff

View File

@@ -181,8 +181,9 @@ set_common_ports() {
}
set_cust_host_ipv4() { #自定义ipv4透明路由网段
[ -z "$replace_default_host_ipv4" ] && replace_default_host_ipv4="OFF"
. "$CRASHDIR"/starts/fw_getlanip.sh && getlanip
echo "-----------------------------------------------"
echo -e "当前默认透明路由的网段为: \033[32m$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'br' | grep -v 'iot' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/br.*$//g' | sed 's/metric.*$//g' | tr '\n' ' ' && echo) \033[0m"
echo -e "当前默认透明路由的网段为: \033[32m$host_ipv4 \033[0m"
echo -e "当前已添加的自定义网段为:\033[36m$cust_host_ipv4\033[0m"
echo "-----------------------------------------------"
echo -e " 1 移除所有自定义网段"