mirror of
https://github.com/juewuy/ShellCrash.git
synced 2026-04-25 20:10:42 +00:00
Compare commits
38 Commits
837f99727a
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e10113665 | ||
|
|
aa21581057 | ||
|
|
04503ab921 | ||
|
|
13ed653c2e | ||
|
|
8e5ac1dce5 | ||
|
|
309b77ac35 | ||
|
|
0f712fd69f | ||
|
|
accc20ff7c | ||
|
|
85733ebf9d | ||
|
|
438611f27a | ||
|
|
791b83ab85 | ||
|
|
75b3baa5d9 | ||
|
|
950432aebc | ||
|
|
8e95c6a292 | ||
|
|
b9c50e825d | ||
|
|
bcb3d9cabd | ||
|
|
49c509d6ef | ||
|
|
47c7331623 | ||
|
|
987ef6ab22 | ||
|
|
2218161e8f | ||
|
|
74b304be6f | ||
|
|
a968551912 | ||
|
|
13fc116985 | ||
|
|
2e7d615f8a | ||
|
|
6b6740a725 | ||
|
|
5e7a46c378 | ||
|
|
c304ec8271 | ||
|
|
cff3479213 | ||
|
|
5b94bce400 | ||
|
|
08e785dc2d | ||
|
|
feb8ff9f80 | ||
|
|
2d5df04dd4 | ||
|
|
b4a9702c82 | ||
|
|
ee2fd53675 | ||
|
|
39084ffd1e | ||
|
|
200d1729fb | ||
|
|
687e72a53f | ||
|
|
8d51f0aab6 |
13
.editorconfig
Normal file
13
.editorconfig
Normal file
@@ -0,0 +1,13 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
|
||||
[*.sh]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
shell_variant = posix
|
||||
simplify = true
|
||||
switch_case_indent = true
|
||||
|
||||
10
.github/workflows/bin_update.yml
vendored
10
.github/workflows/bin_update.yml
vendored
@@ -17,6 +17,10 @@ jobs:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false # 禁用默认凭据(我们用 token push)
|
||||
|
||||
- name: Fetch master and dev refs
|
||||
run: |
|
||||
git fetch origin master dev
|
||||
|
||||
- name: Apt Update & Update CA
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
@@ -136,6 +140,12 @@ jobs:
|
||||
sed -i "s/GeoIP_v=.*/GeoIP_v=$(date '+%Y%m%d')/" version
|
||||
echo 数据库及根证书文件更新完成!
|
||||
|
||||
- name: Sync master/dev files into update branch
|
||||
run: |
|
||||
# 只同步文件内容,不带任何 git 状态
|
||||
git archive --format=tar origin/master ShellCrash.tar.gz version | tar -x -C .
|
||||
git archive --format=tar origin/dev install.sh install_en.sh public rules | tar -x -C .
|
||||
|
||||
- name: Rebuild update branch with no history
|
||||
run: |
|
||||
# 彻底删除历史记录
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
meta_v=v1.19.17
|
||||
singboxr_v=1.13.0-alpha.27
|
||||
versionsh=1.9.5alpha12
|
||||
versionsh=1.9.5alpha14
|
||||
GeoIP_v=20251205
|
||||
|
||||
@@ -22,8 +22,10 @@ grep -qE '/(docker|lxc|kubepods|crio|containerd)/' /proc/1/cgroup 2>/dev/null ||
|
||||
[ "$systype" = 'container' ] && CRASHDIR='/etc/ShellCrash'
|
||||
[ -z "$CRASHDIR" ] && [ -n "$clashdir" ] && CRASHDIR="$clashdir"
|
||||
[ -z "$CRASHDIR" ] && [ -d /tmp/SC_tmp ] && . /tmp/SC_tmp/menus/set_crashdir.sh && set_crashdir
|
||||
TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
#移动文件
|
||||
mkdir -p "$CRASHDIR"
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
rm -rf /tmp/SC_tmp/menus/set_crashdir.sh
|
||||
mv -f /tmp/SC_tmp/* "$CRASHDIR" 2>/dev/null
|
||||
##############################
|
||||
@@ -190,6 +192,15 @@ done
|
||||
for file in fake_ip_filter mac web_save servers_chs.list servers_en.list fake_ip_filter.list singbox_providers.list clash_providers.list; do
|
||||
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/configs/"$file" 2>/dev/null
|
||||
done
|
||||
#迁移任务状态文件到新目录
|
||||
for file in cron bfstart afstart running affirewall task.user; do
|
||||
mv -f "$CRASHDIR"/"$file" "$TASKCFGDIR"/"$file" 2>/dev/null
|
||||
mv -f "$CRASHDIR"/task/"$file" "$TASKCFGDIR"/"$file" 2>/dev/null
|
||||
done
|
||||
#修正旧版防火墙注入路径
|
||||
for file in /etc/init.d/firewall /etc/init.d/firewall.bak; do
|
||||
[ -f "$file" ] && sed -i "s#$CRASHDIR/task/affirewall#$TASKCFGDIR/affirewall#g" "$file" 2>/dev/null
|
||||
done
|
||||
#配置文件改名
|
||||
mv -f "$CRASHDIR"/configs/ShellClash.cfg "$CFG_PATH" 2>/dev/null
|
||||
#数据库改名
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
SET_MENU_TITLE="功能设置菜单"
|
||||
SET_MENU_REDIR="路由模式设置:"
|
||||
SET_MENU_DNS="DNS设置: "
|
||||
SET_MENU_FW_FILTER="透明路由流量过滤"
|
||||
SET_MENU_FW_FILTER="透明路由流量过滤:"
|
||||
SET_MENU_FW_FILTER_DESC="端口、设备、协议或列表"
|
||||
SET_MENU_SKIP_CERT="跳过证书验证:"
|
||||
SET_MENU_SNIFFER="启用域名嗅探:"
|
||||
SET_MENU_ADV_PORT="自定义端口及密钥"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
GW_TITLE="访问与控制菜单"
|
||||
GW_TITLE="访问与控制菜单"
|
||||
GW_WARN="注意:"
|
||||
GW_FW_VPS_HINT="如在vps运行,还需在vps安全策略对相关端口同时放行"
|
||||
GW_FW_PORT_LIMIT="最多支持设置放行10个端口,请先减少一些!"
|
||||
|
||||
@@ -11,9 +11,11 @@ TOOLS_ENABLE="启用"
|
||||
TOOLS_CONFIGURED="已配置"
|
||||
TOOLS_SSH_ONLY_OPENWRT="此功能仅针对使用Openwrt系统的设备生效,且不依赖服务"
|
||||
TOOLS_SSH_UNSUPPORTED_SYSTEM="本功能不支持红米AX6S等镜像化系统设备,请勿尝试!"
|
||||
TOOLS_SSH_PORT_ITEM="1) \033[32m修改\033[0m外网访问端口:\033[36m$ssh_port\033[0m"
|
||||
TOOLS_SSH_PORT_ITEM_PREFIX="1) \033[32m修改\033[0m外网访问端口:"
|
||||
TOOLS_SSH_PORT_ITEM_SUFFIX=""
|
||||
TOOLS_SSH_PASS_ITEM="2) \033[32m修改\033[0mSSH访问密码(请连续输入2次后回车)"
|
||||
TOOLS_SSH_TOGGLE_ITEM="3) \033[33m$ssh_ol\033[0m外网访问SSH"
|
||||
TOOLS_SSH_TOGGLE_ITEM_PREFIX="3) "
|
||||
TOOLS_SSH_TOGGLE_ITEM_SUFFIX="外网访问SSH"
|
||||
TOOLS_PROMPT_PORT="请输入端口号(1000-65535)> "
|
||||
TOOLS_WARN_COMPAT="本页工具可能无法兼容全部Linux设备,请酌情使用!"
|
||||
TOOLS_DISK_USAGE="磁盘占用/所在目录:"
|
||||
@@ -21,10 +23,14 @@ TOOLS_MENU_TEST_ITEM="1) ShellCrash\033[33m测试菜单\033[0m"
|
||||
TOOLS_MENU_GUIDE_ITEM="2) ShellCrash\033[32m新手引导\033[0m"
|
||||
TOOLS_MENU_LOG_ITEM="3) \033[36m日志及推送工具\033[0m"
|
||||
TOOLS_MENU_SSH_ITEM="4) \033[32m配置\033[0m外网访问SSH"
|
||||
TOOLS_MENU_MI_UPDATE_ITEM="5) \033[33m$mi_update\033[0m小米系统自动更新"
|
||||
TOOLS_MENU_MI_AUTO_SSH_ITEM="6) 小米设备软固化SSH —— \033[$mi_mi_autoSSH_type \033[0m"
|
||||
TOOLS_MENU_MI_TUN_FIX_ITEM="8) 小米设备Tun模块修复 —— \033[$mi_tunfix \033[0m"
|
||||
TOOLS_MI_UPDATE_MSG="已\033[33m$mi_update\033[0m小米路由器的自动更新,如未生效,请在官方APP中同步设置!"
|
||||
TOOLS_MENU_MI_UPDATE_ITEM_PREFIX="5) "
|
||||
TOOLS_MENU_MI_UPDATE_ITEM_SUFFIX="小米系统自动更新"
|
||||
TOOLS_MENU_MI_AUTO_SSH_ITEM_PREFIX="6) 小米设备软固化SSH —— "
|
||||
TOOLS_MENU_MI_AUTO_SSH_ITEM_SUFFIX=""
|
||||
TOOLS_MENU_MI_TUN_FIX_ITEM_PREFIX="8) 小米设备Tun模块修复 —— "
|
||||
TOOLS_MENU_MI_TUN_FIX_ITEM_SUFFIX=""
|
||||
TOOLS_MI_UPDATE_MSG_PREFIX="已"
|
||||
TOOLS_MI_UPDATE_MSG_SUFFIX="小米路由器的自动更新,如未生效,请在官方APP中同步设置!"
|
||||
TOOLS_UNSUPPORTED_DEVICE="不支持的设备!"
|
||||
TOOLS_FETCHING_SCRIPT="正在获取在线脚本......"
|
||||
TOOLS_DOWNLOAD_FAIL="文件下载失败!"
|
||||
@@ -46,16 +52,25 @@ TOOLS_AUTO_SSH_WARN2="如有问题请加群反馈:"
|
||||
TOOLS_AUTO_SSH_PWD_HINT1="请输入需要还原的SSH密码(不影响当前密码)"
|
||||
TOOLS_AUTO_SSH_PWD_HINT2="(回车可跳过)"
|
||||
TOOLS_AUTO_SSH_INPUT="请输入> "
|
||||
TOOLS_LOG_TG="1) Telegram推送\t——\033[$stat_TG\033[0m"
|
||||
TOOLS_LOG_DEER="2) PushDeer推送\t——\033[$stat_Deer\033[0m"
|
||||
TOOLS_LOG_BARK="3) Bark推送-IOS\t——\033[$stat_bark\033[0m"
|
||||
TOOLS_LOG_PO="4) Passover推送\t——\033[$stat_Po\033[0m"
|
||||
TOOLS_LOG_PP="5) PushPlus推送\t——\033[$stat_PP\033[0m"
|
||||
TOOLS_LOG_SYNO="6) SynoChat推送\t——\033[$stat_SynoChat\033[0m"
|
||||
TOOLS_LOG_GOTIFY="7) Gotify推送\t ——\033[$stat_Gotify\033[0m"
|
||||
TOOLS_LOG_TG_PREFIX="1) Telegram推送\t——"
|
||||
TOOLS_LOG_TG_SUFFIX=""
|
||||
TOOLS_LOG_DEER_PREFIX="2) PushDeer推送\t——"
|
||||
TOOLS_LOG_DEER_SUFFIX=""
|
||||
TOOLS_LOG_BARK_PREFIX="3) Bark推送-IOS\t——"
|
||||
TOOLS_LOG_BARK_SUFFIX=""
|
||||
TOOLS_LOG_PO_PREFIX="4) Passover推送\t——"
|
||||
TOOLS_LOG_PO_SUFFIX=""
|
||||
TOOLS_LOG_PP_PREFIX="5) PushPlus推送\t——"
|
||||
TOOLS_LOG_PP_SUFFIX=""
|
||||
TOOLS_LOG_SYNO_PREFIX="6) SynoChat推送\t——"
|
||||
TOOLS_LOG_SYNO_SUFFIX=""
|
||||
TOOLS_LOG_GOTIFY_PREFIX="7) Gotify推送\t ——"
|
||||
TOOLS_LOG_GOTIFY_SUFFIX=""
|
||||
TOOLS_LOG_VIEW="a) 查看\033[36m运行日志\033[0m"
|
||||
TOOLS_LOG_TASK="b) 推送任务日志\t——\033[$stat_task\033[0m"
|
||||
TOOLS_LOG_DEVICE="c) 设置设备名称\t——\033[$device_s\033[0m"
|
||||
TOOLS_LOG_TASK_PREFIX="b) 推送任务日志\t——"
|
||||
TOOLS_LOG_TASK_SUFFIX=""
|
||||
TOOLS_LOG_DEVICE_PREFIX="c) 设置设备名称\t——"
|
||||
TOOLS_LOG_DEVICE_SUFFIX=""
|
||||
TOOLS_LOG_CLEAR="d) 清空日志文件"
|
||||
TOOLS_CONFIRM_CLOSE_TG="是否确认关闭TG日志推送?"
|
||||
TOOLS_CONFIRM_CLOSE_DEER="是否确认关闭PushDeer日志推送?"
|
||||
@@ -120,17 +135,22 @@ TOOLS_PROXY_NOTE="注意:依赖curl(不支持wget),且测试结果不保
|
||||
TOOLS_PROXY_OK="连接成功!响应时间为:"
|
||||
TOOLS_PROXY_TIMEOUT="连接超时!请重试或检查节点配置!"
|
||||
TOOLS_DEBUG_WARN1="注意:Debug运行均会停止原本的内核服务"
|
||||
TOOLS_DEBUG_WARN2="后台运行日志地址:\033[32m$TMPDIR/debug.log\033[0m"
|
||||
TOOLS_DEBUG_WARN2_PREFIX="后台运行日志地址:"
|
||||
TOOLS_DEBUG_WARN2_SUFFIX=""
|
||||
TOOLS_DEBUG_WARN3="如长时间运行后台监测,日志等级推荐error!防止文件过大!"
|
||||
TOOLS_DEBUG_WARN4="你亦可通过:\033[33mcrash -s debug 'warning'\033[0m命令使用其他日志等级"
|
||||
TOOLS_DEBUG_ITEM_1="1) 仅测试\033[32m$config_tmp\033[0m配置文件可用性"
|
||||
TOOLS_DEBUG_ITEM_2="2) 前台运行\033[32m$config_tmp\033[0m配置文件,不配置防火墙劫持(\033[33m使用Ctrl+C手动停止\033[0m)"
|
||||
TOOLS_DEBUG_ITEM_1_PREFIX="1) 仅测试"
|
||||
TOOLS_DEBUG_ITEM_1_SUFFIX="配置文件可用性"
|
||||
TOOLS_DEBUG_ITEM_2_PREFIX="2) 前台运行"
|
||||
TOOLS_DEBUG_ITEM_2_SUFFIX="配置文件,不配置防火墙劫持(使用Ctrl+C手动停止)"
|
||||
TOOLS_DEBUG_ITEM_3="3) 后台运行完整启动流程并配置防火墙劫持,日志等级:\033[31merror\033[0m"
|
||||
TOOLS_DEBUG_ITEM_4="4) 后台运行完整启动流程并配置防火墙劫持,日志等级:\033[32minfo\033[0m"
|
||||
TOOLS_DEBUG_ITEM_5="5) 后台运行完整启动流程并配置防火墙劫持,日志等级:\033[33mdebug\033[0m"
|
||||
TOOLS_DEBUG_ITEM_6="6) 后台运行完整启动流程并配置防火墙劫持,且将错误日志打印到闪存:\033[32m$CRASHDIR/debug.log\033[0m"
|
||||
TOOLS_DEBUG_ITEM_6_PREFIX="6) 后台运行完整启动流程并配置防火墙劫持,且将错误日志打印到闪存:"
|
||||
TOOLS_DEBUG_ITEM_6_SUFFIX=""
|
||||
TOOLS_DEBUG_ITEM_8="8) 后台运行完整启动流程,输出执行错误并查找上下文,之后关闭进程"
|
||||
TOOLS_DEBUG_ITEM_9="9) 将\033[32m$config_tmp\033[0m下json文件合并为$TMPDIR/debug.json"
|
||||
TOOLS_DEBUG_ITEM_9_PREFIX="9) 将"
|
||||
TOOLS_DEBUG_ITEM_9_SUFFIX="下json文件合并为"
|
||||
TOOLS_FLASH_WARN="频繁写入闪存会导致闪存寿命降低,如非遇到会导致设备死机或重启的bug,请勿使用此功能!"
|
||||
TOOLS_FLASH_CONFIRM="是否确认启用此功能?"
|
||||
TOOLS_MERGE_OK="合并成功!"
|
||||
|
||||
@@ -52,11 +52,6 @@ UPG_PAC_GUIDE_TEXT="PAC的使用教程请参考:"
|
||||
UPG_THANKS_PROJECTS="感谢以下项目及其开发者们的无私奉献!"
|
||||
UPG_THANKS_SPECIAL_TEXT="特别感谢:\033[36m所有帮助及赞助过此项目的同仁们!\033[0m"
|
||||
UPG_GETTING_UPDATE="正在检查更新......"
|
||||
UPG_GET_OK="检查更新成功"
|
||||
UPG_GET_FAIL="检查更新失败!请尝试切换其他安装源!"
|
||||
UPG_EXTRACT_START="开始解压文件......"
|
||||
UPG_SCRIPT_UPDATE_OK="脚本更新成功!"
|
||||
UPG_SCRIPT_UPDATE_PROMPT="注意:更新时会停止服务!"
|
||||
UPG_SCRIPT_CUR_VER_TEXT="当前脚本版本为:"
|
||||
UPG_SCRIPT_NEW_VER_TEXT="最新脚本版本为:"
|
||||
UPG_UPDATE_NOW_TEXT="立即更新"
|
||||
@@ -68,8 +63,10 @@ UPG_CORETYPE_CONFIRM_TEXT="请确认该自定义内核的类型:"
|
||||
UPG_CORE_SWITCH_KEEP_TEXT="是否保留相关数据库文件?"
|
||||
UPG_KEEP_TEXT="保留"
|
||||
UPG_NOT_KEEP_TEXT="不保留"
|
||||
UPG_GETTING_CORE_TEXT="正在在线获取$crashcore核心文件......"
|
||||
UPG_CORE_DOWNLOAD_OK_TEXT="$crashcore核心下载成功!"
|
||||
UPG_GETTING_CORE_TEXT_PREFIX="正在在线获取"
|
||||
UPG_GETTING_CORE_TEXT_SUFFIX="核心文件......"
|
||||
UPG_CORE_DOWNLOAD_OK_TEXT_PREFIX=""
|
||||
UPG_CORE_DOWNLOAD_OK_TEXT_SUFFIX="核心下载成功!"
|
||||
UPG_CORE_DOWNLOAD_FAIL_TEXT="核心文件下载失败!"
|
||||
UPG_CORE_DOWNLOAD_VERIFY_FAIL_TEXT="核心文件下载成功但校验失败"
|
||||
UPG_CORE_DOWNLOAD_VERIFY_HINT_TEXT="请尝试手动指定CPU版本"
|
||||
@@ -86,9 +83,13 @@ UPG_CUSTOM_CORE_TASK_WARN="自定义内核已适配定时任务,但不支持
|
||||
UPG_CUSTOM_CORE_NET_WARN="如遇到网络错误请先启动ShellCrash服务!"
|
||||
UPG_CUSTOM_CORE_CURRENT="当前内核为:"
|
||||
UPG_CUSTOM_CORE_SELECT="请选择需要使用的核心:"
|
||||
UPG_CUSTOM_CORE_MENU_OFFICIAL="版本官方内核"
|
||||
UPG_CUSTOM_CORE_MENU_ALPHA="版本内核(支持Smart策略)"
|
||||
UPG_CUSTOM_CORE_MENU_MULTI="多版本内核"
|
||||
UPG_CUSTOM_CORE_LINK_HINT="请输入自定义内核的链接地址"
|
||||
UPG_CUSTOM_CORE_LINK_HINT2="(必须是以.tar.gz、.upx或.gz结尾的压缩文件)"
|
||||
UPG_CUSTOM_CORE_LINK_HINT3="或者输入 0 返回上级菜单"
|
||||
UPG_CUSTOM_CORE_LINK_MENU="使用自定义内核链接"
|
||||
UPG_ZIPTYPE_TITLE="请选择内核分支及压缩方式:"
|
||||
UPG_ZIPTYPE_1="1) \033[36m最简编译release版本,upx压缩\033[0m"
|
||||
UPG_ZIPTYPE_1_HINT="不支持Gvisor、Tailscale、Wireguard、NaiveProxy"
|
||||
@@ -100,18 +101,23 @@ UPG_CORE_MENU_CURRENT="当前内核:"
|
||||
UPG_CORE_MENU_SYS="当前系统处理器架构:"
|
||||
UPG_CORE_MENU_LOCAL_HINT="如需本地上传,请将.upx .gz .tar.gz文件上传至 /tmp 目录后重新运行crash命令"
|
||||
UPG_CORE_MENU_SELECT="请选择需要使用的核心版本:"
|
||||
UPG_CORE_MENU_1="1) \033[43;30mMihomo\033[0m:\033[32m$meta_v \033[32m(原meta内核)支持全面\033[0m \033[33m占用略高\033[0m"
|
||||
UPG_CORE_MENU_2="2) \033[43;30mSingBoxR\033[0m:\033[32m$singboxr_v \033[32m支持全面\033[0m \033[33m使用reF1nd增强分支\033[0m"
|
||||
UPG_CORE_MENU_3="3) \033[43;30mSingBox\033[0m:\033[32m$singbox_v \033[32m占用较低\033[0m \033[33m不支持providers\033[0m"
|
||||
UPG_CORE_MENU_4="4) \033[43;30mClash\033[0m:\033[32m$clash_v \033[32m占用低\033[0m \033[33m不安全,已停止维护\033[0m"
|
||||
UPG_CORE_MENU_5="5) 切换版本分支及压缩方式:\033[32m$zip_type\033[0m"
|
||||
UPG_CORE_MENU_6="6) \033[36m使用自定义内核\033[0m $custcore"
|
||||
UPG_CORE_MENU_1_PREFIX="1) \033[43;30mMihomo\033[0m:\033[32m"
|
||||
UPG_CORE_MENU_1_SUFFIX=" \033[32m(原meta内核)支持全面\033[0m \033[33m占用略高\033[0m"
|
||||
UPG_CORE_MENU_2_PREFIX="2) \033[43;30mSingBoxR\033[0m:\033[32m"
|
||||
UPG_CORE_MENU_2_SUFFIX=" \033[32m支持全面\033[0m \033[33m使用reF1nd增强分支\033[0m"
|
||||
UPG_CORE_MENU_3_PREFIX="3) \033[43;30mSingBox\033[0m:\033[32m"
|
||||
UPG_CORE_MENU_3_SUFFIX=" \033[32m占用较低\033[0m \033[33m不支持providers\033[0m"
|
||||
UPG_CORE_MENU_4_PREFIX="4) \033[43;30mClash\033[0m:\033[32m"
|
||||
UPG_CORE_MENU_4_SUFFIX=" \033[32m占用低\033[0m \033[33m不安全,已停止维护\033[0m"
|
||||
UPG_CORE_MENU_5_PREFIX="5) 切换版本分支及压缩方式:\033[32m"
|
||||
UPG_CORE_MENU_5_SUFFIX="\033[0m"
|
||||
UPG_CORE_MENU_6_PREFIX="6) \033[36m使用自定义内核\033[0m "
|
||||
UPG_CORE_MENU_6_SUFFIX=""
|
||||
UPG_CORE_MENU_7="7) \033[32m更新当前内核\033[0m"
|
||||
UPG_CORE_MENU_9="9) 手动指定处理器架构"
|
||||
UPG_GEO_GETTING="正在从服务器获取数据库文件......"
|
||||
UPG_GEO_FAIL="文件下载失败!"
|
||||
UPG_GEO_EXTRACT_FAIL="文件解压失败!"
|
||||
UPG_GEO_OK="$geotype数据库文件下载成功!"
|
||||
UPG_GEO_OK_PREFIX=""
|
||||
UPG_GEO_OK_SUFFIX="数据库文件下载成功!"
|
||||
UPG_GEO_LINKING="正在获取数据库文件......"
|
||||
UPG_GEO_FINDING="正在查找可更新的数据库文件......"
|
||||
UPG_GEO_SELECT="请选择需要更新的数据库文件:"
|
||||
@@ -126,20 +132,21 @@ UPG_GEO_LOCAL_ONLY2="(仅限SingBox-srs)"
|
||||
UPG_GEO_LOCAL_ONLY3="(仅限Mihomo-mrs)"
|
||||
UPG_GEO_LOCAL_ONLY4="(仅限Clash-GeoIP)"
|
||||
UPG_GEO_CUSTOM_LINK="自定义数据库链接"
|
||||
UPG_GEO_CLEAN_HINT1="这将清理$CRASHDIR目录及/ruleset目录下所有数据库文件!"
|
||||
UPG_GEO_CLEAN_HINT1_PREFIX="这将清理"
|
||||
UPG_GEO_CLEAN_HINT1_SUFFIX="目录及/ruleset目录下所有数据库文件!"
|
||||
UPG_GEO_CLEAN_HINT2="清理后启动服务即可自动下载所需文件"
|
||||
UPG_GEO_CLEAN_CONFIRM="确认清理"
|
||||
UPG_GEO_CLEAN_OK="所有数据库文件均已清理!"
|
||||
UPG_DB_GETTING="正在连接服务器获取安装文件......"
|
||||
UPG_DB_DOWNLOAD_OK="下载成功,正在解压文件......"
|
||||
UPG_DB_EXTRACT_FAIL="文件解压失败!"
|
||||
UPG_DB_OK="面板安装成功!"
|
||||
UPG_DB_REFRESH_HINT="如未生效,请使用【Ctrl+F5】强制刷新浏览器!"
|
||||
UPG_DB_INSTALLED="检测到已经安装过本地面板"
|
||||
UPG_DB_UPGRADE="升级/覆盖安装"
|
||||
UPG_DB_CANCEL="安装已取消"
|
||||
UPG_DB_DIR_SELECT="请选择面板安装目录:"
|
||||
UPG_DB_DIR_1="1) 在${CRASHDIR}/ui目录安装"
|
||||
UPG_DB_DIR_1_PREFIX="1) 在"
|
||||
UPG_DB_DIR_1_SUFFIX="/ui目录安装"
|
||||
UPG_DB_DIR_2="2) 在/www/clash目录安装"
|
||||
UPG_DB_TITLE="安装 dashboard 管理面板到本地"
|
||||
UPG_DB_TITLE2="打开管理面板的速度更快且更稳定"
|
||||
@@ -156,8 +163,6 @@ UPG_DB_UNINSTALL="9) \033[31m卸载本地面板\033[0m"
|
||||
UPG_DB_UNINSTALL_CONFIRM="是否卸载本地面板?"
|
||||
UPG_DB_UNINSTALL_YES="1) 确认卸载"
|
||||
UPG_DB_UNINSTALL_OK="面板已经卸载!"
|
||||
UPG_CRT_DB_GETTING="正在连接服务器获取安装文件......"
|
||||
UPG_CRT_DB_DOWNLOAD_FAIL="文件下载失败!"
|
||||
UPG_CRT_DB_OK="证书安装成功!"
|
||||
UPG_CRT_TITLE1="安装/更新本地根证书文件(ca-certificates.crt)"
|
||||
UPG_CRT_TITLE2="用于解决证书校验错误,x509报错等问题"
|
||||
@@ -205,15 +210,18 @@ UPG_THANKS_ITEM_REF1ND_URL="项目地址:https://github.com/reF1nd/sing-box"
|
||||
UPG_THANKS_ITEM_DUSTIN="DustinWin 开发:DustinWin"
|
||||
UPG_THANKS_ITEM_DUSTIN_URL="开发者地址:https://github.com/DustinWin"
|
||||
UPG_CORE_GET_LINK_TITLE="正在获取内核文件链接......"
|
||||
UPG_CUSTOM_CORE_CURRENT_TEXT="当前内核为:"
|
||||
UPG_CUSTOM_CORE_NOTE1="不支持Gvisor、Tailscale、Wireguard、NaiveProxy"
|
||||
UPG_CORE_V1="1) \033[43;30mMihomo\033[0m:\033[32m$meta_v \033[32m(原meta内核)支持全面\033[0m \033[33m占用略高\033[0m"
|
||||
UPG_CORE_V1_PREFIX="1) \033[43;30mMihomo\033[0m:\033[32m"
|
||||
UPG_CORE_V1_SUFFIX=" \033[32m(原meta内核)支持全面\033[0m \033[33m占用略高\033[0m"
|
||||
UPG_CORE_V1_DOC="说明文档:\033[36;4mhttps://wiki.metacubex.one\033[0m"
|
||||
UPG_CORE_V2="2) \033[43;30mSingBoxR\033[0m:\033[32m$singboxr_v \033[32m支持全面\033[0m \033[33m使用reF1nd增强分支\033[0m"
|
||||
UPG_CORE_V2_PREFIX="2) \033[43;30mSingBoxR\033[0m:\033[32m"
|
||||
UPG_CORE_V2_SUFFIX=" \033[32m支持全面\033[0m \033[33m使用reF1nd增强分支\033[0m"
|
||||
UPG_CORE_V2_DOC="说明文档:\033[36;4mhttps://sing-boxr.dustinwin.us.kg\033[0m"
|
||||
UPG_CORE_V3="3) \033[43;30mSingBox\033[0m:\033[32m$singbox_v \033[32m占用较低\033[0m \033[33m不支持providers\033[0m"
|
||||
UPG_CORE_V3_PREFIX="3) \033[43;30mSingBox\033[0m:\033[32m"
|
||||
UPG_CORE_V3_SUFFIX=" \033[32m占用较低\033[0m \033[33m不支持providers\033[0m"
|
||||
UPG_CORE_V3_DOC="说明文档:\033[36;4mhttps://sing-box.sagernet.org\033[0m"
|
||||
UPG_CORE_V4="4) \033[43;30mClash\033[0m:\033[32m$clash_v \033[32m占用低\033[0m \033[33m不安全,已停止维护\033[0m"
|
||||
UPG_CORE_V4_PREFIX="4) \033[43;30mClash\033[0m:\033[32m"
|
||||
UPG_CORE_V4_SUFFIX=" \033[32m占用低\033[0m \033[33m不安全,已停止维护\033[0m"
|
||||
UPG_CORE_V4_DOC="说明文档:\033[36;4mhttps://lancellc.gitbook.io\033[0m"
|
||||
UPG_CORE_ASUS_WARN="Meta内核使用的GeoSite.dat数据库在华硕设备存在被系统误删的问题,可能无法使用!"
|
||||
UPG_GEO_FIND_TITLE="正在查找可更新的数据库文件......"
|
||||
@@ -231,16 +239,16 @@ UPG_GEO_ITEM6="6) Singbox-srs数据库常用包(约0.8mb,非必要勿用)"
|
||||
UPG_GEO_ITEM8="8) \033[36m自定义数据库文件\033[0m"
|
||||
UPG_GEO_ITEM9="9) \033[31m清理数据库文件\033[0m"
|
||||
UPG_GEO_CLEAN_PROMPT="确认清理"
|
||||
UPG_GEO_CLEAN_WARN="这将清理$CRASHDIR目录及/ruleset目录下所有数据库文件!"
|
||||
UPG_GEO_CLEAN_WARN_PREFIX="这将清理"
|
||||
UPG_GEO_CLEAN_WARN_SUFFIX="目录及/ruleset目录下所有数据库文件!"
|
||||
UPG_GEO_CLEAN_WARN2="清理后启动服务即可自动下载所需文件"
|
||||
UPG_GEO_CLEANED="所有数据库文件均已清理!"
|
||||
UPG_DB_CONNECTING="正在连接服务器获取安装文件......"
|
||||
UPG_DB_DOWNLOAD_FAIL="文件下载失败!"
|
||||
UPG_DB_EXTRACT_FAIL_TEXT="文件解压失败!"
|
||||
UPG_DB_INSTALLED_HINT="检测到已经安装过本地面板"
|
||||
UPG_DB_INSTALL_CANCEL="安装已取消"
|
||||
UPG_DB_DIR_TITLE="请选择面板安装目录:"
|
||||
UPG_DB_DIR_1_TEXT="1) 在${CRASHDIR}/ui目录安装"
|
||||
UPG_DB_DIR_1_TEXT_PREFIX="1) 在"
|
||||
UPG_DB_DIR_1_TEXT_SUFFIX="/ui目录安装"
|
||||
UPG_DB_DIR_2_TEXT="2) 在/www/clash目录安装"
|
||||
UPG_DB_INSTALL_TITLE="安装 dashboard 管理面板到本地"
|
||||
UPG_DB_INSTALL_TITLE2="打开管理面板的速度更快且更稳定"
|
||||
@@ -254,7 +262,6 @@ UPG_DB_UNINSTALL_PROMPT="是否卸载本地面板?"
|
||||
UPG_DB_UNINSTALL_CONFIRM_TEXT="1) 确认卸载"
|
||||
UPG_DB_UNINSTALLED="面板已经卸载!"
|
||||
UPG_CRT_CONNECTING="正在连接服务器获取安装文件......"
|
||||
UPG_CRT_INSTALL_OK="证书安装成功!"
|
||||
UPG_CRT_INSTALL_TITLE1="安装/更新本地根证书文件(ca-certificates.crt)"
|
||||
UPG_CRT_INSTALL_TITLE2="用于解决证书校验错误,x509报错等问题"
|
||||
UPG_CRT_INSTALL_TITLE3="无上述问题的设备请勿使用!"
|
||||
|
||||
@@ -42,7 +42,8 @@ DNS_ADV_SINGBOX_LIMIT="注意:SingBox内核仅加载第一个DNS"
|
||||
|
||||
DNS_ADV_EDIT_DIRECT="修改DIRECT-DNS"
|
||||
DNS_ADV_EDIT_PROXY="修改PROXY-DNS(该DNS查询会经过节点)"
|
||||
DNS_ADV_EDIT_DEFAULT="修改DEFAULT-DNS(必须是IP,用于解析其他DNS)"
|
||||
DNS_ADV_EDIT_RESOLVER="修改DEFAULT-DNS(必须是IP,用于解析其他DNS)"
|
||||
DNS_ADV_EDIT_PROXY_SERVER="修改PROXY-SERVER-DNS(必须是IP,用于解析节点域名)"
|
||||
DNS_ADV_AUTO_ENCRYPT="一键配置加密DNS"
|
||||
DNS_ADV_RESET="重置默认DNS配置"
|
||||
|
||||
@@ -61,12 +62,6 @@ DNS_CONFIRM_ADD="请确认需要添加的地址:"
|
||||
DNS_CONFIRM_OK="确认无误"
|
||||
DNS_ADD_OK="添加成功"
|
||||
DNS_ADD_FAIL="添加失败"
|
||||
DNS_DIRECT_NOW="当前DIRECT-DNS:"
|
||||
DNS_PROXY_NOW="当前PROXY-DNS:"
|
||||
DNS_DEFAULT_NOW="当前DEFAULT-DNS:"
|
||||
DNS_INPUT_DIRECT_NEW="请直接输入新的DIRECT-DNS地址"
|
||||
DNS_INPUT_DIRECT_RESET="或输入 r 重置DIRECT-DNS地址"
|
||||
DNS_INPUT_PROXY_NEW="请直接输入新的PROXY-DNS地址"
|
||||
DNS_INPUT_PROXY_RESET="或输入 r 重置PROXY-DNS地址"
|
||||
DNS_INPUT_DEFAULT_NEW="请直接输入新的DEFAULT-DNS地址"
|
||||
DNS_INPUT_DEFAULT_RESET="或输入 r 重置DEFAULT-DNS地址"
|
||||
DNS_NOW="当前DNS:"
|
||||
DNS_INPUT_NEW="请直接输入新的DNS地址"
|
||||
DNS_INPUT_RESET="或输入 r 重置DNS地址"
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
FWF_TITLE="流量过滤"
|
||||
FWF_ITEM_1="1) 过滤非常用端口: \033[36m$common_ports\033[0m ———用于过滤P2P流量"
|
||||
FWF_ITEM_2="2) 过滤局域网设备: \033[36m$mac_return\033[0m ———使用黑/白名单进行过滤"
|
||||
FWF_ITEM_3="3) 过滤QUIC协议: \033[36m$quic_rj\033[0m ———优化视频性能"
|
||||
FWF_ITEM_4="4) 过滤CN_IP(4&6)列表:\033[36m$cn_ip_route\033[0m ———优化性能"
|
||||
FWF_ITEM_1_PREFIX="1) 过滤非常用端口:\t"
|
||||
FWF_ITEM_1_SUFFIX="—用于过滤P2P流量"
|
||||
FWF_ITEM_2_PREFIX="2) 过滤局域网设备:\t"
|
||||
FWF_ITEM_2_SUFFIX="—使用黑/白名单进行过滤"
|
||||
FWF_ITEM_3_PREFIX="3) 过滤QUIC协议:\t"
|
||||
FWF_ITEM_3_SUFFIX="—优化视频性能"
|
||||
FWF_ITEM_4_PREFIX="4) 过滤CN_IP(4&6)列表:"
|
||||
FWF_ITEM_4_SUFFIX="—优化性能"
|
||||
FWF_ITEM_5="5) 自定义透明路由ipv4网段:适合vlan等复杂网络环境"
|
||||
FWF_ITEM_6="6) 自定义保留地址ipv4网段:需要以保留地址为访问目标的环境"
|
||||
FWF_BACK="0) $COMMON_BACK"
|
||||
@@ -21,7 +25,8 @@ FWF_PASS_WORD="不"
|
||||
FWF_COMMON_NOTE="注意:\n"
|
||||
FWF_MIX_NOTE="MIX模式下,所有fake-ip来源的非常用端口流量不会被过滤"
|
||||
FWF_ALLOWED_PORTS="当前已放行端口:"
|
||||
FWF_PORT_MENU_1="1) 启用/关闭端口过滤: \t\033[36m$common_ports\033[0m"
|
||||
FWF_PORT_MENU_1_PREFIX="1) 启用/关闭端口过滤: \t"
|
||||
FWF_PORT_MENU_1_SUFFIX=""
|
||||
FWF_PORT_MENU_2="2) 添加放行端口"
|
||||
FWF_PORT_MENU_3="3) 移除指定放行端口"
|
||||
FWF_PORT_MENU_4="4) 重置默认放行端口"
|
||||
@@ -76,7 +81,8 @@ FWF_FILTER_BLACK_DESC="仅列表内设备流量不经过内核"
|
||||
FWF_FILTER_WHITE_DESC="仅列表内设备流量经过内核"
|
||||
FWF_FILTER_EXISTED="当前已过滤设备为:"
|
||||
FWF_FILTER_HEADER=" \033[36m设备mac/ip地址\033[0m \033[35m设备名称\033[0m"
|
||||
FWF_FILTER_SWITCH="1) 切换为\033[33m$fw_filter_lan_over模式\033[0m"
|
||||
FWF_FILTER_SWITCH_PREFIX="1) 切换为"
|
||||
FWF_FILTER_SWITCH_SUFFIX="模式"
|
||||
FWF_FILTER_ADD_MAC="2) \033[32m添加指定设备(mac地址)\033[0m"
|
||||
FWF_FILTER_ADD_IP="3) \033[32m添加指定设备(IP地址/网段)\033[0m"
|
||||
FWF_FILTER_REMOVE="4) \033[36m移除指定设备\033[0m"
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# ===== 通用提示 =====
|
||||
|
||||
MENU_RESTART_NOTICE="检测到配置变更,是否立即重启服务以应用新配置?"
|
||||
MENU_RESTART_NOW="立即重启"
|
||||
MENU_RESTART_LATER="暂不重启"
|
||||
|
||||
MENU_PORT_CONFLICT_TITLE="检测到端口被以下进程占用!内核可能无法正常启动!"
|
||||
MENU_PORT_CONFLICT_HINT="请修改默认端口配置!"
|
||||
@@ -13,6 +15,8 @@ MENU_CFG_LOADED_OK="配置文件加载完成!"
|
||||
|
||||
MENU_OVERRIDE_WARN="你已经禁用了配置文件覆写功能,这会导致大量脚本功能无法使用!"
|
||||
MENU_OVERRIDE_ASK="是否取消禁用?"
|
||||
MENU_YES="是"
|
||||
MENU_NO="否"
|
||||
|
||||
# ===== 欢迎与状态 =====
|
||||
MENU_WELCOME="欢迎使用ShellCrash!"
|
||||
@@ -37,6 +41,8 @@ MENU_TG_CHANNEL="TG频道:"
|
||||
# ===== /tmp 文件检测 =====
|
||||
MENU_TMP_CORE_FOUND="发现可用的内核文件:"
|
||||
MENU_TMP_CORE_ASK="是否立即加载该内核(会停止当前服务)?"
|
||||
MENU_LOAD_NOW="立即加载"
|
||||
MENU_LOAD_LATER="暂不加载"
|
||||
|
||||
MENU_TMP_CFG_FOUND="发现内核配置文件:"
|
||||
MENU_TMP_CFG_ASK="是否立即加载为配置文件?"
|
||||
|
||||
@@ -10,7 +10,8 @@ OVR_PROMPT="请输入> "
|
||||
OVR_GROUPS_CHOOSE_TYPE="请选择策略组的类型:"
|
||||
OVR_GROUP_TYPE_CN="手动选择 自动选择 故障转移 负载均衡"
|
||||
OVR_WARN_1="此功能可能会导致严重问题!启用后脚本中大部分功能都将禁用!!!"
|
||||
OVR_WARN_2="如果你不是非常了解$crashcore的运行机制,切勿开启!"
|
||||
OVR_WARN_2_PREFIX="如果你不是非常了解"
|
||||
OVR_WARN_2_SUFFIX="的运行机制,切勿开启!"
|
||||
OVR_WARN_3="继续后如出现任何问题,请务必自行解决,一切提问恕不受理!"
|
||||
OVR_WARN_CONFIRM="1) 我确认遇到问题可以自行解决"
|
||||
OVR_CONFIRM_YES="1) 是"
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
SET_MENU_TITLE="Welcome to the Function Settings Menu:"
|
||||
SET_MENU_REDIR="Routing Mode:"
|
||||
SET_MENU_DNS="DNS Settings:"
|
||||
SET_MENU_FW_FILTER="Transparent Routing Traffic Filter"
|
||||
SET_MENU_FW_FILTER="Transparent Routing Traffic Filter:"
|
||||
SET_MENU_FW_FILTER_DESC="ports, devices, protocols, or lists"
|
||||
SET_MENU_SKIP_CERT="Skip Cert Verify:"
|
||||
SET_MENU_SNIFFER="Enable Sniff:"
|
||||
SET_MENU_ADV_PORT="Custom Ports and Secrets"
|
||||
|
||||
@@ -11,9 +11,11 @@ TOOLS_ENABLE="Enable"
|
||||
TOOLS_CONFIGURED="Configured"
|
||||
TOOLS_SSH_ONLY_OPENWRT="This feature only works on OpenWrt devices and does not depend on services"
|
||||
TOOLS_SSH_UNSUPPORTED_SYSTEM="This feature does not support mirrored systems like Redmi AX6S. Do not try it!"
|
||||
TOOLS_SSH_PORT_ITEM="1) \033[32mChange\033[0m WAN SSH port: \033[36m$ssh_port\033[0m"
|
||||
TOOLS_SSH_PORT_ITEM_PREFIX="1) \033[32mChange\033[0m WAN SSH port:"
|
||||
TOOLS_SSH_PORT_ITEM_SUFFIX=""
|
||||
TOOLS_SSH_PASS_ITEM="2) \033[32mChange\033[0m SSH password (enter twice, then press Enter)"
|
||||
TOOLS_SSH_TOGGLE_ITEM="3) \033[33m$ssh_ol\033[0m WAN SSH access"
|
||||
TOOLS_SSH_TOGGLE_ITEM_PREFIX="3) "
|
||||
TOOLS_SSH_TOGGLE_ITEM_SUFFIX=" WAN SSH access"
|
||||
TOOLS_PROMPT_PORT="Please enter a port number (1000-65535)> "
|
||||
TOOLS_WARN_COMPAT="This page may not be compatible with all Linux devices. Use at your own discretion!"
|
||||
TOOLS_DISK_USAGE="Disk usage / current directory:"
|
||||
@@ -21,10 +23,14 @@ TOOLS_MENU_TEST_ITEM="1) ShellCrash \033[33mTest Menu\033[0m"
|
||||
TOOLS_MENU_GUIDE_ITEM="2) ShellCrash \033[32mGetting Started\033[0m"
|
||||
TOOLS_MENU_LOG_ITEM="3) \033[36mLogs and Push Tools\033[0m"
|
||||
TOOLS_MENU_SSH_ITEM="4) \033[32mConfigure\033[0m WAN SSH access"
|
||||
TOOLS_MENU_MI_UPDATE_ITEM="5) \033[33m$mi_update\033[0m Xiaomi system auto-update"
|
||||
TOOLS_MENU_MI_AUTO_SSH_ITEM="6) Xiaomi device SSH hardening —— \033[$mi_mi_autoSSH_type \033[0m"
|
||||
TOOLS_MENU_MI_TUN_FIX_ITEM="8) Xiaomi device Tun module repair —— \033[$mi_tunfix \033[0m"
|
||||
TOOLS_MI_UPDATE_MSG="Xiaomi router auto-update has been \033[33m$mi_update\033[0m. If it does not take effect, sync the setting in the official app!"
|
||||
TOOLS_MENU_MI_UPDATE_ITEM_PREFIX="5) "
|
||||
TOOLS_MENU_MI_UPDATE_ITEM_SUFFIX=" Xiaomi system auto-update"
|
||||
TOOLS_MENU_MI_AUTO_SSH_ITEM_PREFIX="6) Xiaomi device SSH hardening —— "
|
||||
TOOLS_MENU_MI_AUTO_SSH_ITEM_SUFFIX=""
|
||||
TOOLS_MENU_MI_TUN_FIX_ITEM_PREFIX="8) Xiaomi device Tun module repair —— "
|
||||
TOOLS_MENU_MI_TUN_FIX_ITEM_SUFFIX=""
|
||||
TOOLS_MI_UPDATE_MSG_PREFIX="Xiaomi router auto-update has been "
|
||||
TOOLS_MI_UPDATE_MSG_SUFFIX=". If it does not take effect, sync the setting in the official app!"
|
||||
TOOLS_UNSUPPORTED_DEVICE="Unsupported device!"
|
||||
TOOLS_FETCHING_SCRIPT="Fetching online script..."
|
||||
TOOLS_DOWNLOAD_FAIL="File download failed!"
|
||||
@@ -46,16 +52,25 @@ TOOLS_AUTO_SSH_WARN2="If you have issues, please report in the group:"
|
||||
TOOLS_AUTO_SSH_PWD_HINT1="Please enter the SSH password to restore (current password will not be affected)"
|
||||
TOOLS_AUTO_SSH_PWD_HINT2="(Press Enter to skip)"
|
||||
TOOLS_AUTO_SSH_INPUT="Please enter> "
|
||||
TOOLS_LOG_TG="1) Telegram push\t——\033[$stat_TG\033[0m"
|
||||
TOOLS_LOG_DEER="2) PushDeer push\t——\033[$stat_Deer\033[0m"
|
||||
TOOLS_LOG_BARK="3) Bark push-IOS\t——\033[$stat_bark\033[0m"
|
||||
TOOLS_LOG_PO="4) Passover push\t——\033[$stat_Po\033[0m"
|
||||
TOOLS_LOG_PP="5) PushPlus push\t——\033[$stat_PP\033[0m"
|
||||
TOOLS_LOG_SYNO="6) SynoChat push\t——\033[$stat_SynoChat\033[0m"
|
||||
TOOLS_LOG_GOTIFY="7) Gotify push\t ——\033[$stat_Gotify\033[0m"
|
||||
TOOLS_LOG_TG_PREFIX="1) Telegram push\t——"
|
||||
TOOLS_LOG_TG_SUFFIX=""
|
||||
TOOLS_LOG_DEER_PREFIX="2) PushDeer push\t——"
|
||||
TOOLS_LOG_DEER_SUFFIX=""
|
||||
TOOLS_LOG_BARK_PREFIX="3) Bark push-IOS\t——"
|
||||
TOOLS_LOG_BARK_SUFFIX=""
|
||||
TOOLS_LOG_PO_PREFIX="4) Passover push\t——"
|
||||
TOOLS_LOG_PO_SUFFIX=""
|
||||
TOOLS_LOG_PP_PREFIX="5) PushPlus push\t——"
|
||||
TOOLS_LOG_PP_SUFFIX=""
|
||||
TOOLS_LOG_SYNO_PREFIX="6) SynoChat push\t——"
|
||||
TOOLS_LOG_SYNO_SUFFIX=""
|
||||
TOOLS_LOG_GOTIFY_PREFIX="7) Gotify push\t ——"
|
||||
TOOLS_LOG_GOTIFY_SUFFIX=""
|
||||
TOOLS_LOG_VIEW="a) View \033[36mruntime logs\033[0m"
|
||||
TOOLS_LOG_TASK="b) Push task logs\t——\033[$stat_task\033[0m"
|
||||
TOOLS_LOG_DEVICE="c) Set device name\t——\033[$device_s\033[0m"
|
||||
TOOLS_LOG_TASK_PREFIX="b) Push task logs\t——"
|
||||
TOOLS_LOG_TASK_SUFFIX=""
|
||||
TOOLS_LOG_DEVICE_PREFIX="c) Set device name\t——"
|
||||
TOOLS_LOG_DEVICE_SUFFIX=""
|
||||
TOOLS_LOG_CLEAR="d) Clear log files"
|
||||
TOOLS_CONFIRM_CLOSE_TG="Are you sure you want to disable TG log push?"
|
||||
TOOLS_CONFIRM_CLOSE_DEER="Are you sure you want to disable PushDeer log push?"
|
||||
@@ -120,17 +135,22 @@ TOOLS_PROXY_NOTE="Note: depends on curl (wget is not supported), and the test re
|
||||
TOOLS_PROXY_OK="Connection successful! Response time: "
|
||||
TOOLS_PROXY_TIMEOUT="Connection timed out! Please retry or check the node configuration!"
|
||||
TOOLS_DEBUG_WARN1="Note: Debug mode will stop the original kernel service"
|
||||
TOOLS_DEBUG_WARN2="Background log path: \033[32m$TMPDIR/debug.log\033[0m"
|
||||
TOOLS_DEBUG_WARN2_PREFIX="Background log path: "
|
||||
TOOLS_DEBUG_WARN2_SUFFIX=""
|
||||
TOOLS_DEBUG_WARN3="For long-running background monitoring, error is recommended as the log level to avoid oversized files!"
|
||||
TOOLS_DEBUG_WARN4="You can also use: \033[33mcrash -s debug 'warning'\033[0m to select another log level"
|
||||
TOOLS_DEBUG_ITEM_1="1) Only test the availability of the \033[32m$config_tmp\033[0m config file"
|
||||
TOOLS_DEBUG_ITEM_2="2) Run the \033[32m$config_tmp\033[0m config file in foreground without firewall hijacking (\033[33muse Ctrl+C to stop manually\033[0m)"
|
||||
TOOLS_DEBUG_ITEM_1_PREFIX="1) Only test the availability of the "
|
||||
TOOLS_DEBUG_ITEM_1_SUFFIX=" config file"
|
||||
TOOLS_DEBUG_ITEM_2_PREFIX="2) Run the "
|
||||
TOOLS_DEBUG_ITEM_2_SUFFIX=" config file in foreground without firewall hijacking (use Ctrl+C to stop manually)"
|
||||
TOOLS_DEBUG_ITEM_3="3) Run the full startup flow in background with firewall hijacking, log level: \033[31merror\033[0m"
|
||||
TOOLS_DEBUG_ITEM_4="4) Run the full startup flow in background with firewall hijacking, log level: \033[32minfo\033[0m"
|
||||
TOOLS_DEBUG_ITEM_5="5) Run the full startup flow in background with firewall hijacking, log level: \033[33mdebug\033[0m"
|
||||
TOOLS_DEBUG_ITEM_6="6) Run the full startup flow in background with firewall hijacking and print error logs to flash: \033[32m$CRASHDIR/debug.log\033[0m"
|
||||
TOOLS_DEBUG_ITEM_6_PREFIX="6) Run the full startup flow in background with firewall hijacking and print error logs to flash: "
|
||||
TOOLS_DEBUG_ITEM_6_SUFFIX=""
|
||||
TOOLS_DEBUG_ITEM_8="8) Run the full startup flow in background, print execution errors and inspect context, then close the process"
|
||||
TOOLS_DEBUG_ITEM_9="9) Merge the json files under \033[32m$config_tmp\033[0m into $TMPDIR/debug.json"
|
||||
TOOLS_DEBUG_ITEM_9_PREFIX="9) Merge the json files under "
|
||||
TOOLS_DEBUG_ITEM_9_SUFFIX=" into "
|
||||
TOOLS_FLASH_WARN="Frequent flash writes will shorten flash lifespan. Unless you are dealing with a bug that would otherwise crash or reboot the device, do not use this feature!"
|
||||
TOOLS_FLASH_CONFIRM="Confirm enabling this feature?"
|
||||
TOOLS_MERGE_OK="Merged successfully!"
|
||||
|
||||
@@ -13,7 +13,7 @@ UPG_MENU_DB="Install/Update local "
|
||||
UPG_MENU_DB_NAME="Dashboard"
|
||||
UPG_MENU_CRT="Install/Update local "
|
||||
UPG_MENU_CRT_NAME="certificates"
|
||||
UPG_MENU_PAC=" proxy view"
|
||||
UPG_MENU_PAC="Auto proxy view"
|
||||
UPG_MENU_SOURCE="Switch "
|
||||
UPG_MENU_SOURCE_NAME="source and branch"
|
||||
UPG_MENU_UNINSTALL="Uninstall ShellCrash"
|
||||
@@ -52,11 +52,6 @@ UPG_PAC_GUIDE_TEXT="PAC guide: "
|
||||
UPG_THANKS_PROJECTS="Thanks to the following projects and developers!"
|
||||
UPG_THANKS_SPECIAL_TEXT="Special thanks: \033[36mall contributors and sponsors!\033[0m"
|
||||
UPG_GETTING_UPDATE="Checking updates..."
|
||||
UPG_GET_OK="Update check succeeded"
|
||||
UPG_GET_FAIL="Update check failed! Please switch source and retry!"
|
||||
UPG_EXTRACT_START="Extracting files..."
|
||||
UPG_SCRIPT_UPDATE_OK="Script update succeeded!"
|
||||
UPG_SCRIPT_UPDATE_PROMPT="Note: service will be stopped during update!"
|
||||
UPG_SCRIPT_CUR_VER_TEXT="Current script version: "
|
||||
UPG_SCRIPT_NEW_VER_TEXT="Latest script version: "
|
||||
UPG_UPDATE_NOW_TEXT="Update now"
|
||||
@@ -68,8 +63,10 @@ UPG_CORETYPE_CONFIRM_TEXT="Please confirm custom core type:"
|
||||
UPG_CORE_SWITCH_KEEP_TEXT="Keep related database files?"
|
||||
UPG_KEEP_TEXT="Keep"
|
||||
UPG_NOT_KEEP_TEXT="Do not keep"
|
||||
UPG_GETTING_CORE_TEXT="Fetching $crashcore core files online..."
|
||||
UPG_CORE_DOWNLOAD_OK_TEXT="$crashcore core downloaded successfully!"
|
||||
UPG_GETTING_CORE_TEXT_PREFIX="Fetching "
|
||||
UPG_GETTING_CORE_TEXT_SUFFIX=" core files online..."
|
||||
UPG_CORE_DOWNLOAD_OK_TEXT_PREFIX=""
|
||||
UPG_CORE_DOWNLOAD_OK_TEXT_SUFFIX=" core downloaded successfully!"
|
||||
UPG_CORE_DOWNLOAD_FAIL_TEXT="Core file download failed!"
|
||||
UPG_CORE_DOWNLOAD_VERIFY_FAIL_TEXT="Core file downloaded, but verification failed"
|
||||
UPG_CORE_DOWNLOAD_VERIFY_HINT_TEXT="Please try selecting a CPU version manually"
|
||||
@@ -86,9 +83,13 @@ UPG_CUSTOM_CORE_TASK_WARN="Custom cores support scheduled tasks but do not suppo
|
||||
UPG_CUSTOM_CORE_NET_WARN="If you encounter network errors, start the ShellCrash service first!"
|
||||
UPG_CUSTOM_CORE_CURRENT="Current core: "
|
||||
UPG_CUSTOM_CORE_SELECT="Please choose the core you want to use:"
|
||||
UPG_CUSTOM_CORE_MENU_OFFICIAL=" official core"
|
||||
UPG_CUSTOM_CORE_MENU_ALPHA=" core (supports Smart strategy)"
|
||||
UPG_CUSTOM_CORE_MENU_MULTI=" multi-version core"
|
||||
UPG_CUSTOM_CORE_LINK_HINT="Please enter the custom core URL"
|
||||
UPG_CUSTOM_CORE_LINK_HINT2="(must end with .tar.gz, .upx, or .gz)"
|
||||
UPG_CUSTOM_CORE_LINK_HINT3="Or enter 0 to return to the previous menu"
|
||||
UPG_CUSTOM_CORE_LINK_MENU="Use custom core URL"
|
||||
UPG_ZIPTYPE_TITLE="Please choose the core branch and compression method:"
|
||||
UPG_ZIPTYPE_1="1) \033[36mMinimal release build, upx compressed\033[0m"
|
||||
UPG_ZIPTYPE_1_HINT="Gvisor, Tailscale, Wireguard, and NaiveProxy are not supported"
|
||||
@@ -100,18 +101,23 @@ UPG_CORE_MENU_CURRENT="Current core: "
|
||||
UPG_CORE_MENU_SYS="Current CPU architecture: "
|
||||
UPG_CORE_MENU_LOCAL_HINT="If uploading locally, place .upx, .gz, or .tar.gz files in /tmp and rerun the crash command"
|
||||
UPG_CORE_MENU_SELECT="Please choose the core version to use:"
|
||||
UPG_CORE_MENU_1="1) \033[43;30mMihomo\033[0m: \033[32m$meta_v \033[32m(full meta core) highly compatible\033[0m \033[33mmore resource usage\033[0m"
|
||||
UPG_CORE_MENU_2="2) \033[43;30mSingBoxR\033[0m: \033[32m$singboxr_v \033[32mfully featured\033[0m \033[33mreF1nd enhanced branch\033[0m"
|
||||
UPG_CORE_MENU_3="3) \033[43;30mSingBox\033[0m: \033[32m$singbox_v \033[32mlower resource usage\033[0m \033[33mproviders are not supported\033[0m"
|
||||
UPG_CORE_MENU_4="4) \033[43;30mClash\033[0m: \033[32m$clash_v \033[32mlow resource usage\033[0m \033[33munsafe, maintenance stopped\033[0m"
|
||||
UPG_CORE_MENU_5="5) Switch branch and compression method: \033[32m$zip_type\033[0m"
|
||||
UPG_CORE_MENU_6="6) \033[36mUse custom core\033[0m $custcore"
|
||||
UPG_CORE_MENU_1_PREFIX="1) \033[43;30mMihomo\033[0m: \033[32m"
|
||||
UPG_CORE_MENU_1_SUFFIX=" \033[32m(full meta core) highly compatible\033[0m \033[33mmore resource usage\033[0m"
|
||||
UPG_CORE_MENU_2_PREFIX="2) \033[43;30mSingBoxR\033[0m: \033[32m"
|
||||
UPG_CORE_MENU_2_SUFFIX=" \033[32mfully featured\033[0m \033[33mreF1nd enhanced branch\033[0m"
|
||||
UPG_CORE_MENU_3_PREFIX="3) \033[43;30mSingBox\033[0m: \033[32m"
|
||||
UPG_CORE_MENU_3_SUFFIX=" \033[32mlower resource usage\033[0m \033[33mproviders are not supported\033[0m"
|
||||
UPG_CORE_MENU_4_PREFIX="4) \033[43;30mClash\033[0m: \033[32m"
|
||||
UPG_CORE_MENU_4_SUFFIX=" \033[32mlow resource usage\033[0m \033[33munsafe, maintenance stopped\033[0m"
|
||||
UPG_CORE_MENU_5_PREFIX="5) Switch branch and compression method: \033[32m"
|
||||
UPG_CORE_MENU_5_SUFFIX="\033[0m"
|
||||
UPG_CORE_MENU_6_PREFIX="6) \033[36mUse custom core\033[0m "
|
||||
UPG_CORE_MENU_6_SUFFIX=""
|
||||
UPG_CORE_MENU_7="7) \033[32mUpdate current core\033[0m"
|
||||
UPG_CORE_MENU_9="9) Manually specify CPU architecture"
|
||||
UPG_GEO_GETTING="Fetching database files from the server..."
|
||||
UPG_GEO_FAIL="Download failed!"
|
||||
UPG_GEO_EXTRACT_FAIL="Extraction failed!"
|
||||
UPG_GEO_OK="$geotype database file downloaded successfully!"
|
||||
UPG_GEO_OK_PREFIX=""
|
||||
UPG_GEO_OK_SUFFIX=" database file downloaded successfully!"
|
||||
UPG_GEO_LINKING="Fetching database files..."
|
||||
UPG_GEO_FINDING="Searching for updatable database files..."
|
||||
UPG_GEO_SELECT="Please choose the database file to update:"
|
||||
@@ -126,20 +132,21 @@ UPG_GEO_LOCAL_ONLY2="(SingBox-srs only)"
|
||||
UPG_GEO_LOCAL_ONLY3="(Mihomo-mrs only)"
|
||||
UPG_GEO_LOCAL_ONLY4="(Clash-GeoIP only)"
|
||||
UPG_GEO_CUSTOM_LINK="Custom database link"
|
||||
UPG_GEO_CLEAN_HINT1="This will clean all database files under $CRASHDIR and /ruleset!"
|
||||
UPG_GEO_CLEAN_HINT1_PREFIX="This will clean all database files under "
|
||||
UPG_GEO_CLEAN_HINT1_SUFFIX=" and /ruleset!"
|
||||
UPG_GEO_CLEAN_HINT2="After cleaning, starting the service will automatically download the required files"
|
||||
UPG_GEO_CLEAN_CONFIRM="Confirm cleanup"
|
||||
UPG_GEO_CLEAN_OK="All database files have been cleaned!"
|
||||
UPG_DB_GETTING="Connecting to the server to fetch installation files..."
|
||||
UPG_DB_DOWNLOAD_OK="Download succeeded, extracting files..."
|
||||
UPG_DB_EXTRACT_FAIL="Extraction failed!"
|
||||
UPG_DB_OK="Panel installed successfully!"
|
||||
UPG_DB_REFRESH_HINT="If it does not take effect, use Ctrl+F5 to force-refresh the browser!"
|
||||
UPG_DB_INSTALLED="A local panel is already installed"
|
||||
UPG_DB_UPGRADE="Upgrade / overwrite install"
|
||||
UPG_DB_CANCEL="Installation cancelled"
|
||||
UPG_DB_DIR_SELECT="Please choose the panel install directory:"
|
||||
UPG_DB_DIR_1="1) Install in ${CRASHDIR}/ui"
|
||||
UPG_DB_DIR_1_PREFIX="1) Install in "
|
||||
UPG_DB_DIR_1_SUFFIX="/ui"
|
||||
UPG_DB_DIR_2="2) Install in /www/clash"
|
||||
UPG_DB_TITLE="Install the dashboard management panel locally"
|
||||
UPG_DB_TITLE2="The management panel opens faster and is more stable"
|
||||
@@ -156,8 +163,6 @@ UPG_DB_UNINSTALL="9) \033[31mUninstall local panel\033[0m"
|
||||
UPG_DB_UNINSTALL_CONFIRM="Uninstall the local panel?"
|
||||
UPG_DB_UNINSTALL_YES="1) Confirm uninstall"
|
||||
UPG_DB_UNINSTALL_OK="Panel has been uninstalled!"
|
||||
UPG_CRT_DB_GETTING="Connecting to the server to fetch installation files..."
|
||||
UPG_CRT_DB_DOWNLOAD_FAIL="Download failed!"
|
||||
UPG_CRT_DB_OK="Certificate installed successfully!"
|
||||
UPG_CRT_TITLE1="Install / update local root certificate file (ca-certificates.crt)"
|
||||
UPG_CRT_TITLE2="Used to fix certificate verification errors, x509 errors, and similar issues"
|
||||
@@ -170,8 +175,8 @@ UPG_CRT_WARN="This device may not have openssl installed, so certificate files c
|
||||
UPG_SOURCE_CUR="Current version: "
|
||||
UPG_SOURCE_CUR2="Current source: "
|
||||
UPG_SOURCE_TITLE="Switch ShellCrash version and update source"
|
||||
UPG_SOURCE_SWITCH_STABLE="a) Switch to \033[32mstable-stable\033[0m"
|
||||
UPG_SOURCE_SWITCH_MASTER="b) Switch to \033[36mmaster\033[0m"
|
||||
UPG_SOURCE_SWITCH_STABLE="a) Switch to \033[32mstable\033[0m"
|
||||
UPG_SOURCE_SWITCH_MASTER="b) Switch to \033[36mpublic beta-master\033[0m"
|
||||
UPG_SOURCE_SWITCH_DEV="c) Switch to \033[33mdev\033[0m"
|
||||
UPG_SOURCE_CUSTOM="d) Custom source URL (for local or self-hosted sources)"
|
||||
UPG_SOURCE_ROLLBACK="e) \033[31mVersion rollback\033[0m"
|
||||
@@ -205,15 +210,18 @@ UPG_THANKS_ITEM_REF1ND_URL="Project: https://github.com/reF1nd/sing-box"
|
||||
UPG_THANKS_ITEM_DUSTIN="DustinWin Developer: DustinWin"
|
||||
UPG_THANKS_ITEM_DUSTIN_URL="Developer: https://github.com/DustinWin"
|
||||
UPG_CORE_GET_LINK_TITLE="Fetching core file links..."
|
||||
UPG_CUSTOM_CORE_CURRENT_TEXT="Current core: "
|
||||
UPG_CUSTOM_CORE_NOTE1="Gvisor, Tailscale, Wireguard, and NaiveProxy are not supported"
|
||||
UPG_CORE_V1="1) \033[43;30mMihomo\033[0m: \033[32m$meta_v \033[32m(full meta core) highly compatible\033[0m \033[33mmore resource usage\033[0m"
|
||||
UPG_CORE_V1_PREFIX="1) \033[43;30mMihomo\033[0m: \033[32m"
|
||||
UPG_CORE_V1_SUFFIX=" \033[32m(full meta core) highly compatible\033[0m \033[33mmore resource usage\033[0m"
|
||||
UPG_CORE_V1_DOC="Docs: \033[36;4mhttps://wiki.metacubex.one\033[0m"
|
||||
UPG_CORE_V2="2) \033[43;30mSingBoxR\033[0m: \033[32m$singboxr_v \033[32mfully featured\033[0m \033[33mreF1nd enhanced branch\033[0m"
|
||||
UPG_CORE_V2_PREFIX="2) \033[43;30mSingBoxR\033[0m: \033[32m"
|
||||
UPG_CORE_V2_SUFFIX=" \033[32mfully featured\033[0m \033[33mreF1nd enhanced branch\033[0m"
|
||||
UPG_CORE_V2_DOC="Docs: \033[36;4mhttps://sing-boxr.dustinwin.us.kg\033[0m"
|
||||
UPG_CORE_V3="3) \033[43;30mSingBox\033[0m: \033[32m$singbox_v \033[32mlower resource usage\033[0m \033[33mproviders are not supported\033[0m"
|
||||
UPG_CORE_V3_PREFIX="3) \033[43;30mSingBox\033[0m: \033[32m"
|
||||
UPG_CORE_V3_SUFFIX=" \033[32mlower resource usage\033[0m \033[33mproviders are not supported\033[0m"
|
||||
UPG_CORE_V3_DOC="Docs: \033[36;4mhttps://sing-box.sagernet.org\033[0m"
|
||||
UPG_CORE_V4="4) \033[43;30mClash\033[0m: \033[32m$clash_v \033[32mlow resource usage\033[0m \033[33munsafe, maintenance stopped\033[0m"
|
||||
UPG_CORE_V4_PREFIX="4) \033[43;30mClash\033[0m: \033[32m"
|
||||
UPG_CORE_V4_SUFFIX=" \033[32mlow resource usage\033[0m \033[33munsafe, maintenance stopped\033[0m"
|
||||
UPG_CORE_V4_DOC="Docs: \033[36;4mhttps://lancellc.gitbook.io\033[0m"
|
||||
UPG_CORE_ASUS_WARN="The GeoSite.dat database used by Meta core may be deleted by the system on Asus devices, so it may not work!"
|
||||
UPG_GEO_FIND_TITLE="Searching for updatable database files..."
|
||||
@@ -231,16 +239,16 @@ UPG_GEO_ITEM6="6) SingBox-srs common package (about 0.8mb, use only if needed)"
|
||||
UPG_GEO_ITEM8="8) \033[36mCustom database file\033[0m"
|
||||
UPG_GEO_ITEM9="9) \033[31mClean database files\033[0m"
|
||||
UPG_GEO_CLEAN_PROMPT="Confirm cleanup"
|
||||
UPG_GEO_CLEAN_WARN="This will clean all database files under $CRASHDIR and /ruleset!"
|
||||
UPG_GEO_CLEAN_WARN_PREFIX="This will clean all database files under "
|
||||
UPG_GEO_CLEAN_WARN_SUFFIX=" and /ruleset!"
|
||||
UPG_GEO_CLEAN_WARN2="After cleanup, start the service to download the required files automatically"
|
||||
UPG_GEO_CLEANED="All database files have been cleaned!"
|
||||
UPG_DB_CONNECTING="Connecting to the server to fetch installation files..."
|
||||
UPG_DB_DOWNLOAD_FAIL="Download failed!"
|
||||
UPG_DB_EXTRACT_FAIL_TEXT="Extraction failed!"
|
||||
UPG_DB_INSTALLED_HINT="A local panel is already installed"
|
||||
UPG_DB_INSTALL_CANCEL="Installation cancelled"
|
||||
UPG_DB_DIR_TITLE="Please choose the panel install directory:"
|
||||
UPG_DB_DIR_1_TEXT="1) Install in ${CRASHDIR}/ui"
|
||||
UPG_DB_DIR_1_TEXT_PREFIX="1) Install in "
|
||||
UPG_DB_DIR_1_TEXT_SUFFIX="/ui"
|
||||
UPG_DB_DIR_2_TEXT="2) Install in /www/clash"
|
||||
UPG_DB_INSTALL_TITLE="Install the dashboard management panel locally"
|
||||
UPG_DB_INSTALL_TITLE2="The management panel opens faster and is more stable"
|
||||
@@ -254,7 +262,6 @@ UPG_DB_UNINSTALL_PROMPT="Uninstall the local panel?"
|
||||
UPG_DB_UNINSTALL_CONFIRM_TEXT="1) Confirm uninstall"
|
||||
UPG_DB_UNINSTALLED="Panel has been uninstalled!"
|
||||
UPG_CRT_CONNECTING="Connecting to the server to fetch installation files..."
|
||||
UPG_CRT_INSTALL_OK="Certificate installed successfully!"
|
||||
UPG_CRT_INSTALL_TITLE1="Install / update local root certificate file (ca-certificates.crt)"
|
||||
UPG_CRT_INSTALL_TITLE2="Used to fix certificate verification errors, x509 errors, and similar issues"
|
||||
UPG_CRT_INSTALL_TITLE3="Do not use on devices without the above issues!"
|
||||
|
||||
@@ -43,7 +43,8 @@ DNS_ADV_SINGBOX_LIMIT="Note: SingBox core only loads the first DNS entry"
|
||||
|
||||
DNS_ADV_EDIT_DIRECT="Edit DIRECT-DNS"
|
||||
DNS_ADV_EDIT_PROXY="Edit PROXY-DNS (queries go through the proxy)"
|
||||
DNS_ADV_EDIT_DEFAULT="Edit DEFAULT-DNS (must be an IP, used to resolve other DNS servers)"
|
||||
DNS_ADV_EDIT_RESOLVER="Edit DEFAULT-DNS (must be an IP, used to resolve other DNS servers)"
|
||||
DNS_ADV_EDIT_PROXY_SERVER="Edit PROXY-SERVER-DNS (must be an IP, used to resolve proxy hostnames)"
|
||||
DNS_ADV_AUTO_ENCRYPT="Auto-configure Encrypted DNS"
|
||||
DNS_ADV_RESET="Reset to default DNS configuration"
|
||||
|
||||
@@ -63,12 +64,6 @@ DNS_CONFIRM_ADD="Please confirm the address to add: "
|
||||
DNS_CONFIRM_OK="Confirm"
|
||||
DNS_ADD_OK="Added successfully"
|
||||
DNS_ADD_FAIL="Add failed"
|
||||
DNS_DIRECT_NOW="Current DIRECT-DNS: "
|
||||
DNS_PROXY_NOW="Current PROXY-DNS: "
|
||||
DNS_DEFAULT_NOW="Current DEFAULT-DNS: "
|
||||
DNS_INPUT_DIRECT_NEW="Please input new DIRECT-DNS"
|
||||
DNS_INPUT_DIRECT_RESET="or input r to reset DIRECT-DNS"
|
||||
DNS_INPUT_PROXY_NEW="Please input new PROXY-DNS"
|
||||
DNS_INPUT_PROXY_RESET="or input r to reset PROXY-DNS"
|
||||
DNS_INPUT_DEFAULT_NEW="Please input new DEFAULT-DNS"
|
||||
DNS_INPUT_DEFAULT_RESET="or input r to reset DEFAULT-DNS"
|
||||
DNS_NOW="Current DNS: "
|
||||
DNS_INPUT_NEW="Please input a new DNS address"
|
||||
DNS_INPUT_RESET="or input r to reset the DNS address"
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
FWF_TITLE="Traffic Filter"
|
||||
FWF_ITEM_1="1) Filter non-common ports: \t\033[36m$common_ports\033[0m\t--- used to filter P2P traffic"
|
||||
FWF_ITEM_2="2) Filter LAN devices: \t\033[36m$mac_return\033[0m\t--- use blacklist/whitelist filtering"
|
||||
FWF_ITEM_3="3) Filter QUIC protocol: \t\033[36m$quic_rj\033[0m\t--- improve video performance"
|
||||
FWF_ITEM_4="4) Filter CN_IP (4&6) list: \033[36m$cn_ip_route\033[0m\t--- improve performance"
|
||||
FWF_ITEM_1_PREFIX="1) Filter Common ports: "
|
||||
FWF_ITEM_1_SUFFIX="--- filter P2P traffic"
|
||||
FWF_ITEM_2_PREFIX="2) Filter LAN devices: "
|
||||
FWF_ITEM_2_SUFFIX="--- use black/white list"
|
||||
FWF_ITEM_3_PREFIX="3) Filter QUIC protocol: "
|
||||
FWF_ITEM_3_SUFFIX="--- improve video"
|
||||
FWF_ITEM_4_PREFIX="4) Filter CN_IP list: "
|
||||
FWF_ITEM_4_SUFFIX="--- improve performance"
|
||||
FWF_ITEM_5="5) Custom transparent routing IPv4 subnet: suitable for vlan and other complex networks"
|
||||
FWF_ITEM_6="6) Custom reserved-address IPv4 subnet: for environments that need reserved addresses as targets"
|
||||
FWF_BACK="0) $COMMON_BACK"
|
||||
@@ -21,7 +25,8 @@ FWF_PASS_WORD="not"
|
||||
FWF_COMMON_NOTE="Note:\n"
|
||||
FWF_MIX_NOTE="In MIX mode, non-common port traffic from fake-ip sources will not be filtered"
|
||||
FWF_ALLOWED_PORTS="Currently allowed ports: "
|
||||
FWF_PORT_MENU_1="1) Enable/disable port filtering: \t\033[36m$common_ports\033[0m"
|
||||
FWF_PORT_MENU_1_PREFIX="1) Enable/disable port filtering: \t"
|
||||
FWF_PORT_MENU_1_SUFFIX=""
|
||||
FWF_PORT_MENU_2="2) Add allowed port"
|
||||
FWF_PORT_MENU_3="3) Remove specified allowed port"
|
||||
FWF_PORT_MENU_4="4) Reset default allowed ports"
|
||||
@@ -76,7 +81,8 @@ FWF_FILTER_BLACK_DESC="Only the devices in the list bypass the core"
|
||||
FWF_FILTER_WHITE_DESC="Only the devices in the list pass through the core"
|
||||
FWF_FILTER_EXISTED="Currently filtered devices:"
|
||||
FWF_FILTER_HEADER=" \033[36mDevice MAC/IP\033[0m \033[35mDevice name\033[0m"
|
||||
FWF_FILTER_SWITCH="1) Switch to \033[33m$fw_filter_lan_over mode\033[0m"
|
||||
FWF_FILTER_SWITCH_PREFIX="1) Switch to "
|
||||
FWF_FILTER_SWITCH_SUFFIX=" mode"
|
||||
FWF_FILTER_ADD_MAC="2) \033[32mAdd specified device (MAC)\033[0m"
|
||||
FWF_FILTER_ADD_IP="3) \033[32mAdd specified device (IP/subnet)\033[0m"
|
||||
FWF_FILTER_REMOVE="4) \033[36mRemove specified device\033[0m"
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# ===== Common Prompts =====
|
||||
|
||||
MENU_RESTART_NOTICE="Changes have been detected. Please restart the service!"
|
||||
MENU_RESTART_NOW="Restart now"
|
||||
MENU_RESTART_LATER="Not now"
|
||||
|
||||
MENU_PORT_CONFLICT_TITLE="The port is occupied by the following process. The core may fail to start!"
|
||||
MENU_PORT_CONFLICT_HINT="Please modify the default port configuration!"
|
||||
@@ -13,6 +15,8 @@ MENU_CFG_LOADED_OK="Configuration file loaded successfully!"
|
||||
|
||||
MENU_OVERRIDE_WARN="You have disabled configuration overwrite. This will cause many features to be unavailable!"
|
||||
MENU_OVERRIDE_ASK="Cancel the disable setting?"
|
||||
MENU_YES="Yes"
|
||||
MENU_NO="No"
|
||||
|
||||
# ===== Welcome & Status =====
|
||||
MENU_WELCOME="Welcome to ShellCrash!"
|
||||
@@ -37,6 +41,8 @@ MENU_TG_CHANNEL="Telegram Channel: "
|
||||
# ===== /tmp File Detection =====
|
||||
MENU_TMP_CORE_FOUND="Available core file found:"
|
||||
MENU_TMP_CORE_ASK="Load this core file? (The current service will be stopped)"
|
||||
MENU_LOAD_NOW="Load now"
|
||||
MENU_LOAD_LATER="Not now"
|
||||
|
||||
MENU_TMP_CFG_FOUND="Kernel configuration file found:"
|
||||
MENU_TMP_CFG_ASK="Load as the configuration file? (1/0) > "
|
||||
|
||||
@@ -10,7 +10,8 @@ OVR_PROMPT="Please enter> "
|
||||
OVR_GROUPS_CHOOSE_TYPE="Please choose the proxy group type:"
|
||||
OVR_GROUP_TYPE_CN="Manual Select Auto Select Failover Load Balance"
|
||||
OVR_WARN_1="This feature may cause serious problems! Most script functions will be disabled after enabling it!!!"
|
||||
OVR_WARN_2="If you are not very familiar with how $crashcore works, do not enable it!"
|
||||
OVR_WARN_2_PREFIX="If you are not very familiar with how "
|
||||
OVR_WARN_2_SUFFIX=" works, do not enable it!"
|
||||
OVR_WARN_3="If any problem occurs after continuing, you must solve it yourself. No questions will be accepted!"
|
||||
OVR_WARN_CONFIRM="1) I confirm I can solve any problems myself"
|
||||
OVR_CONFIRM_YES="1) Yes"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
# 检查配置文件
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
[ -f "$CRASHDIR"/configs/ShellCrash.cfg ] || . "$CRASHDIR"/init.sh >/dev/null 2>&1
|
||||
. "$CRASHDIR"/configs/command.env >/dev/null 2>&1
|
||||
. "$CRASHDIR"/configs/ShellCrash.cfg
|
||||
@@ -20,3 +21,4 @@ routing_mark=$((fwmark + 2))
|
||||
}
|
||||
[ -z "$dns_fallback" ] && dns_fallback="1.1.1.1, 8.8.8.8"
|
||||
[ -z "$dns_resolver" ] && dns_resolver="223.5.5.5, 2400:3200::1"
|
||||
[ -z "$dns_proxy_server" ] && dns_proxy_server="$dns_resolver"
|
||||
|
||||
@@ -3,6 +3,6 @@ load_lang() {
|
||||
i18n=$(cat "$CRASHDIR"/configs/i18n.cfg 2>/dev/null)
|
||||
[ -z "$i18n" ] && i18n=chs
|
||||
|
||||
file="$CRASHDIR/lang/$i18n/$1.lang"
|
||||
[ -s "$file" ] && . "$file"
|
||||
i18n_file="$CRASHDIR/lang/$i18n/$1.lang"
|
||||
[ -s "$i18n_file" ] && . "$i18n_file"
|
||||
}
|
||||
@@ -4,6 +4,7 @@ crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}'| tr -
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron"
|
||||
[ -z "$USER" ] && USER=$(whoami 2>/dev/null)
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
tmpcron=/tmp/cron_tmp
|
||||
touch "$tmpcron"
|
||||
|
||||
@@ -32,7 +33,8 @@ cronset() { #定时任务设置
|
||||
cronadd "$tmpcron"
|
||||
#华硕/Padavan固件存档在本地,其他则删除
|
||||
if [ -d /jffs ] || [ -d /etc/storage/ShellCrash ];then
|
||||
mv -f "$tmpcron" "$CRASHDIR"/task/cron
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
mv -f "$tmpcron" "$TASKCFGDIR"/cron
|
||||
else
|
||||
rm -f "$tmpcron"
|
||||
fi
|
||||
|
||||
@@ -7,9 +7,9 @@ get_bin() { #专用于项目内部文件的下载
|
||||
echo "$2" | grep -q '^bin/' && rt=update #/bin文件改为在update分支下载
|
||||
echo "$2" | grep -qE '^public/|^rules/' && rt=dev #/public和/rules文件改为在dev分支下载
|
||||
if [ "$url_id" = 101 -o "$url_id" = 104 ]; then
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers.list | awk '{print $3}')@$rt/$2" #jsdelivr特殊处理
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers_chs.list | awk '{print $3}')@$rt/$2" #jsdelivr特殊处理
|
||||
else
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers.list | awk '{print $3}')/$rt/$2"
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers_chs.list | awk '{print $3}')/$rt/$2"
|
||||
fi
|
||||
else
|
||||
bin_url="$update_url/$2"
|
||||
|
||||
@@ -1,32 +1,42 @@
|
||||
get_save() { #获取面板信息并内部处理所有异常
|
||||
local response exit_code
|
||||
if curl --version >/dev/null 2>&1; then
|
||||
response=$(curl -sf -H "Authorization: Bearer ${secret}" -H "Content-Type:application/json" "$1" 2>&1)
|
||||
exit_code=$?
|
||||
[ $exit_code -eq 0 ] && [ -n "$response" ] && [ "$response" != "{}" ] && {
|
||||
echo "$response"
|
||||
return 0
|
||||
}
|
||||
return 1
|
||||
elif [ -n "$(wget --help 2>&1 | grep '\-\-method')" ]; then
|
||||
response=$(wget -q --header="Authorization: Bearer ${secret}" --header="Content-Type:application/json" -O - "$1" 2>&1)
|
||||
exit_code=$?
|
||||
[ $exit_code -eq 0 ] && [ -n "$response" ] && [ "$response" != "{}" ] && {
|
||||
echo "$response"
|
||||
return 0
|
||||
}
|
||||
return 1
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
#
|
||||
get_save() { #获取面板信息
|
||||
if curl --version >/dev/null 2>&1; then
|
||||
curl -s -H "Authorization: Bearer ${secret}" -H "Content-Type:application/json" "$1"
|
||||
elif [ -n "$(wget --help 2>&1 | grep '\-\-method')" ]; then
|
||||
wget -q --header="Authorization: Bearer ${secret}" --header="Content-Type:application/json" -O - "$1"
|
||||
fi
|
||||
}
|
||||
web_save() { #最小化保存面板节点选择
|
||||
#使用get_save获取面板节点设置
|
||||
get_save "http://127.0.0.1:${db_port}/proxies" | sed 's/{}//g' | sed 's/:{/\
|
||||
/g'| grep -aE '"Selector"' >"$TMPDIR"/web_proxies
|
||||
[ -s "$TMPDIR"/web_proxies ] && while read line; do
|
||||
def=$(echo $line | grep -oE '"all".*",' | awk -F "[\"]" '{print $4}')
|
||||
now=$(echo $line | grep -oE '"now".*",' | awk -F "[\"]" '{print $4}')
|
||||
[ "$def" != "$now" ] && {
|
||||
name=$(echo $line | grep -oE '"name".*",' | awk -F "[\"]" '{print $4}')
|
||||
echo "${name},${now}" >>"$TMPDIR"/web_save
|
||||
}
|
||||
done <"$TMPDIR"/web_proxies
|
||||
rm -rf "$TMPDIR"/web_proxies
|
||||
#对比文件,如果有变动则写入磁盘,否则清除缓存
|
||||
for file in web_save; do
|
||||
if [ -s "$TMPDIR/$file" ]; then
|
||||
. "$CRASHDIR"/libs/compare.sh && compare "$TMPDIR/$file" "$CRASHDIR/configs/$file"
|
||||
[ "$?" = 0 ] && rm -f "$TMPDIR/$file" || mv -f "$TMPDIR/$file" "$CRASHDIR/configs/$file"
|
||||
else
|
||||
> "$CRASHDIR/configs/$file" #空文件时移除旧文件
|
||||
fi
|
||||
done
|
||||
#使用get_save获取面板节点设置,失败自动退出
|
||||
response=$(get_save "http://127.0.0.1:${db_port}/proxies") || return 1
|
||||
|
||||
echo "$response" | sed 's/{}//g' | sed 's/:{/\
|
||||
/g' | grep -aE '"Selector"' >"$TMPDIR"/web_proxies
|
||||
|
||||
>"$TMPDIR"/web_save
|
||||
[ -s "$TMPDIR"/web_proxies ] && while read line; do
|
||||
def=$(echo "$line" | grep -oE '"all".*",' | awk -F "[\"]" '{print $4}')
|
||||
now=$(echo "$line" | grep -oE '"now".*",' | awk -F "[\"]" '{print $4}')
|
||||
[ "$def" != "$now" ] && {
|
||||
name=$(echo "$line" | grep -oE '"name".*",' | awk -F "[\"]" '{print $4}')
|
||||
echo "${name},${now}" >>"$TMPDIR"/web_save
|
||||
}
|
||||
done <"$TMPDIR"/web_proxies
|
||||
rm -f "$TMPDIR"/web_proxies
|
||||
. "$CRASHDIR"/libs/compare.sh && compare "$TMPDIR"/web_save "$CRASHDIR"/configs/web_save
|
||||
[ "$?" = 0 ] && rm -f "$TMPDIR"/web_save || mv -f "$TMPDIR"/web_save "$CRASHDIR"/configs/web_save
|
||||
}
|
||||
|
||||
@@ -33,8 +33,8 @@ load_lang menu
|
||||
|
||||
checkrestart() {
|
||||
comp_box "\033[32m$MENU_RESTART_NOTICE\033[0m"
|
||||
btm_box "1) 立即重启" \
|
||||
"0) 暂不重启"
|
||||
btm_box "1) $MENU_RESTART_NOW" \
|
||||
"0) $MENU_RESTART_LATER"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
start_service
|
||||
@@ -144,20 +144,21 @@ ckstatus() {
|
||||
|
||||
# 检查/tmp内核文件
|
||||
for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -Ev ".*(zip|7z|tar)$" | grep -iE 'CrashCore|^clash$|^clash-linux.*|^mihomo.*|^sing.*box'); do
|
||||
comp_box "$MENU_TMP_CORE_FOUND \033[36m/tmp/$file\033[0m" \
|
||||
local tmp_file="/tmp/$file"
|
||||
comp_box "$MENU_TMP_CORE_FOUND \033[36m$tmp_file\033[0m" \
|
||||
"$MENU_TMP_CORE_ASK"
|
||||
btm_box "1) 立即加载" \
|
||||
"0) 暂不加载"
|
||||
btm_box "1) $MENU_LOAD_NOW" \
|
||||
"0) $MENU_LOAD_LATER"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && {
|
||||
zip_type=$(echo "$file" | grep -oE 'tar.gz$|upx$|gz$')
|
||||
zip_type=$(echo "$tmp_file" | grep -oE 'tar.gz$|upx$|gz$')
|
||||
. "$CRASHDIR"/menus/9_upgrade.sh && setcoretype
|
||||
. "$CRASHDIR"/libs/core_tools.sh && core_check "/tmp/$file"
|
||||
. "$CRASHDIR"/libs/core_tools.sh && core_check "$tmp_file"
|
||||
if [ "$?" = 0 ] && [ -n "$crashcore" ]; then
|
||||
msg_alert "\033[32m$MENU_CORE_LOADED_OK\033[0m"
|
||||
switch_core
|
||||
else
|
||||
rm -rf /tmp/"$file"
|
||||
rm -rf "$tmp_file"
|
||||
msg_alert "\033[33m$MENU_CORE_LOADED_BAD\033[0m" \
|
||||
"\033[33m$MENU_CORE_REMOVED\033[0m"
|
||||
fi
|
||||
@@ -166,17 +167,17 @@ ckstatus() {
|
||||
|
||||
# 检查/tmp配置文件
|
||||
for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -iE 'config.yaml$|config.yml$|config.json$'); do
|
||||
tmp_file=/tmp/$file
|
||||
comp_box "$MENU_TMP_CFG_FOUND\033[36m/tmp/$file\033[0m" \
|
||||
local tmp_file="/tmp/$file"
|
||||
comp_box "$MENU_TMP_CFG_FOUND\033[36m$tmp_file\033[0m" \
|
||||
"$MENU_TMP_CFG_ASK"
|
||||
btm_box "1) 立即加载" \
|
||||
"0) 暂不加载"
|
||||
btm_box "1) $MENU_LOAD_NOW" \
|
||||
"0) $MENU_LOAD_LATER"
|
||||
read -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && {
|
||||
if [ -n "$(echo /tmp/$file | grep -iE '.json$')" ]; then
|
||||
mv -f /tmp/$file "$CRASHDIR"/jsons/config.json
|
||||
if [ -n "$(echo $tmp_file | grep -iE '.json$')" ]; then
|
||||
mv -f "$tmp_file" "$CRASHDIR"/jsons/config.json
|
||||
else
|
||||
mv -f /tmp/$file "$CRASHDIR"/yamls/config.yaml
|
||||
mv -f "$tmp_file" "$CRASHDIR"/yamls/config.yaml
|
||||
fi
|
||||
msg_alert "\033[32m$MENU_CFG_LOADED_OK\033[0m "
|
||||
}
|
||||
@@ -186,8 +187,8 @@ ckstatus() {
|
||||
[ "$disoverride" = "1" ] && {
|
||||
comp_box "\033[33m$MENU_OVERRIDE_WARN\033[0m" \
|
||||
"$MENU_OVERRIDE_ASK"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
btm_box "1) $MENU_YES" \
|
||||
"0) $MENU_NO"
|
||||
read -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && unset disoverride && setconfig disoverride
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ settings() {
|
||||
comp_box "\033[30;47m$SET_MENU_TITLE\033[0m"
|
||||
content_line "1) $SET_MENU_REDIR\t\033[36m$redir_mod$MENU_MOD\033[0m"
|
||||
content_line "2) $SET_MENU_DNS\t\033[36m$dns_mod\033[0m"
|
||||
content_line "3) $SET_MENU_FW_FILTER"
|
||||
content_line "3) $SET_MENU_FW_FILTER\t$SET_MENU_FW_FILTER_DESC"
|
||||
[ "$disoverride" != "1" ] && {
|
||||
content_line "4) $SET_MENU_SKIP_CERT\t\033[36m$skip_cert\033[0m"
|
||||
content_line "5) $SET_MENU_SNIFFER\t\033[36m$sniffer\033[0m"
|
||||
@@ -203,8 +203,8 @@ settings() {
|
||||
exit 0
|
||||
;;
|
||||
b)
|
||||
comp_box "1) $SET_LANG_ZH" \
|
||||
"2) $SET_LANG_EN" \
|
||||
comp_box "1) 简体中文" \
|
||||
"2) English" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -265,6 +265,7 @@ set_redir_mod() {
|
||||
[ -z "$firewall_area" ] && firewall_area=1
|
||||
[ "$firewall_area" = 4 ] && redir_mod="$MENU_PURE_MOD"
|
||||
[ -z "$redir_mod" ] && redir_mod='Redir'
|
||||
[ -z "$vm_redir" ] && vm_redir='OFF'
|
||||
firewall_area_dsc=$(echo "$SET_FW_AREA_DESC($bypass_host)" | cut -d'|' -f$firewall_area)
|
||||
comp_box "\033[33m$SET_REDIR_RESTART_HINT\033[0m" \
|
||||
"$SET_REDIR_CURRENT\033[47;30m$redir_mod$MENU_MOD\033[0m; $SET_CORE_CURRENT\033[47;30m$crashcore\033[0m"
|
||||
@@ -550,7 +551,6 @@ set_adv_config() {
|
||||
|
||||
set_firewall_area() {
|
||||
while true; do
|
||||
[ -z "$vm_redir" ] && vm_redir='OFF'
|
||||
comp_box "\033[33m$FW_AREA_NOTE_1\033[0m" \
|
||||
"\033[33m$FW_AREA_NOTE_2\033[0m" \
|
||||
"" \
|
||||
|
||||
@@ -7,6 +7,7 @@ __IS_MODULE_5_TASK_LOADED=1
|
||||
# 通用工具
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/set_cron.sh
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
|
||||
load_lang 5_task
|
||||
|
||||
@@ -32,7 +33,8 @@ set_cron() {
|
||||
|
||||
set_service() {
|
||||
# 参数1代表要任务类型,参数2代表任务ID,参数3代表任务描述,参数4代表running任务cron时间
|
||||
task_file="$CRASHDIR"/task/$1
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
task_file="$TASKCFGDIR"/$1
|
||||
[ -s "$task_file" ] && sed -i "/$3/d" "$task_file"
|
||||
# 运行时每分钟执行的任务特殊处理
|
||||
if [ "$1" = "running" ]; then
|
||||
@@ -53,7 +55,7 @@ task_user_add() {
|
||||
while true; do
|
||||
comp_box "\033[33m$TASK5_USER_ADD_HINT1\033[0m" \
|
||||
"\033[36m$TASK5_USER_ADD_HINT2\033[0m" \
|
||||
"$TASK5_USER_ADD_HINT3\033[32m${CRASHDIR}/task/task.user\033[0m$TASK5_USER_ADD_HINT4"
|
||||
"$TASK5_USER_ADD_HINT3\033[32m${TASKCFGDIR}/task.user\033[0m$TASK5_USER_ADD_HINT4"
|
||||
btm_box "\033[36m$TASK5_INPUT_CMD\033[0m" \
|
||||
"$TASK5_OR_BACK"
|
||||
read -r -p "$TASK5_INPUT> " script
|
||||
@@ -63,12 +65,12 @@ task_user_add() {
|
||||
task_command=$script
|
||||
comp_box "$TASK5_CHECK_INPUT\033[32m$task_command\033[0m"
|
||||
# 获取本任务ID
|
||||
task_max_id=$(awk -F '#' '{print $1}' "$CRASHDIR"/task/task.user 2>/dev/null | sort -n | tail -n 1)
|
||||
task_max_id=$(awk -F '#' '{print $1}' "$TASKCFGDIR"/task.user 2>/dev/null | sort -n | tail -n 1)
|
||||
[ -z "$task_max_id" ] && task_max_id=200
|
||||
task_id=$((task_max_id + 1))
|
||||
read -r -p "$TASK5_INPUT_REMARK> " txt
|
||||
[ -n "$txt" ] && task_name=$txt || task_name="$TASK5_CUSTOM_TASK$task_id"
|
||||
echo "$task_id#$task_command#$task_name" >>"$CRASHDIR"/task/task.user
|
||||
echo "$task_id#$task_command#$task_name" >>"$TASKCFGDIR"/task.user
|
||||
msg_alert "\033[32m$TASK5_CUSTOM_ADDED\033[0m"
|
||||
break
|
||||
else
|
||||
@@ -80,10 +82,10 @@ task_user_add() {
|
||||
# 自定义命令删除
|
||||
task_user_del() {
|
||||
while true; do
|
||||
if grep -Evq '^#' "$CRASHDIR/task/task.user" 2>/dev/null; then
|
||||
if grep -Evq '^#' "$TASKCFGDIR/task.user" 2>/dev/null; then
|
||||
comp_box "$TASK5_USER_DEL_HINT1" \
|
||||
"$TASK5_USER_DEL_HINT2\033[32m${CRASHDIR}/task/task.user\033[0m"
|
||||
grep -Ev '^#' "$CRASHDIR/task/task.user" 2>/dev/null |
|
||||
"$TASK5_USER_DEL_HINT2\033[32m${TASKCFGDIR}/task.user\033[0m"
|
||||
grep -Ev '^#' "$TASKCFGDIR/task.user" 2>/dev/null |
|
||||
awk -F '#' '{print $1") "$3}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
@@ -94,7 +96,7 @@ task_user_del() {
|
||||
if [ "$num" = 0 ]; then
|
||||
break
|
||||
elif [ -n "$num" ]; then
|
||||
sed -i "/^$num#/d" "$CRASHDIR"/task/task.user 2>/dev/null
|
||||
sed -i "/^$num#/d" "$TASKCFGDIR"/task.user 2>/dev/null
|
||||
common_success
|
||||
else
|
||||
msg_alert "\033[31m$TASK5_INPUT_ERROR\033[0m"
|
||||
@@ -111,7 +113,7 @@ task_add() {
|
||||
while true; do
|
||||
comp_box "\033[36m$TASK5_SELECT_ADD\033[0m"
|
||||
# 输出任务列表
|
||||
list=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print $3}')
|
||||
list=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print $3}')
|
||||
list_box "$list"
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -122,8 +124,8 @@ task_add() {
|
||||
;;
|
||||
[1-9] | [1-9][0-9])
|
||||
if [ "$num" -le "$(echo "$list" | wc -l)" ]; then
|
||||
task_id=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
|
||||
task_id=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
|
||||
task_type
|
||||
break
|
||||
else
|
||||
@@ -142,11 +144,11 @@ task_del() {
|
||||
# 删除定时任务
|
||||
cronset "$1"
|
||||
# 删除条件任务
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/cron 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/bfstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/afstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/running 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/affirewall 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/cron 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/bfstart 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/afstart 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/running 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/affirewall 2>/dev/null
|
||||
}
|
||||
|
||||
# 任务条件选择菜单
|
||||
@@ -244,8 +246,8 @@ task_manager() {
|
||||
while true; do
|
||||
# 抽取并生成临时列表
|
||||
cronload >"$TMPDIR"/task_cronlist
|
||||
cat "$TMPDIR"/task_cronlist "$CRASHDIR"/task/running 2>/dev/null | sort -u | grep -oE "task/task.sh .*" | cut -d ' ' -f 2- >"$TMPDIR"/task_list
|
||||
cat "$CRASHDIR"/task/bfstart "$CRASHDIR"/task/afstart "$CRASHDIR"/task/affirewall 2>/dev/null | cut -d ' ' -f 2- >>"$TMPDIR"/task_list
|
||||
cat "$TMPDIR"/task_cronlist "$TASKCFGDIR"/running 2>/dev/null | sort -u | grep -oE "task/task.sh .*" | cut -d ' ' -f 2- >"$TMPDIR"/task_list
|
||||
cat "$TASKCFGDIR"/bfstart "$TASKCFGDIR"/afstart "$TASKCFGDIR"/affirewall 2>/dev/null | cut -d ' ' -f 2- >>"$TMPDIR"/task_list
|
||||
cat "$TMPDIR"/task_cronlist 2>/dev/null | sort -u | grep -oE " #.*" | grep -v "$TASK5_GUARD_WORD" | awk -F '#' '{print "0 '$TASK5_OLD_PREFIX'"$2}' >>"$TMPDIR"/task_list
|
||||
sed -i '/^ *$/d' "$TMPDIR"/task_list
|
||||
rm -rf "$TMPDIR"/task_cronlist
|
||||
@@ -286,13 +288,13 @@ task_manager() {
|
||||
if [ "$res" = 1 ]; then
|
||||
cronname=$(echo "$task_txt" | awk -F '-' '{print $2}')
|
||||
cronset "$cronname"
|
||||
sed -i "/$cronname/d" "$CRASHDIR"/task/cron 2>/dev/null
|
||||
sed -i "/$cronname/d" "$TASKCFGDIR"/cron 2>/dev/null
|
||||
|
||||
break
|
||||
fi
|
||||
else
|
||||
task_des=$(echo "$task_txt" | awk '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $3}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $3}')
|
||||
comp_box "$TASK5_CURRENT_TASK\033[36m$task_des\033[0m"
|
||||
btm_box "1) $TASK5_EDIT_TASK" \
|
||||
"2) $TASK5_DEL_TASK" \
|
||||
@@ -313,7 +315,7 @@ task_manager() {
|
||||
common_success
|
||||
;;
|
||||
3)
|
||||
task_command=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $2}')
|
||||
task_command=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $2}')
|
||||
eval "$task_command" && task_res="$TASK5_RUN_OK" || task_res="$TASK5_RUN_FAIL"
|
||||
msg_alert "\033[33m$TASK5_TASK_PREFIX$task_des】$task_res\033[0m"
|
||||
;;
|
||||
@@ -367,7 +369,8 @@ task_recom() {
|
||||
task_menu() {
|
||||
while true; do
|
||||
# 检测并创建自定义任务文件
|
||||
[ -f "$CRASHDIR"/task/task.user ] || echo "$TASK5_USER_FILE_HEADER" >"$CRASHDIR"/task/task.user
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
[ -f "$TASKCFGDIR"/task.user ] || echo "$TASK5_USER_FILE_HEADER" >"$TASKCFGDIR"/task.user
|
||||
comp_box "\033[30;47m$TASK5_MENU_TITLE\033[0m"
|
||||
btm_box "1) $TASK5_MENU_1" \
|
||||
"2) $TASK5_MENU_2" \
|
||||
|
||||
@@ -143,9 +143,9 @@ setproviders() {
|
||||
content_line "d) $CORECFG_DEL_PROVIDER"
|
||||
content_line ""
|
||||
content_line "\033[36m$CORECFG_MORE_CONFIG_HINT\033[0m"
|
||||
[ -n "$link" ] &&
|
||||
[ -n "$2" ] &&
|
||||
content_line "b) $CORECFG_GEN_LOCAL_ONE"
|
||||
echo "$link$link_uri" | grep -q '://' &&
|
||||
echo "$2" | grep -q '://' &&
|
||||
content_line "c) $CORECFG_GEN_ONLINE_ONE"
|
||||
echo "$link" | grep -q '^http' &&
|
||||
content_line "e) $CORECFG_GET_ONLINE_DIRECT"
|
||||
|
||||
@@ -19,9 +19,9 @@ ssh_tools() {
|
||||
[ -z "$ssh_port" ] && ssh_port=10022
|
||||
comp_box "\033[33m$TOOLS_SSH_ONLY_OPENWRT\033[0m" \
|
||||
"\033[31m$TOOLS_SSH_UNSUPPORTED_SYSTEM\033[0m"
|
||||
btm_box "$TOOLS_SSH_PORT_ITEM" \
|
||||
btm_box "${TOOLS_SSH_PORT_ITEM_PREFIX}\033[36m$ssh_port\033[0m${TOOLS_SSH_PORT_ITEM_SUFFIX}" \
|
||||
"$TOOLS_SSH_PASS_ITEM" \
|
||||
"$TOOLS_SSH_TOGGLE_ITEM" \
|
||||
"${TOOLS_SSH_TOGGLE_ITEM_PREFIX}\033[33m$ssh_ol\033[0m${TOOLS_SSH_TOGGLE_ITEM_SUFFIX}" \
|
||||
"" \
|
||||
"0) $COMMON_BACK \033[0m"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -88,9 +88,9 @@ tools() {
|
||||
content_line "$TOOLS_MENU_GUIDE_ITEM"
|
||||
content_line "$TOOLS_MENU_LOG_ITEM"
|
||||
[ -f /etc/firewall.user ] && content_line "$TOOLS_MENU_SSH_ITEM"
|
||||
[ -x /usr/sbin/otapredownload ] && content_line "$TOOLS_MENU_MI_UPDATE_ITEM"
|
||||
[ "$systype" = "mi_snapshot" ] && content_line "$TOOLS_MENU_MI_AUTO_SSH_ITEM"
|
||||
[ "$systype" = "mi_snapshot" ] && content_line "$TOOLS_MENU_MI_TUN_FIX_ITEM"
|
||||
[ -x /usr/sbin/otapredownload ] && content_line "${TOOLS_MENU_MI_UPDATE_ITEM_PREFIX}\033[33m$mi_update\033[0m${TOOLS_MENU_MI_UPDATE_ITEM_SUFFIX}"
|
||||
[ "$systype" = "mi_snapshot" ] && content_line "${TOOLS_MENU_MI_AUTO_SSH_ITEM_PREFIX}\033[$mi_mi_autoSSH_type \033[0m${TOOLS_MENU_MI_AUTO_SSH_ITEM_SUFFIX}"
|
||||
[ "$systype" = "mi_snapshot" ] && content_line "${TOOLS_MENU_MI_TUN_FIX_ITEM_PREFIX}\033[$mi_tunfix \033[0m${TOOLS_MENU_MI_TUN_FIX_ITEM_SUFFIX}"
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -123,7 +123,8 @@ tools() {
|
||||
sed -i "/^\s*#.*otapredownload/ s/^\s*#//" /etc/crontabs/root ||
|
||||
echo "15 3,4,5 * * * /usr/sbin/otapredownload >/dev/null 2>&1" >>/etc/crontabs/root
|
||||
fi
|
||||
msg_alert "\033[32m$TOOLS_MI_UPDATE_MSG"
|
||||
[ "$mi_update" = "$TOOLS_DISABLE" ] && mi_update=$TOOLS_ENABLE || mi_update=$TOOLS_DISABLE
|
||||
msg_alert "\033[32m${TOOLS_MI_UPDATE_MSG_PREFIX}\033[33m$mi_update\033[0m${TOOLS_MI_UPDATE_MSG_SUFFIX}\033[0m"
|
||||
fi
|
||||
;;
|
||||
6)
|
||||
@@ -227,17 +228,17 @@ log_pusher() {
|
||||
[ -n "$push_Gotify" ] && stat_Gotify=32mON || stat_Gotify=33mOFF
|
||||
[ "$task_push" = 1 ] && stat_task=32mON || stat_task=33mOFF
|
||||
[ -n "$device_name" ] && device_s=32m$device_name || device_s=33m$COMMON_UNSET
|
||||
comp_box "$TOOLS_LOG_TG" \
|
||||
"$TOOLS_LOG_DEER" \
|
||||
"$TOOLS_LOG_BARK" \
|
||||
"$TOOLS_LOG_PO" \
|
||||
"$TOOLS_LOG_PP" \
|
||||
"$TOOLS_LOG_SYNO" \
|
||||
"$TOOLS_LOG_GOTIFY" \
|
||||
comp_box "${TOOLS_LOG_TG_PREFIX}\033[$stat_TG\033[0m${TOOLS_LOG_TG_SUFFIX}" \
|
||||
"${TOOLS_LOG_DEER_PREFIX}\033[$stat_Deer\033[0m${TOOLS_LOG_DEER_SUFFIX}" \
|
||||
"${TOOLS_LOG_BARK_PREFIX}\033[$stat_bark\033[0m${TOOLS_LOG_BARK_SUFFIX}" \
|
||||
"${TOOLS_LOG_PO_PREFIX}\033[$stat_Po\033[0m${TOOLS_LOG_PO_SUFFIX}" \
|
||||
"${TOOLS_LOG_PP_PREFIX}\033[$stat_PP\033[0m${TOOLS_LOG_PP_SUFFIX}" \
|
||||
"${TOOLS_LOG_SYNO_PREFIX}\033[$stat_SynoChat\033[0m${TOOLS_LOG_SYNO_SUFFIX}" \
|
||||
"${TOOLS_LOG_GOTIFY_PREFIX}\033[$stat_Gotify\033[0m${TOOLS_LOG_GOTIFY_SUFFIX}" \
|
||||
"" \
|
||||
"$TOOLS_LOG_VIEW" \
|
||||
"$TOOLS_LOG_TASK" \
|
||||
"$TOOLS_LOG_DEVICE" \
|
||||
"${TOOLS_LOG_TASK_PREFIX}\033[$stat_task\033[0m${TOOLS_LOG_TASK_SUFFIX}" \
|
||||
"${TOOLS_LOG_DEVICE_PREFIX}\033[$device_s\033[0m${TOOLS_LOG_DEVICE_SUFFIX}" \
|
||||
"$TOOLS_LOG_CLEAR" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -685,18 +686,18 @@ testcommand() {
|
||||
debug() {
|
||||
echo "$crashcore" | grep -q 'singbox' && config_tmp="$TMPDIR"/jsons || config_tmp="$TMPDIR"/config.yaml
|
||||
comp_box "\033[36m$TOOLS_DEBUG_WARN1\033[0m" \
|
||||
"$TOOLS_DEBUG_WARN2" \
|
||||
"${TOOLS_DEBUG_WARN2_PREFIX}\033[32m$TMPDIR/debug.log\033[0m${TOOLS_DEBUG_WARN2_SUFFIX}" \
|
||||
"$TOOLS_DEBUG_WARN3" \
|
||||
"$TOOLS_DEBUG_WARN4"
|
||||
content_line "$TOOLS_DEBUG_ITEM_1"
|
||||
content_line "$TOOLS_DEBUG_ITEM_2"
|
||||
content_line "${TOOLS_DEBUG_ITEM_1_PREFIX}\033[32m$config_tmp\033[0m${TOOLS_DEBUG_ITEM_1_SUFFIX}"
|
||||
content_line "${TOOLS_DEBUG_ITEM_2_PREFIX}\033[32m$config_tmp\033[0m${TOOLS_DEBUG_ITEM_2_SUFFIX}"
|
||||
content_line "$TOOLS_DEBUG_ITEM_3"
|
||||
content_line "$TOOLS_DEBUG_ITEM_4"
|
||||
content_line "$TOOLS_DEBUG_ITEM_5"
|
||||
content_line "$TOOLS_DEBUG_ITEM_6"
|
||||
content_line "${TOOLS_DEBUG_ITEM_6_PREFIX}\033[32m$CRASHDIR/debug.log\033[0m${TOOLS_DEBUG_ITEM_6_SUFFIX}"
|
||||
content_line ""
|
||||
content_line "$TOOLS_DEBUG_ITEM_8"
|
||||
[ -s "$TMPDIR"/jsons/inbounds.json ] && content_line "$TOOLS_DEBUG_ITEM_9"
|
||||
[ -s "$TMPDIR"/jsons/inbounds.json ] && content_line "${TOOLS_DEBUG_ITEM_9_PREFIX}\033[32m$config_tmp\033[0m${TOOLS_DEBUG_ITEM_9_SUFFIX}\033[32m$TMPDIR/debug.json\033[0m"
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -765,4 +766,3 @@ debug() {
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
@@ -300,11 +300,11 @@ getcore() {
|
||||
# 获取在线内核文件
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "$UPG_GETTING_CORE_TEXT"
|
||||
content_line "${UPG_GETTING_CORE_TEXT_PREFIX}${crashcore}${UPG_GETTING_CORE_TEXT_SUFFIX}"
|
||||
core_webget
|
||||
case "$?" in
|
||||
0)
|
||||
content_line "\033[32m$UPG_CORE_DOWNLOAD_OK_TEXT\033[0m"
|
||||
content_line "\033[32m${UPG_CORE_DOWNLOAD_OK_TEXT_PREFIX}${crashcore}${UPG_CORE_DOWNLOAD_OK_TEXT_SUFFIX}\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
switch_core
|
||||
@@ -338,7 +338,7 @@ checkcustcore() {
|
||||
release_date=$(cat "$TMPDIR"/github_api | grep '"published_at":' | awk -F '"' '{print $4}')
|
||||
update_date=$(cat "$TMPDIR"/github_api | grep '"updated_at":' | head -n 1 | awk -F '"' '{print $4}')
|
||||
echo "$cpucore" | grep -q 'mips' && cpu_type=mips || cpu_type=$cpucore
|
||||
cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE "https://github.com/${project}/releases/download.*linux.*${cpu_type}.*\.gz\"$" | sed 's/"//' >"$TMPDIR"/core.list
|
||||
cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE "https://github.com/${project}/releases/download.*linux.*${cpu_type}.*\.(gz|upx)\"$" | sed 's/"//' >"$TMPDIR"/core.list
|
||||
rm -rf "$TMPDIR"/github_api
|
||||
|
||||
if [ -s "$TMPDIR"/core.list ]; then
|
||||
@@ -391,6 +391,7 @@ checkcustcore() {
|
||||
setcustcore() {
|
||||
while true; do
|
||||
[ -z "$cpucore" ] && check_cpucore
|
||||
[ -n "$custcorelink" ] && custcore="$(echo "$custcorelink" | sed 's#.*github.com##; s#/releases/download/#@#')"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[36m$UPG_CUSTOM_CORE_SOURCE\033[0m"
|
||||
@@ -398,16 +399,17 @@ setcustcore() {
|
||||
content_line "\033[31m$UPG_CUSTOM_CORE_TASK_WARN\033[0m"
|
||||
content_line "\033[32m$UPG_CUSTOM_CORE_NET_WARN\033[0m"
|
||||
[ -n "$custcore" ] && {
|
||||
content_line "$UPG_CUSTOM_CORE_CURRENT_TEXT\033[36m$custcore\033[0m"
|
||||
content_line "$UPG_CUSTOM_CORE_CURRENT\033[36m$custcore\033[0m"
|
||||
}
|
||||
separator_line "="
|
||||
content_line "$UPG_CUSTOM_CORE_SELECT"
|
||||
separator_line "-"
|
||||
btm_box "$UPG_CORE_MENU_1" \
|
||||
"$UPG_CORE_MENU_2" \
|
||||
"$UPG_CORE_MENU_3" \
|
||||
"$UPG_CORE_MENU_4" \
|
||||
"$UPG_CORE_MENU_9" \
|
||||
btm_box "1) \033[36mMetaCubeX/mihomo\033[32m@release\033[0m$UPG_CUSTOM_CORE_MENU_OFFICIAL" \
|
||||
"2) \033[36mvernesong/mihomo\033[32m@alpha\033[0m$UPG_CUSTOM_CORE_MENU_ALPHA" \
|
||||
"3) \033[36mSagerNet/sing-box\033[32m@release\033[0m$UPG_CUSTOM_CORE_MENU_OFFICIAL" \
|
||||
"4) \033[36mDustinWin/mihomo\033[0m$UPG_CUSTOM_CORE_MENU_MULTI" \
|
||||
"5) \033[36mDustinWin/sing-boxr\033[0m$UPG_CUSTOM_CORE_MENU_MULTI" \
|
||||
"9) $UPG_CUSTOM_CORE_LINK_MENU" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -434,9 +436,15 @@ setcustcore() {
|
||||
checkcustcore
|
||||
;;
|
||||
4)
|
||||
project=juewuy/ShellCrash
|
||||
api_tag=clash.premium.latest
|
||||
crashcore=clashpre
|
||||
project=DustinWin/proxy-tools
|
||||
api_tag=mihomo
|
||||
crashcore=meta
|
||||
checkcustcore
|
||||
;;
|
||||
5)
|
||||
project=DustinWin/proxy-tools
|
||||
api_tag=sing-box
|
||||
crashcore=singboxr
|
||||
checkcustcore
|
||||
;;
|
||||
9)
|
||||
@@ -496,7 +504,6 @@ setcore() {
|
||||
[ -z "$crashcore" ] && crashcore="unknow"
|
||||
[ -z "$zip_type" ] && zip_type="tar.gz"
|
||||
echo "$crashcore" | grep -q 'singbox' && core_old=singbox || core_old=clash
|
||||
[ -n "$custcorelink" ] && custcore="$(echo "$custcorelink" | sed 's#.*github.com##; s#/releases/download/#@#')"
|
||||
|
||||
[ -z "$cpucore" ] && check_cpucore
|
||||
|
||||
@@ -506,22 +513,22 @@ setcore() {
|
||||
"" \
|
||||
"\033[33m$UPG_CORE_MENU_SELECT\033[0m"
|
||||
|
||||
content_line "$UPG_CORE_V1"
|
||||
content_line "${UPG_CORE_V1_PREFIX}${meta_v}${UPG_CORE_V1_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V1_DOC"
|
||||
|
||||
content_line "$UPG_CORE_V2"
|
||||
content_line "${UPG_CORE_V2_PREFIX}${singboxr_v}${UPG_CORE_V2_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V2_DOC"
|
||||
|
||||
[ "$zip_type" = 'upx' ] && {
|
||||
content_line "$UPG_CORE_V3"
|
||||
content_line "${UPG_CORE_V3_PREFIX}${singbox_v}${UPG_CORE_V3_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V3_DOC"
|
||||
}
|
||||
[ "$zip_type" = 'upx' ] && {
|
||||
content_line "$UPG_CORE_V4"
|
||||
content_line "${UPG_CORE_V4_PREFIX}${clash_v}${UPG_CORE_V4_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V4_DOC"
|
||||
}
|
||||
btm_box "$UPG_CORE_MENU_5" \
|
||||
"$UPG_CORE_MENU_6" \
|
||||
btm_box "${UPG_CORE_MENU_5_PREFIX}${zip_type}${UPG_CORE_MENU_5_SUFFIX}" \
|
||||
"${UPG_CORE_MENU_6_PREFIX}${UPG_CORE_MENU_6_SUFFIX}" \
|
||||
"$UPG_CORE_MENU_7" \
|
||||
"$UPG_CORE_MENU_9" \
|
||||
"" \
|
||||
@@ -588,7 +595,7 @@ getgeo() {
|
||||
content_line "$UPG_GEO_GETTING"
|
||||
get_bin "$TMPDIR"/"${geoname}" bin/geodata/"$geotype"
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m$UPG_GEO_FAIL\033[0m"
|
||||
content_line "\033[31m$UPG_DOWNLOAD_FAIL\033[0m"
|
||||
error_down
|
||||
else
|
||||
echo "$geoname" | grep -Eq '.mrs|.srs|.tar.gz' && {
|
||||
@@ -598,7 +605,7 @@ getgeo() {
|
||||
if echo "$geoname" | grep -Eq '.tar.gz'; then
|
||||
tar -zxf "$TMPDIR"/"${geoname}" ${tar_para} -C "$BINDIR"/"${geofile}" >/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
content_line "$UPG_GEO_EXTRACT_FAIL"
|
||||
content_line "$UPG_EXTRACT_FAIL"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
line_break
|
||||
@@ -609,7 +616,7 @@ getgeo() {
|
||||
else
|
||||
mv -f "$TMPDIR"/"${geoname}" "$BINDIR"/"${geofile}""${geoname}"
|
||||
fi
|
||||
content_line "\033[32m$UPG_GEO_OK\033[0m"
|
||||
content_line "\033[32m${UPG_GEO_OK_PREFIX}${geotype}${UPG_GEO_OK_SUFFIX}\033[0m"
|
||||
geo_v="$(echo "$geotype" | awk -F "." '{print $1}')_v"
|
||||
setconfig "$geo_v" "$GeoIP_v"
|
||||
fi
|
||||
@@ -622,7 +629,7 @@ getcustgeo() {
|
||||
content_line "$UPG_GEO_LINKING"
|
||||
webget "$TMPDIR"/"$geoname" "$custgeolink"
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m$UPG_GEO_FAIL\033[0m"
|
||||
content_line "\033[31m$UPG_DOWNLOAD_FAIL\033[0m"
|
||||
error_down
|
||||
else
|
||||
echo "$geoname" | grep -Eq '.mrs|.srs' && {
|
||||
@@ -630,7 +637,7 @@ getcustgeo() {
|
||||
[ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset
|
||||
}
|
||||
mv -f "$TMPDIR"/"${geoname}" "$BINDIR"/"${geofile}""${geoname}"
|
||||
content_line "\033[32m$UPG_GEO_OK\033[0m"
|
||||
content_line "\033[32m${UPG_GEO_OK_PREFIX}${geotype}${UPG_GEO_OK_SUFFIX}\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
sleep 1
|
||||
@@ -818,7 +825,7 @@ setgeo() {
|
||||
;;
|
||||
9)
|
||||
while true; do
|
||||
comp_box "\033[33m$UPG_GEO_CLEAN_HINT1\033[0m" \
|
||||
comp_box "\033[33m${UPG_GEO_CLEAN_HINT1_PREFIX}${CRASHDIR}${UPG_GEO_CLEAN_HINT1_SUFFIX}\033[0m" \
|
||||
"$UPG_GEO_CLEAN_HINT2"
|
||||
btm_box "$UPG_GEO_CLEAN_CONFIRM" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -859,7 +866,7 @@ getdb() {
|
||||
content_line "$UPG_DB_GETTING"
|
||||
get_bin "$TMPDIR"/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m$UPG_GEO_FAIL\033[0m"
|
||||
content_line "\033[31m$UPG_DOWNLOAD_FAIL\033[0m"
|
||||
error_down
|
||||
return 1
|
||||
else
|
||||
@@ -867,7 +874,7 @@ getdb() {
|
||||
mkdir -p "$dbdir" >/dev/null
|
||||
tar -zxf "$TMPDIR/clashdb.tar.gz" ${tar_para} -C "$dbdir" >/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
content_line "$UPG_GEO_EXTRACT_FAIL"
|
||||
content_line "$UPG_EXTRACT_FAIL"
|
||||
separator_line "="
|
||||
line_break
|
||||
sleep 1
|
||||
@@ -912,7 +919,7 @@ dbdir() {
|
||||
fi
|
||||
elif [ -w /www ] && [ -n "$(pidof nginx)" ]; then
|
||||
comp_box "$UPG_DB_DIR_SELECT"
|
||||
btm_box "$UPG_DB_DIR_1" \
|
||||
btm_box "${UPG_DB_DIR_1_PREFIX}${CRASHDIR}${UPG_DB_DIR_1_SUFFIX}" \
|
||||
"$UPG_DB_DIR_2" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -1028,7 +1035,7 @@ getcrt() {
|
||||
content_line "$UPG_DB_GETTING"
|
||||
get_bin "$TMPDIR"/ca-certificates.crt bin/fix/ca-certificates.crt echooff
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m$UPG_GEO_FAIL\033[0m"
|
||||
content_line "\033[31m$UPG_DOWNLOAD_FAIL\033[0m"
|
||||
error_down
|
||||
else
|
||||
[ "$systype" = 'mi_snapshot' ] && cp -f "$TMPDIR"/ca-certificates.crt "$CRASHDIR"/tools #镜像化设备特殊处理
|
||||
|
||||
@@ -185,13 +185,17 @@ set_dns_adv() {
|
||||
"PROXY-DNS:" \
|
||||
"\033[36m$dns_fallback\033[0m" \
|
||||
"" \
|
||||
"DEFAULT-DNS:" \
|
||||
"RESOLVER-DNS:" \
|
||||
"\033[33m$dns_resolver\033[0m" \
|
||||
"" \
|
||||
"PROXY-SERVER-DNS:" \
|
||||
"\033[33m$dns_proxy_server\033[0m" \
|
||||
""
|
||||
btm_box "1) $DNS_ADV_EDIT_DIRECT" \
|
||||
"2) $DNS_ADV_EDIT_PROXY" \
|
||||
"3) $DNS_ADV_EDIT_DEFAULT" \
|
||||
"4) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m" \
|
||||
"3) $DNS_ADV_EDIT_RESOLVER" \
|
||||
"4) $DNS_ADV_EDIT_PROXY_SERVER" \
|
||||
"5) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m" \
|
||||
"9) \033[33m$DNS_ADV_RESET\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -201,9 +205,9 @@ set_dns_adv() {
|
||||
break
|
||||
;;
|
||||
1)
|
||||
comp_box "$DNS_DIRECT_NOW\033[32m$dns_nameserver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_DIRECT_NEW\033[0m" \
|
||||
"$DNS_INPUT_DIRECT_RESET" \
|
||||
comp_box "$DNS_NOW\033[32m$dns_nameserver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -227,9 +231,9 @@ set_dns_adv() {
|
||||
esac
|
||||
;;
|
||||
2)
|
||||
comp_box "$DNS_PROXY_NOW\033[32m$dns_fallback\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_PROXY_NEW\033[0m" \
|
||||
"$DNS_INPUT_PROXY_RESET" \
|
||||
comp_box "$DNS_NOW\033[32m$dns_fallback\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -253,9 +257,9 @@ set_dns_adv() {
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
comp_box "$DNS_DEFAULT_NOW\033[32m$dns_resolver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_DEFAULT_NEW\033[0m" \
|
||||
"$DNS_INPUT_DEFAULT_RESET" \
|
||||
comp_box "$DNS_NOW\033[32m$dns_resolver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
@@ -266,7 +270,7 @@ set_dns_adv() {
|
||||
"r")
|
||||
dns_resolver="223.5.5.5, 2400:3200::1"
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
common_failed
|
||||
common_success
|
||||
;;
|
||||
*)
|
||||
if echo "$res" | grep -qE '://.*::'; then
|
||||
@@ -280,6 +284,33 @@ set_dns_adv() {
|
||||
esac
|
||||
;;
|
||||
4)
|
||||
comp_box "$DNS_NOW\033[32m$dns_proxy_server\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
case "$res" in
|
||||
0)
|
||||
continue
|
||||
;;
|
||||
"r")
|
||||
dns_proxy_server="$dns_resolver"
|
||||
setconfig dns_proxy_server "'$dns_proxy_server'"
|
||||
common_success
|
||||
;;
|
||||
*)
|
||||
if echo "$res" | grep -qE '://.*::'; then
|
||||
msg_alert "\033[31m$DNS_IPV6_NOT_SUPPORT\033[0m"
|
||||
else
|
||||
dns_proxy_server=$(echo "$res" | sed 's#|#,\ #g')
|
||||
setconfig dns_proxy_server "'$dns_proxy_server'"
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
5)
|
||||
line_break
|
||||
separator_line "="
|
||||
if echo "$crashcore" | grep -qE 'meta|singbox'; then
|
||||
|
||||
@@ -12,11 +12,11 @@ set_fw_filter() {
|
||||
[ -z "$quic_rj" ] && quic_rj=OFF
|
||||
[ -z "$cn_ip_route" ] && cn_ip_route=OFF
|
||||
touch "$CRASHDIR"/configs/mac "$CRASHDIR"/configs/ip_filter
|
||||
[ -z "$(cat "$CRASHDIR"/configs/mac "$CRASHDIR"/configs/ip_filter 2>/dev/null)" ] && mac_return=OFF || mac_return=ON
|
||||
comp_box "$FWF_ITEM_1" \
|
||||
"$FWF_ITEM_2" \
|
||||
"$FWF_ITEM_3" \
|
||||
"$FWF_ITEM_4" \
|
||||
[ -z "$(cat "$CRASHDIR"/configs/mac "$CRASHDIR"/configs/ip_filter 2>/dev/null)" ] && mac_filter_info=OFF || mac_filter_info=ON
|
||||
comp_box "${FWF_ITEM_1_PREFIX}\033[36m$common_ports\033[0m\t${FWF_ITEM_1_SUFFIX}" \
|
||||
"${FWF_ITEM_2_PREFIX}\033[36m$mac_filter_info\033[0m\t${FWF_ITEM_2_SUFFIX}" \
|
||||
"${FWF_ITEM_3_PREFIX}\033[36m$quic_rj\033[0m\t${FWF_ITEM_3_SUFFIX}" \
|
||||
"${FWF_ITEM_4_PREFIX}\033[36m$cn_ip_route\033[0m\t${FWF_ITEM_4_SUFFIX}" \
|
||||
"$FWF_ITEM_5" \
|
||||
"$FWF_ITEM_6" \
|
||||
"" \
|
||||
@@ -94,7 +94,7 @@ set_common_ports() {
|
||||
content_line "$FWF_ALLOWED_PORTS\033[36m$multiport\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
btm_box "$FWF_PORT_MENU_1" \
|
||||
btm_box "${FWF_PORT_MENU_1_PREFIX}\033[36m$common_ports\033[0m${FWF_PORT_MENU_1_SUFFIX}" \
|
||||
"$FWF_PORT_MENU_2" \
|
||||
"$FWF_PORT_MENU_3" \
|
||||
"$FWF_PORT_MENU_4" \
|
||||
@@ -463,7 +463,7 @@ fw_filter_lan() {
|
||||
done
|
||||
separator_line "="
|
||||
fi
|
||||
btm_box "$FWF_FILTER_SWITCH" \
|
||||
btm_box "${FWF_FILTER_SWITCH_PREFIX}\033[33m$fw_filter_lan_over\033[0m${FWF_FILTER_SWITCH_SUFFIX}" \
|
||||
"$FWF_FILTER_ADD_MAC" \
|
||||
"$FWF_FILTER_ADD_IP" \
|
||||
"$FWF_FILTER_REMOVE" \
|
||||
|
||||
@@ -3,10 +3,9 @@
|
||||
|
||||
[ -n "$__IS_MODULE_OVERRIDE" ] && return
|
||||
__IS_MODULE_OVERRIDE=1
|
||||
load_lang override
|
||||
|
||||
YAMLSDIR="$CRASHDIR"/yamls
|
||||
JSONSDIR="$CRASHDIR"/jsons
|
||||
load_lang override
|
||||
|
||||
# 配置文件覆写
|
||||
override() {
|
||||
@@ -48,7 +47,7 @@ override() {
|
||||
;;
|
||||
9)
|
||||
comp_box "\033[33m$OVR_WARN_1\033[0m" \
|
||||
"\033[33m$OVR_WARN_2\033[0m" \
|
||||
"\033[33m${OVR_WARN_2_PREFIX}$crashcore${OVR_WARN_2_SUFFIX}\033[0m" \
|
||||
"\033[33m$OVR_WARN_3\033[0m"
|
||||
sleep 2
|
||||
btm_box "$OVR_WARN_CONFIRM" \
|
||||
|
||||
@@ -124,6 +124,9 @@ EOF
|
||||
"interval": "${interval}m",
|
||||
"timeout": "3s"
|
||||
},
|
||||
"override_dialer": {
|
||||
"domain_resolver": "$dns_proxy_server"
|
||||
},
|
||||
"override_tls": {
|
||||
"enabled": true,
|
||||
"insecure": $override_tls
|
||||
|
||||
@@ -124,7 +124,7 @@ gen_link_config() {
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list)
|
||||
totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers_"$i18n".list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
@@ -153,7 +153,7 @@ gen_link_server() {
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list)
|
||||
totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers_"$i18n".list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
. "$CRASHDIR"/libs/logger.sh
|
||||
. "$CRASHDIR"/libs/i18n.sh
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
|
||||
load_lang task_cmd
|
||||
|
||||
@@ -140,8 +141,8 @@ hotupdate() { #热更新订阅
|
||||
|
||||
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_command=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $3}')
|
||||
#task_logger "任务$task_name 开始执行"
|
||||
eval $task_command && task_res="$TASK_CMD_RES_OK" || task_res="$TASK_CMD_RES_FAIL"
|
||||
task_logger "$TASK_CMD_EXEC_PREFIX$2$TASK_CMD_EXEC_MID$task_res"
|
||||
|
||||
@@ -4,7 +4,26 @@
|
||||
[ -n "$__IS_MODULE_USERGUIDE_LOADED" ] && return
|
||||
__IS_MODULE_USERGUIDE_LOADED=1
|
||||
|
||||
load_lang userguide
|
||||
. "$CRASHDIR"/libs/check_dir_avail.sh
|
||||
|
||||
select_lang() {
|
||||
line_break
|
||||
comp_box "1) 简体中文" \
|
||||
"2) English"
|
||||
read -r -p "请选择语言 Please choose your language > " num
|
||||
case "$num" in
|
||||
1)
|
||||
echo chs >"$CRASHDIR"/configs/i18n.cfg
|
||||
;;
|
||||
2)
|
||||
echo en >"$CRASHDIR"/configs/i18n.cfg
|
||||
;;
|
||||
esac
|
||||
line_break
|
||||
load_lang menu
|
||||
load_lang common
|
||||
load_lang userguide
|
||||
}
|
||||
|
||||
forwhat() {
|
||||
while true; do
|
||||
@@ -89,7 +108,9 @@ forwhat() {
|
||||
|
||||
# 新手引导
|
||||
userguide() {
|
||||
. "$CRASHDIR"/libs/check_dir_avail.sh
|
||||
|
||||
select_lang
|
||||
|
||||
forwhat
|
||||
|
||||
# 检测小内存模式
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
#初始化目录
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$( cd $(dirname $0);cd ..;pwd)
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$(
|
||||
cd $(dirname $0)
|
||||
cd ..
|
||||
pwd
|
||||
)
|
||||
. "$CRASHDIR"/libs/get_config.sh
|
||||
#加载工具
|
||||
. "$CRASHDIR"/libs/check_cmd.sh
|
||||
@@ -12,45 +16,45 @@
|
||||
[ -z "$firewall_area" ] && firewall_area=1
|
||||
#延迟启动
|
||||
[ ! -f "$TMPDIR"/crash_start_time ] && [ -n "$start_delay" ] && [ "$start_delay" -gt 0 ] && {
|
||||
logger "ShellCrash将延迟$start_delay秒启动" 31
|
||||
sleep "$start_delay"
|
||||
logger "ShellCrash将延迟$start_delay秒启动" 31
|
||||
sleep "$start_delay"
|
||||
}
|
||||
#设置循环检测面板端口以判定服务启动是否成功
|
||||
. "$CRASHDIR"/libs/start_wait.sh
|
||||
if [ -n "$test" -o -n "$(pidof CrashCore)" ]; then
|
||||
[ "$start_old" = "ON" ] && [ ! -L "$TMPDIR"/CrashCore ] && rm -f "$TMPDIR"/CrashCore #删除缓存目录内核文件
|
||||
. "$CRASHDIR"/starts/fw_start.sh #配置防火墙流量劫持
|
||||
date +%s >"$TMPDIR"/crash_start_time #标记启动时间
|
||||
#后台还原面板配置
|
||||
[ -s "$CRASHDIR"/configs/web_save ] && {
|
||||
. "$CRASHDIR"/libs/web_restore.sh
|
||||
web_restore >/dev/null 2>&1 &
|
||||
}
|
||||
#推送日志
|
||||
{
|
||||
sleep 5
|
||||
logger ShellCrash服务已启动!
|
||||
} &
|
||||
ckcmd mtd_storage.sh && mtd_storage.sh save >/dev/null 2>&1 #Padavan保存/etc/storage
|
||||
#加载定时任务
|
||||
cronload | grep -v '^$' > "$TMPDIR"/cron_tmp
|
||||
[ -s "$CRASHDIR"/task/cron ] && cat "$CRASHDIR"/task/cron >> "$TMPDIR"/cron_tmp
|
||||
[ -s "$CRASHDIR"/task/running ] && cat "$CRASHDIR"/task/running >> "$TMPDIR"/cron_tmp
|
||||
[ "$bot_tg_service" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程" >> "$TMPDIR"/cron_tmp
|
||||
[ "$start_old" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh shellcrash #ShellCrash保守模式守护进程" >> "$TMPDIR"/cron_tmp
|
||||
awk '!x[$0]++' "$TMPDIR"/cron_tmp > "$TMPDIR"/cron_tmp2 #删除重复行
|
||||
cronadd "$TMPDIR"/cron_tmp2
|
||||
rm -f "$TMPDIR"/cron_tmp "$TMPDIR"/cron_tmp2
|
||||
#加载条件任务
|
||||
[ -s "$CRASHDIR"/task/afstart ] && { . "$CRASHDIR"/task/afstart; } &
|
||||
[ -s "$CRASHDIR"/task/affirewall -a -s /etc/init.d/firewall -a ! -f /etc/init.d/firewall.bak ] && {
|
||||
#注入防火墙
|
||||
line=$(grep -En "fw.* restart" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i.bak "${line}a\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
line=$(grep -En "fw.* start" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i "${line}a\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
} &
|
||||
exit 0
|
||||
[ "$start_old" = "ON" ] && [ ! -L "$TMPDIR"/CrashCore ] && rm -f "$TMPDIR"/CrashCore #删除缓存目录内核文件
|
||||
. "$CRASHDIR"/starts/fw_start.sh #配置防火墙流量劫持
|
||||
date +%s >"$TMPDIR"/crash_start_time #标记启动时间
|
||||
#还原面板配置
|
||||
[ -s "$CRASHDIR"/configs/web_save ] && {
|
||||
. "$CRASHDIR"/libs/web_restore.sh
|
||||
web_restore >/dev/null 2>&1
|
||||
}
|
||||
#推送日志
|
||||
{
|
||||
sleep 5
|
||||
logger ShellCrash服务已启动!
|
||||
} &
|
||||
ckcmd mtd_storage.sh && mtd_storage.sh save >/dev/null 2>&1 #Padavan保存/etc/storage
|
||||
#加载定时任务
|
||||
cronload | grep -v '^$' >"$TMPDIR"/cron_tmp
|
||||
[ -s "$TASKCFGDIR"/cron ] && cat "$TASKCFGDIR"/cron >>"$TMPDIR"/cron_tmp
|
||||
[ -s "$TASKCFGDIR"/running ] && cat "$TASKCFGDIR"/running >>"$TMPDIR"/cron_tmp
|
||||
[ "$bot_tg_service" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程" >>"$TMPDIR"/cron_tmp
|
||||
[ "$start_old" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh shellcrash #ShellCrash保守模式守护进程" >>"$TMPDIR"/cron_tmp
|
||||
awk '!x[$0]++' "$TMPDIR"/cron_tmp >"$TMPDIR"/cron_tmp2 #删除重复行
|
||||
cronadd "$TMPDIR"/cron_tmp2
|
||||
rm -f "$TMPDIR"/cron_tmp "$TMPDIR"/cron_tmp2
|
||||
#加载条件任务
|
||||
[ -s "$TASKCFGDIR"/afstart ] && { . "$TASKCFGDIR"/afstart; } &
|
||||
[ -s "$TASKCFGDIR"/affirewall -a -s /etc/init.d/firewall -a ! -f /etc/init.d/firewall.bak ] && {
|
||||
#注入防火墙
|
||||
line=$(grep -En "fw.* restart" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i.bak "${line}a\\. $TASKCFGDIR/affirewall" /etc/init.d/firewall
|
||||
line=$(grep -En "fw.* start" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i "${line}a\\. $TASKCFGDIR/affirewall" /etc/init.d/firewall
|
||||
} &
|
||||
exit 0
|
||||
else
|
||||
. "$CRASHDIR"/starts/start_error.sh
|
||||
. "$CRASHDIR"/starts/start_error.sh
|
||||
fi
|
||||
|
||||
@@ -79,7 +79,7 @@ EOF
|
||||
[ ! -d "$BINDIR"/ui ] && mkdir -p "$BINDIR"/ui
|
||||
[ -z "$crashcore" ] && crashcore=meta
|
||||
#执行条件任务
|
||||
[ -s "$CRASHDIR"/task/bfstart ] && . "$CRASHDIR"/task/bfstart
|
||||
[ -s "$TASKCFGDIR"/bfstart ] && . "$TASKCFGDIR"/bfstart
|
||||
#检查内核配置文件
|
||||
if [ ! -f "$core_config" ]; then
|
||||
if [ -n "$Url" -o -n "$Https" ]; then
|
||||
@@ -144,4 +144,3 @@ fi
|
||||
rm -rf /tmp/ShellCrash/debug.log
|
||||
rm -rf "$CRASHDIR"/debug.log
|
||||
exit 0
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
#修饰clash配置文件
|
||||
modify_yaml() {
|
||||
prepare_clash_base_config() {
|
||||
##########需要变更的配置###########
|
||||
[ "$ipv6_dns" != "OFF" ] && dns_v6='true' || dns_v6='false'
|
||||
external="external-controller: 0.0.0.0:$db_port"
|
||||
@@ -55,7 +54,7 @@ EOF
|
||||
cat >>"$TMPDIR"/dns.yaml <<EOF
|
||||
respect-rules: true
|
||||
nameserver-policy: {'rule-set:cn': [ $dns_nameserver ]}
|
||||
proxy-server-nameserver : [ $dns_resolver ]
|
||||
proxy-server-nameserver : [ $dns_proxy_server ]
|
||||
nameserver: [ $dns_final ]
|
||||
EOF
|
||||
else
|
||||
@@ -65,8 +64,11 @@ EOF
|
||||
fi
|
||||
}
|
||||
#域名嗅探配置
|
||||
[ "$sniffer" = "ON" ] && [ "$crashcore" = "meta" ] && sniffer_set="sniffer: {enable: true, parse-pure-ip: true, skip-domain: [Mijia Cloud], sniff: {http: {ports: [80, 8080-8880], override-destination: true}, tls: {ports: [443, 8443]}, quic: {ports: [443, 8443]}}}"
|
||||
[ "$sniffer" = "ON" ] && [ "$crashcore" = "meta" ] && sniffer_set="sniffer: {enable: true, parse-pure-ip: true, skip-domain: ['+.push.apple.com', 'Mijia Cloud'], sniff: {http: {ports: [80, 8080-8880], override-destination: true}, tls: {ports: [443, 8443]}, quic: {ports: [443, 8443]}}}"
|
||||
[ "$crashcore" = "clashpre" ] && [ "$dns_mod" = "redir_host" -o "$sniffer" = "ON" ] && exper="experimental: {ignore-resolve-fail: true, interface-name: en0,sniff-tls-sni: true}"
|
||||
}
|
||||
|
||||
generate_set_and_hosts_yaml() {
|
||||
#生成set.yaml
|
||||
cat >"$TMPDIR"/set.yaml <<EOF
|
||||
mixed-port: $mix_port
|
||||
@@ -112,6 +114,9 @@ EOF
|
||||
echo " '$hosts_domain': $hosts_ip" >>"$TMPDIR"/hosts.yaml
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
split_and_customize_yaml_parts() {
|
||||
#分割配置文件
|
||||
yaml_char='proxies proxy-groups proxy-providers rules rule-providers sub-rules listeners'
|
||||
for char in $yaml_char; do
|
||||
@@ -171,6 +176,9 @@ EOF
|
||||
IFS="$oldIFS"
|
||||
done
|
||||
}
|
||||
}
|
||||
|
||||
add_custom_inbounds_and_rules() {
|
||||
#添加自定义入站
|
||||
[ "$vms_service" = ON ] || [ "$sss_service" = ON ] && {
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
@@ -191,11 +199,14 @@ EOF
|
||||
cat "$TMPDIR"/rules.yaml >>"$TMPDIR"/rules.add
|
||||
mv -f "$TMPDIR"/rules.add "$TMPDIR"/rules.yaml
|
||||
}
|
||||
}
|
||||
|
||||
merger_yaml() {
|
||||
#mix和route模式生成rule-providers
|
||||
[ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && ! grep -Eq '^[[:space:]]*cn:' "$TMPDIR"/rule-providers.yaml && ! grep -q '^rule-providers' "$CRASHDIR"/yamls/others.yaml 2>/dev/null && {
|
||||
space=$(sed -n "1p" "$TMPDIR"/rule-providers.yaml | grep -oE '^ *') #获取空格数
|
||||
[ -z "$space" ] && space=' '
|
||||
echo "${space}cn: {type: http, behavior: domain, format: mrs, path: ./ruleset/cn.mrs, url: https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@update/bin/geodata/mrs_geosite_cn.mrs}" >>"$TMPDIR"/rule-providers.yaml
|
||||
echo "${space}cn: {type: http, behavior: domain, format: mrs, path: ./ruleset/cn.mrs, interval: 86400, url: https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@update/bin/geodata/mrs_geosite_cn.mrs}" >>"$TMPDIR"/rule-providers.yaml
|
||||
}
|
||||
#对齐rules中的空格
|
||||
sed -i 's/^ *-/ -/g' "$TMPDIR"/rules.yaml
|
||||
@@ -220,6 +231,9 @@ EOF
|
||||
done
|
||||
#合并完整配置文件
|
||||
cut -c 1- "$TMPDIR"/set.yaml $yaml_dns $yaml_hosts $yaml_user $yaml_others $yaml_add >"$TMPDIR"/config.yaml
|
||||
}
|
||||
|
||||
test_yaml() {
|
||||
#测试自定义配置文件
|
||||
"$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml >/dev/null
|
||||
if [ "$?" != 0 ]; then
|
||||
@@ -233,10 +247,24 @@ EOF
|
||||
cut -c 1- "$TMPDIR"/set.yaml $yaml_dns $yaml_add >"$TMPDIR"/config.yaml
|
||||
sed -i "/#自定义/d" "$TMPDIR"/config.yaml
|
||||
fi
|
||||
}
|
||||
|
||||
finalize_clash_yaml() {
|
||||
#建立软连接
|
||||
[ ""$TMPDIR"" = ""$BINDIR"" ] || ln -sf "$TMPDIR"/config.yaml "$BINDIR"/config.yaml 2>/dev/null || cp -f "$TMPDIR"/config.yaml "$BINDIR"/config.yaml
|
||||
#清理缓存
|
||||
for char in $yaml_char set set_bak dns hosts; do
|
||||
rm -f "$TMPDIR"/${char}.yaml
|
||||
done
|
||||
}
|
||||
}
|
||||
|
||||
#修饰clash配置文件
|
||||
modify_yaml() {
|
||||
prepare_clash_base_config
|
||||
generate_set_and_hosts_yaml
|
||||
split_and_customize_yaml_parts
|
||||
add_custom_inbounds_and_rules
|
||||
merger_yaml
|
||||
test_yaml
|
||||
finalize_clash_yaml
|
||||
}
|
||||
|
||||
@@ -7,10 +7,13 @@
|
||||
. "$CRASHDIR"/libs/compare.sh
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/logger.sh
|
||||
. "$CRASHDIR"/libs/i18n.sh
|
||||
|
||||
update_servers() { #更新servers.list
|
||||
get_bin "$TMPDIR"/servers.list public/servers.list
|
||||
[ "$?" = 0 ] && mv -f "$TMPDIR"/servers.list "$CRASHDIR"/configs/servers.list
|
||||
load_lang
|
||||
|
||||
update_servers() { #更新servers_${i18n}.list
|
||||
get_bin "$TMPDIR"/servers_${i18n}.list public/servers_${i18n}.list
|
||||
[ "$?" = 0 ] && mv -f "$TMPDIR"/servers_${i18n}.list "$CRASHDIR"/configs/servers_${i18n}.list
|
||||
}
|
||||
gen_ua(){ #自动生成ua
|
||||
[ -z "$user_agent" -o "$user_agent" = "auto" ] && {
|
||||
@@ -26,10 +29,10 @@ gen_ua(){ #自动生成ua
|
||||
}
|
||||
get_core_config() { #下载内核配置文件
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] || [ $server_link -gt $(grep -aE '^4' "$CRASHDIR"/configs/servers.list | wc -l) ] && server_link=1
|
||||
Server=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
Server_ua=$(grep -aE '^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $4}')
|
||||
Config=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $3}')
|
||||
[ -z "$server_link" ] || [ $server_link -gt $(grep -aE '^4' "$CRASHDIR"/configs/servers_${i18n}.list | wc -l) ] && server_link=1
|
||||
Server=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers_${i18n}.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
Server_ua=$(grep -aE '^4' "$CRASHDIR"/configs/servers_${i18n}.list | sed -n ""$server_link"p" | awk '{print $4}')
|
||||
Config=$(grep -aE '^5' "$CRASHDIR"/configs/servers_${i18n}.list | sed -n ""$rule_link"p" | awk '{print $3}')
|
||||
gen_ua
|
||||
#如果传来的是Url链接则合成Https链接,否则直接使用Https链接
|
||||
if [ -z "$Https" ]; then
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
|
||||
getlanip() { #获取局域网host地址
|
||||
i=1
|
||||
while [ "$i" -le "20" ]; do
|
||||
host_ipv4=$(ip route show scope link | grep -Ev 'wan|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet' | awk '{print $1}') #ipv4局域网网段
|
||||
[ "$ipv6_redir" = "ON" ] && host_ipv6=$(ip -6 route show default | awk '{print $3}' | tr '\n' ' ' | sed 's/ $//') #ipv6公网地址段
|
||||
#ipv4局域网网段
|
||||
host_ipv4=$(ip route show scope link | grep -Ev 'wan|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet|wgs|multicast|anycast' | awk '{print $1}')
|
||||
#ipv6局域网网段 - 从IPv4已识别的LAN接口获取全局IPv6前缀
|
||||
[ "$ipv6_redir" = "ON" ] && {
|
||||
lan_ifaces=$(ip route show scope link | grep -Ev 'ppp|wan|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet|wgs|multicast|anycast' | awk '{for(i=1;i<=NF;i++) if($i=="dev") {print $(i+1); break}}' | grep -v '^lo$' | sort -u)
|
||||
host_ipv6=$(
|
||||
for iface in $lan_ifaces; do
|
||||
ip -6 addr show dev $iface 2>/dev/null
|
||||
done | grep 'scope global' | awk '{print $2}' | tr '\n' ' ' | sed 's/ $//'
|
||||
)
|
||||
[ -z "$host_ipv6" ] && host_ipv6=$(ip -6 route show | grep -Ev 'default|unreachable|fe80::/|wan|ppp|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet|wgs|multicast|anycast' | awk '{print $1}' | tr '\n' ' ' | sed 's/ $//')
|
||||
}
|
||||
[ -f "$TMPDIR"/ShellCrash.log ] && break
|
||||
[ -n "$host_ipv4" -a "$ipv6_redir" != "ON" ] && break
|
||||
[ -n "$host_ipv4" -a -n "$host_ipv6" ] && break
|
||||
@@ -24,7 +33,7 @@ getlanip() { #获取局域网host地址
|
||||
if [ "$replace_default_host_ipv4" == "ON" ]; then
|
||||
host_ipv4="$cust_host_ipv4"
|
||||
else
|
||||
host_ipv4=$(echo "$host_ipv4 $cust_host_ipv4$ts_host_ipv4$wg_host_ipv4"| tr '\n' ' ' | sed 's/ $//')
|
||||
host_ipv4=$(echo "$host_ipv4 $cust_host_ipv4$ts_host_ipv4$wg_host_ipv4" | tr '\n' ' ' | sed 's/ $//')
|
||||
fi
|
||||
#缺省配置
|
||||
[ -z "$host_ipv4" ] && {
|
||||
@@ -38,4 +47,4 @@ getlanip() { #获取局域网host地址
|
||||
#保留地址
|
||||
[ -z "$reserve_ipv4" ] && reserve_ipv4="0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 100.64.0.0/10 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4"
|
||||
[ -z "$reserve_ipv6" ] && reserve_ipv6="::/128 ::1/128 ::ffff:0:0/96 64:ff9b::/96 100::/64 2001::/32 2001:20::/28 2001:db8::/32 2002::/16 fe80::/10 ff00::/8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ckcmd iptables && iptables -h | grep -q '\-w' && iptable='iptables -w' || iptable=iptables
|
||||
ckcmd ip6tables && ip6tables -h | grep -q '\-w' && ip6table='ip6tables -w' || ip6table=ip6tables
|
||||
|
||||
|
||||
start_ipt_route() { #iptables-route通用工具
|
||||
#$1:iptables/ip6tables $2:所在的表(nat/mangle) $3:所在的链(OUTPUT/PREROUTING) $4:新创建的shellcrash链表 $5:tcp/udp/all
|
||||
#区分ipv4/ipv6
|
||||
@@ -37,6 +37,7 @@ start_ipt_route() { #iptables-route通用工具
|
||||
}
|
||||
#跳过目标保留地址及目标本机网段
|
||||
for ip in $HOST_IP $RESERVED_IP; do
|
||||
[ "$ip" = "default" ] && continue
|
||||
"$1" $w -t "$2" -A "$4" -d $ip -j RETURN
|
||||
done
|
||||
#绕过CN_IP
|
||||
@@ -65,7 +66,8 @@ start_ipt_route() { #iptables-route通用工具
|
||||
"$1" $w -t "$2" -A "$4" -p "$5" -s $ip -j $JUMP
|
||||
done
|
||||
else
|
||||
for ip in $HOST_IP; do #仅限指定网段流量
|
||||
for ip in $HOST_IP; do #仅限指定网段流量 (已修复 default 报错)
|
||||
[ "$ip" = "default" ] && continue
|
||||
"$1" $w -t "$2" -A "$4" -p "$5" -s $ip -j $JUMP
|
||||
done
|
||||
fi
|
||||
@@ -123,7 +125,8 @@ start_ipt_dns() { #iptables-dns通用工具
|
||||
"$1" $w -t nat -A "$3" -p udp -s $ip -j REDIRECT --to-ports "$dns_redir_port"
|
||||
done
|
||||
else
|
||||
for ip in $HOST_IP; do #仅限指定网段流量
|
||||
for ip in $HOST_IP; do #仅限指定网段流量 (已修复 default 报错)
|
||||
[ "$ip" = "default" ] && continue
|
||||
"$1" $w -t nat -A "$3" -p tcp -s $ip -j REDIRECT --to-ports "$dns_redir_port"
|
||||
"$1" $w -t nat -A "$3" -p udp -s $ip -j REDIRECT --to-ports "$dns_redir_port"
|
||||
done
|
||||
@@ -256,7 +259,8 @@ start_iptables() { #iptables配置总入口
|
||||
fi
|
||||
}
|
||||
}
|
||||
[ "$vm_redir" = "ON" ] && [ -n "$$vm_ipv4" ] && {
|
||||
# 修复了原本双刀号 $$vm_ipv4 会变为进程 PID_ipv4 的语法错误问题
|
||||
[ "$vm_redir" = "ON" ] && [ -n "$vm_ipv4" ] && {
|
||||
JUMP="REDIRECT --to-ports $redir_port" #跳转劫持的具体命令
|
||||
start_ipt_dns iptables PREROUTING shellcrash_vm_dns #ipv4-局域网dns转发
|
||||
start_ipt_route iptables nat PREROUTING shellcrash_vm tcp #ipv4-局域网tcp转发
|
||||
@@ -289,4 +293,4 @@ start_iptables() { #iptables配置总入口
|
||||
$ip6table -I INPUT -p udp --dport 443 $set_cn_ip6 -j REJECT >/dev/null 2>&1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#初始化目录
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$( cd $(dirname $0);cd ..;pwd)
|
||||
TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
profile=/etc/profile
|
||||
. "$CRASHDIR"/libs/set_profile.sh
|
||||
. "$CRASHDIR"/libs/set_cron.sh
|
||||
|
||||
@@ -41,7 +41,7 @@ parse_singbox_dns() { #dns转换
|
||||
# 输出
|
||||
echo '"type": "'"$type"'", "server": "'"$server"'", "server_port": '"$port"','
|
||||
}
|
||||
modify_json() {
|
||||
extract_base_jsons() {
|
||||
#提取配置文件以获得outbounds.json,providers.json及route.json
|
||||
"$TMPDIR"/CrashCore format -c $core_config >"$TMPDIR"/format.json
|
||||
echo '{' >"$TMPDIR"/jsons/outbounds.json
|
||||
@@ -52,6 +52,9 @@ modify_json() {
|
||||
cat "$TMPDIR"/format.json | sed -n '/^ "providers":/,/^ "[a-z]/p' | sed '$d' >>"$TMPDIR"/jsons/providers.json
|
||||
}
|
||||
cat "$TMPDIR"/format.json | sed -n '/"route":/,/^\( "[a-z]\|}\)/p' | sed '$d' >>"$TMPDIR"/jsons/route.json
|
||||
}
|
||||
|
||||
generate_basic_jsons() {
|
||||
#生成endpoints.json
|
||||
[ "$ts_service" = ON ] || [ "$wg_service" = ON ] && [ "$zip_type" != upx ] && {
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
@@ -96,6 +99,9 @@ EOF
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
prepare_dns_config() {
|
||||
#生成dns.json
|
||||
[ "$ipv6_dns" != "OFF" ] && strategy='prefer_ipv4' || strategy='ipv4_only'
|
||||
#获取detour出口
|
||||
@@ -131,6 +137,9 @@ EOF
|
||||
}
|
||||
#防泄露设置
|
||||
[ "$dns_protect" = "OFF" ] && sed -i 's/"server": "dns_proxy"/"server": "dns_direct"/g' "$TMPDIR"/jsons/route.json
|
||||
}
|
||||
|
||||
generate_dns_related_jsons() {
|
||||
#生成add_rule_set.json
|
||||
[ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && ! grep -Eq '"tag" *:[[:space:]]*"cn"' "$CRASHDIR"/jsons/*.json && {
|
||||
[ "$crashcore" = "singboxr" ] && srs_path='"path": "./ruleset/cn.srs",'
|
||||
@@ -178,6 +187,11 @@ EOF
|
||||
"tag": "dns_resolver",
|
||||
$(parse_singbox_dns "$dns_resolver")
|
||||
"routing_mark": $routing_mark
|
||||
},
|
||||
{
|
||||
"tag": "dns_proxy_server",
|
||||
$(parse_singbox_dns "$dns_proxy_server")
|
||||
"routing_mark": $routing_mark
|
||||
}
|
||||
],
|
||||
"rules": [
|
||||
@@ -198,9 +212,12 @@ EOF
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
generate_route_and_inbounds_jsons() {
|
||||
#生成add_route.json
|
||||
#域名嗅探配置
|
||||
[ "$sniffer" != OFF ] && sniffer_set='{ "action": "sniff", "timeout": "500ms" },'
|
||||
[ "$sniffer" != OFF ] && sniffer_set='{ "domain_suffix": [ "push.apple.com" ], "rule_set": [ "telegramip" ], "domain": [ "Mijia Cloud" ], "invert": true, "action": "sniff", "timeout": "500ms" },'
|
||||
[ "$ts_service" = ON ] && tailscale_set='{ "inbound": [ "ts-ep" ], "port": 53, "action": "hijack-dns" },'
|
||||
cat >"$TMPDIR"/jsons/add_route.json <<EOF
|
||||
{
|
||||
@@ -267,8 +284,8 @@ EOF
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
. "$CRASHDIR"/libs/sb_inbounds.sh
|
||||
}
|
||||
if [ "$redir_mod" = "Mix" -o "$redir_mod" = "Tun" ]; then
|
||||
[ "ipv6_redir" = 'ON' ] && ipv6_address='"fe80::e5c5:2469:d09b:609a/64",'
|
||||
if [ "$redir_mod" = "Mix" ] || [ "$redir_mod" = "Tun" ]; then
|
||||
[ "$ipv6_redir" = 'ON' ] && ipv6_address='"fd00:face:b00c::1/126",'
|
||||
cat >>"$TMPDIR"/jsons/tun.json <<EOF
|
||||
{
|
||||
"inbounds": [
|
||||
@@ -287,6 +304,9 @@ EOF
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
generate_outbounds_and_experimental_jsons() {
|
||||
#生成add_outbounds.json
|
||||
grep -qE '"tag": "DIRECT"' "$TMPDIR"/jsons/outbounds.json || add_direct='{ "tag": "DIRECT", "type": "direct" }'
|
||||
grep -qE '"tag": "REJECT"' "$TMPDIR"/jsons/outbounds.json || add_reject='{ "tag": "REJECT", "type": "block" }'
|
||||
@@ -320,6 +340,9 @@ EOF
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
generate_custom_rules_json() {
|
||||
#生成自定义规则文件
|
||||
[ -n "$(grep -Ev ^# "$CRASHDIR"/yamls/rules.yaml 2>/dev/null)" ] && {
|
||||
cat "$CRASHDIR"/yamls/rules.yaml |
|
||||
@@ -343,6 +366,9 @@ EOF
|
||||
sed '$s/,$/ ] } }/' >"$TMPDIR"/jsons/cust_add_rules.json
|
||||
[ ! -s "$TMPDIR"/jsons/cust_add_rules.json ] && rm -rf "$TMPDIR"/jsons/cust_add_rules.json
|
||||
}
|
||||
}
|
||||
|
||||
normalize_and_finalize_jsons() {
|
||||
#清理route.json中的process_name规则以及"auto_detect_interface"
|
||||
sed -i '/"process_name": \[/,/],$/d' "$TMPDIR"/jsons/route.json
|
||||
sed -i '/"process_name": "[^"]*",/d' "$TMPDIR"/jsons/route.json
|
||||
@@ -362,6 +388,9 @@ EOF
|
||||
rm -rf "$TMPDIR"/jsons/${file}.json
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
link_custom_jsons() {
|
||||
#加载自定义配置文件
|
||||
mkdir -p "$TMPDIR"/jsons_base
|
||||
#以下为覆盖脚本的自定义文件
|
||||
@@ -377,6 +406,9 @@ EOF
|
||||
ln -sf "$CRASHDIR"/jsons/${char}.json "$TMPDIR"/jsons/cust_${char}.json
|
||||
}
|
||||
done
|
||||
}
|
||||
|
||||
validate_and_restore_custom_jsons() {
|
||||
#测试自定义配置文件
|
||||
if ! error=$("$TMPDIR"/CrashCore check -D "$BINDIR" -C "$TMPDIR"/jsons 2>&1); then
|
||||
echo $error
|
||||
@@ -388,6 +420,19 @@ EOF
|
||||
rm -rf "$TMPDIR"/jsons/cust_*
|
||||
mv -f "$TMPDIR"/jsons_base/* "$TMPDIR"/jsons 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
modify_json() {
|
||||
extract_base_jsons
|
||||
generate_basic_jsons
|
||||
prepare_dns_config
|
||||
generate_dns_related_jsons
|
||||
generate_route_and_inbounds_jsons
|
||||
generate_outbounds_and_experimental_jsons
|
||||
generate_custom_rules_json
|
||||
normalize_and_finalize_jsons
|
||||
link_custom_jsons
|
||||
validate_and_restore_custom_jsons
|
||||
#清理缓存
|
||||
rm -rf "$TMPDIR"/*.json
|
||||
rm -rf "$TMPDIR"/jsons_base
|
||||
|
||||
@@ -14,10 +14,10 @@ while [ ! -f "$CRASHDIR/configs/ShellCrash.cfg" ]; do
|
||||
done
|
||||
. "$CRASHDIR"/configs/ShellCrash.cfg
|
||||
|
||||
autoSSH(){
|
||||
autoSSH() {
|
||||
#自动开启SSH
|
||||
[ "`uci -c /usr/share/xiaoqiang get xiaoqiang_version.version.CHANNEL`" != 'stable' ] && {
|
||||
uci -c /usr/share/xiaoqiang set xiaoqiang_version.version.CHANNEL='stable'
|
||||
[ "$(uci -c /usr/share/xiaoqiang get xiaoqiang_version.version.CHANNEL)" != 'stable' ] && {
|
||||
uci -c /usr/share/xiaoqiang set xiaoqiang_version.version.CHANNEL='stable'
|
||||
uci -c /usr/share/xiaoqiang commit xiaoqiang_version.version
|
||||
}
|
||||
[ -z "$(pidof dropbear)" -o -z "$(netstat -ntul | grep :22)" ] && {
|
||||
@@ -26,15 +26,15 @@ autoSSH(){
|
||||
[ -n "$mi_autoSSH_pwd" ] && echo -e "$mi_autoSSH_pwd\n$mi_autoSSH_pwd" | passwd root
|
||||
}
|
||||
#配置nvram
|
||||
[ "$(nvram get ssh_en)" = 0 ] && nvram set ssh_en=1
|
||||
[ "$(nvram get ssh_en)" = 0 ] && nvram set ssh_en=1
|
||||
[ "$(nvram get telnet_en)" = 0 ] && nvram set telnet_en=1
|
||||
nvram commit &> /dev/null
|
||||
nvram commit >/dev/null 2>&1
|
||||
#备份还原SSH秘钥
|
||||
[ -f "$CRASHDIR"/configs/dropbear_rsa_host_key ] && ln -sf "$CRASHDIR"/configs/dropbear_rsa_host_key /etc/dropbear/dropbear_rsa_host_key
|
||||
[ -f "$CRASHDIR"/configs/authorized_keys ] && ln -sf "$CRASHDIR"/configs/authorized_keys /etc/dropbear/authorized_keys
|
||||
}
|
||||
tunfix(){
|
||||
ko_dir=$(modinfo ip_tables | grep -Eo '/lib/modules.*/ip_tables.ko' | sed 's|/ip_tables.ko||' )
|
||||
tunfix() {
|
||||
ko_dir=$(modinfo ip_tables | grep -Eo '/lib/modules.*/ip_tables.ko' | sed 's|/ip_tables.ko||')
|
||||
#在/tmp创建并挂载overlay
|
||||
mkdir -p /tmp/overlay
|
||||
mkdir -p /tmp/overlay/upper
|
||||
@@ -43,12 +43,12 @@ tunfix(){
|
||||
#将tun.ko链接到lib
|
||||
ln -sf "$CRASHDIR"/tools/tun.ko "$ko_dir"/tun.ko
|
||||
}
|
||||
tproxyfix(){
|
||||
tproxyfix() {
|
||||
sed -i 's/sysctl -w net.bridge.bridge-nf-call-ip/#sysctl -w net.bridge.bridge-nf-call-ip/g' /etc/init.d/qca-nss-ecm
|
||||
sysctl -w net.bridge.bridge-nf-call-iptables=0
|
||||
sysctl -w net.bridge.bridge-nf-call-ip6tables=0
|
||||
}
|
||||
auto_clean(){
|
||||
auto_clean() {
|
||||
#自动清理升级备份文件夹
|
||||
rm -rf /data/etc_bak
|
||||
#自动清理被写入闪存的系统日志并禁止服务
|
||||
@@ -57,9 +57,9 @@ auto_clean(){
|
||||
sed -i '\#/logrotate#{ /^[[:space:]]*#/!s/^/#ShellCrash自动注释 / }' /etc/crontabs/root
|
||||
sed -i '\#/sec_cfg_bak#{ /^[[:space:]]*#/!s/^/#ShellCrash自动注释 / }' /etc/crontabs/root
|
||||
rm -rf /data/usr/log /data/usr/sec_cfg
|
||||
|
||||
|
||||
}
|
||||
auto_start(){
|
||||
auto_start() {
|
||||
#设置init.d服务
|
||||
[ ! -x /etc/init.d/shellcrash ] && {
|
||||
cp -f "$CRASHDIR"/starts/shellcrash.procd /etc/init.d/shellcrash
|
||||
@@ -68,7 +68,7 @@ auto_start(){
|
||||
#初始化环境变量
|
||||
grep -q '^export CRASHDIR=' '/etc/profile' || {
|
||||
. "$CRASHDIR"/libs/set_profile.sh
|
||||
set_profile '/etc/profile'
|
||||
set_profile '/etc/profile'
|
||||
}
|
||||
#启动服务
|
||||
if [ ! -f "$CRASHDIR"/.dis_startup ] && [ ! -f "$CRASHDIR"/.start_error ]; then
|
||||
@@ -83,12 +83,12 @@ auto_start(){
|
||||
/etc/init.d/shellcrash start && /etc/init.d/shellcrash enable
|
||||
fi
|
||||
}
|
||||
init(){
|
||||
init() {
|
||||
#等待启动完成
|
||||
while ! ip a| grep -q lan; do
|
||||
while ! ip a | grep -q lan; do
|
||||
sleep 10
|
||||
done
|
||||
autoSSH #软固化功能
|
||||
autoSSH #软固化功能
|
||||
auto_clean #自动清理
|
||||
auto_start
|
||||
#启动自定义服务
|
||||
@@ -103,9 +103,8 @@ case "$1" in
|
||||
auto_clean) auto_clean ;;
|
||||
init) init ;;
|
||||
*)
|
||||
if [ -z "$(pidof CrashCore)" ];then
|
||||
if [ -z "$(pidof CrashCore)" ]; then
|
||||
init &
|
||||
fi
|
||||
;;
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
Reference in New Issue
Block a user