46 Commits

Author SHA1 Message Date
juewuy
bbc0b35b16 创建 servers.list 2026-04-26 12:28:33 +08:00
juewuy
1e10113665 ~1.9.5alpha14 pkg 2026-04-19 18:56:43 +08:00
juewuy
aa21581057 ~bugfix 2026-04-19 14:10:02 +08:00
juewuy
04503ab921 ~为mihomo的mix/route模式dns默认数据库增加每日自动同步 2026-04-19 13:30:34 +08:00
juewuy
13ed653c2e Merge branch 'dev' of github.com:juewuy/ShellCrash into dev
# Conflicts:
#	.github/workflows/bin_update.yml
2026-04-19 13:13:24 +08:00
juewuy
8e5ac1dce5 ~增加部分文件内容的同步 2026-04-19 13:12:40 +08:00
juewuy
309b77ac35 ~增加部分文件内容的同步 2026-04-19 12:24:42 +08:00
juewuy
0f712fd69f ~将自动任务的配置文件移动到$CRASHDIR/configs/task目录下 2026-04-19 12:06:28 +08:00
juewuy
accc20ff7c ~新手引导添加语言选择 2026-04-19 11:16:35 +08:00
juewuy
85733ebf9d ~修复在线更新配置文件报错的bug 2026-04-19 10:59:23 +08:00
juewuy
438611f27a ~修复部分文本错误 2026-04-19 10:49:41 +08:00
juewuy
791b83ab85 ~DNS服务器中增加了专门用于解析节点域名的改PROXY-SERVER-DNS选项,并移除了对oix的单独适配 2026-04-19 10:40:28 +08:00
juewuy
75b3baa5d9 ~修复在线生成时找不到servers.list的bug 2026-04-19 10:01:59 +08:00
juewuy
950432aebc Merge pull request #1255 from juewuy/codex/refactor-singbox_modify.sh-into-smaller-functions
Refactor clash_modify.sh and singbox_modify.sh into modular helper functions
2026-04-07 09:39:54 +08:00
juewuy
8e95c6a292 refactor: split clash_modify yaml workflow into helpers 2026-04-07 09:38:50 +08:00
juewuy
b9c50e825d Merge pull request #1254 from DustinWin/dev
优化域名嗅探
2026-04-06 17:45:11 +08:00
DustinWin
bcb3d9cabd 优化域名嗅探 2026-04-06 17:33:28 +08:00
juewuy
49c509d6ef ~1.9.5alpha13 pkg 2026-04-04 20:24:46 +08:00
juewuy
47c7331623 ~首次添加节点订阅时,不再显示生成选项 2026-04-04 20:23:33 +08:00
juewuy
987ef6ab22 ~优化提示 2026-04-04 20:17:56 +08:00
juewuy
2218161e8f ~修复多语言化导致的自动任务无法正确执行的bug 2026-04-04 20:10:43 +08:00
juewuy
74b304be6f ~修复singbox内核tun模式ipv6相关bug 2026-04-04 20:01:24 +08:00
juewuy
a968551912 ~i18n fix 2026-04-04 19:54:34 +08:00
juewuy
13fc116985 ~修复本地上传内核报错问题 2026-04-04 19:50:42 +08:00
juewuy
2e7d615f8a ~修复编码 2026-04-04 19:35:24 +08:00
juewuy
6b6740a725 ~多语言化优化 2026-04-04 19:21:04 +08:00
juewuy
5e7a46c378 ~修复自定义内核功能异常,并增加Dustinwin内核库 2026-04-04 19:11:15 +08:00
juewuy
c304ec8271 ~修复多语言化导致的一系列显示错误 2026-04-04 18:44:47 +08:00
juewuy
cff3479213 ~bug fix 2026-04-04 12:05:10 +08:00
juewuy
5b94bce400 ~适配oix 2026-04-04 12:02:04 +08:00
juewuy
08e785dc2d ~增加ipv6host获取的fallback 2026-04-04 10:40:35 +08:00
juewuy
feb8ff9f80 Merge pull request #1250 from abcfy2/dev
修复 codex review 警告
2026-03-28 04:03:21 -07:00
Feng Yu
2d5df04dd4 修复 codex review 警告
从 IPv4 已过滤的 scope link 路由提取 LAN 接口名,再用这些接口名去查 IPv6 全局前缀
2026-03-28 12:47:15 +08:00
juewuy
b4a9702c82 Merge pull request #1248 from abcfy2/dev
添加 `.editorconfig` 配置,约束 `*.sh` 文件格式
2026-03-27 21:30:47 -07:00
juewuy
ee2fd53675 Merge pull request #1249 from abcfy2/fix/ipv6-dns
修复 ipv6 DNS 拦截错误的网段
2026-03-27 21:30:34 -07:00
Feng Yu
39084ffd1e 修复 ipv6 DNS 拦截错误的网段 2026-03-28 12:03:18 +08:00
Feng Yu
200d1729fb 添加 .editorconfig 配置,约束 *.sh 文件格式 2026-03-26 12:04:13 +08:00
juewuy
687e72a53f Merge pull request #1247 from abcfy2/dev
优化 web_save 逻辑,确保成功响应再保存
2026-03-25 19:53:44 -07:00
Feng Yu
8d51f0aab6 优化 web_save 逻辑,确保成功响应再保存 2026-03-25 22:12:31 +08:00
juewuy
837f99727a ~统一缩进 2026-03-25 20:15:42 +08:00
juewuy
ab29b5c036 ~1.9.5alpha12 pkg 2026-03-25 20:01:48 +08:00
juewuy
3e2ad3da2e ~1.9.5alpha12 pkg 2026-03-25 19:57:18 +08:00
juewuy
13aa2f20cf ~bug fix 2026-03-25 19:49:20 +08:00
juewuy
b1622958e0 ~singboxr增加urltest_unified_delay启用 2026-03-25 19:32:27 +08:00
juewuy
3dad12584a ~bug fix 2026-03-25 19:32:00 +08:00
juewuy
91ae2c88de ~i18h 2026-03-25 19:15:15 +08:00
91 changed files with 3514 additions and 3267 deletions

13
.editorconfig Normal file
View 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

View File

@@ -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.

View File

@@ -1,4 +1,4 @@
meta_v=v1.19.17
singboxr_v=1.13.0-alpha.27
versionsh=1.9.5alpha11
versionsh=1.9.5alpha14
GeoIP_v=20251205

View File

@@ -1,2 +0,0 @@
+.bing.com
+.linkedin.com

View File

@@ -29,4 +29,4 @@
516 DustinWin黑名单模式规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Blacklist.ini
517 DustinWin无广告黑名单模式规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Blacklist_NoAds.ini
518 DustinWin轻量规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Light.ini
519 DustinWin极简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Nano.ini
519 DustinWin极简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Nano.ini

32
public/servers_chs.list Normal file
View File

@@ -0,0 +1,32 @@
# ID&类型 说明 地址 其他说明 (类型100-三版全通源;200-单一源;300-基础sub;400-meta_sub;500-规则地址)
101 Jsdelivr_CDN源 https://cdn.jsdelivr.net/gh/juewuy/ShellCrash
102 Github直连源(请注意网络环境) https://raw.githubusercontent.com/juewuy/ShellCrash
103 ShellClash自建源(请勿滥用!) https://gh.jwsc.eu.org
104 Cloudflare_CDN源(推荐) https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash
202 http私人内测源(危险!非必要请勿使用) http://t.jwsc.eu.org 开发版
401 作者提供,支持vless|hy2 https://sub.jwsc.eu.org ua
402 肥羊提供(有广告),支持vless|hy2 https://api.v1.mk diyua
403 肥羊提供(有广告),支持vless|hy2 https://url.v1.mk diyua
501 Acl4SSR全能优化版 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash.ini (推荐)
502 Acl4SSR精简优化版 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Mini.ini (推荐)
503 Acl4SSR全能优化+去广告增强 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Block.ini
504 Acl4SSR极简版 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Nano.ini (适合自建节点)
505 Acl4SSR分流&游戏增强 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Full.ini
506 Acl4SSR分流&游戏&去广告增强 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Full_Block.ini (低性能设备慎用)
507 洞主规则精简版 https://github.com/juewuy/ShellCrash/raw/dev/rules/lhie1_clash.ini
508 洞主规则重度完整版 https://github.com/juewuy/ShellCrash/raw/dev/rules/lhie1_dler.ini
509 Acl4SSR多国精简 https://github.com/juewuy/ShellCrash/raw/dev/rules/ACL4SSR_Online_Mini_MultiCountry.ini
510 Acl4SSR回国专用 https://github.com/juewuy/ShellCrash/raw/dev/rules/ACL4SSR_BackCN.ini
511 Acl4SSR增强国外GFW https://github.com/juewuy/ShellCrash/raw/dev/rules/ACL4SSR_WithGFW.ini (适合黑名单模式使用)
512 DustinWin全分组规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Full.ini
513 DustinWin无广告全分组规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Full_NoAds.ini
514 DustinWin精简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Lite.ini (推荐)
515 DustinWin无广告精简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Lite_NoAds.ini
516 DustinWin黑名单模式规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Blacklist.ini
517 DustinWin无广告黑名单模式规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Blacklist_NoAds.ini
518 DustinWin轻量规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Light.ini
519 DustinWin极简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Nano.ini

30
public/servers_en.list Normal file
View File

@@ -0,0 +1,30 @@
# ID&类型 说明 地址 其他说明 (类型100-三版全通源;200-单一源;300-基础sub;400-meta_sub;500-规则地址)
101 Jsdelivr_CDN https://cdn.jsdelivr.net/gh/juewuy/ShellCrash
102 Github https://raw.githubusercontent.com/juewuy/ShellCrash
103 ShellClash https://gh.jwsc.eu.org
104 Cloudflare https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash
401 ... https://sub.jwsc.eu.org ua
402 ... https://api.v1.mk diyua
403 ... https://url.v1.mk diyua
501 Acl4SSR全能优化版 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash.ini (推荐)
502 Acl4SSR精简优化版 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Mini.ini (推荐)
503 Acl4SSR全能优化+去广告增强 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Block.ini
504 Acl4SSR极简版 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Nano.ini (适合自建节点)
505 Acl4SSR分流&游戏增强 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Full.ini
506 Acl4SSR分流&游戏&去广告增强 https://github.com/juewuy/ShellCrash/raw/dev/rules/ShellClash_Full_Block.ini (低性能设备慎用)
507 洞主规则精简版 https://github.com/juewuy/ShellCrash/raw/dev/rules/lhie1_clash.ini
508 洞主规则重度完整版 https://github.com/juewuy/ShellCrash/raw/dev/rules/lhie1_dler.ini
509 Acl4SSR多国精简 https://github.com/juewuy/ShellCrash/raw/dev/rules/ACL4SSR_Online_Mini_MultiCountry.ini
510 Acl4SSR回国专用 https://github.com/juewuy/ShellCrash/raw/dev/rules/ACL4SSR_BackCN.ini
511 Acl4SSR增强国外GFW https://github.com/juewuy/ShellCrash/raw/dev/rules/ACL4SSR_WithGFW.ini (适合黑名单模式使用)
512 DustinWin全分组规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Full.ini
513 DustinWin无广告全分组规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Full_NoAds.ini
514 DustinWin精简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Lite.ini (推荐)
515 DustinWin无广告精简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Lite_NoAds.ini
516 DustinWin黑名单模式规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Blacklist.ini
517 DustinWin无广告黑名单模式规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Blacklist_NoAds.ini
518 DustinWin轻量规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Light.ini
519 DustinWin极简规则 https://raw.githubusercontent.com/DustinWin/ruleset_geodata/master/rule_templates/DustinWin_Nano.ini

19
public/task_en.list Normal file
View File

@@ -0,0 +1,19 @@
#TaskID#TaskCommand#TaskDescription (use # as separator; # is not allowed in command or description)
101#$CRASHDIR/start.sh start#Start ShellCrash
102#$CRASHDIR/start.sh stop#Stop ShellCrash service
103#$CRASHDIR/start.sh restart#Restart ShellCrash service
104#$CRASHDIR/task/task.sh update_config#Update online subscriptions and restart service
105#$CRASHDIR/task/task.sh hotupdate#Hot update online subscriptions (without restart)
106#$CRASHDIR/task/task.sh web_save_auto#Automatically save panel configuration
107#$CRASHDIR/task/task.sh ntp#Automatically sync NTP time
111#$CRASHDIR/task/task.sh update_core#Automatically update core
112#$CRASHDIR/task/task.sh update_scripts#Automatically update scripts
113#$CRASHDIR/task/task.sh update_mmdb#Automatically update database files
121#$CRASHDIR/task/task.sh reset_firewall#Reset transparent routing firewall
122#sleep 70 && touch /etc/banner && reboot#Reboot router device use with caution

View File

@@ -17,13 +17,15 @@
[ -f "/data/etc/crontabs/root" ] && systype=mi_snapshot #小米设备
[ -w "/var/mnt/cfg/firewall" ] && systype=ng_snapshot #NETGEAR设备
#容器内环境
grep -qE '/(docker|lxc|kubepods|crio|containerd)/' /proc/1/cgroup || [ -f /run/.containerenv ] || [ -f /.dockerenv ] && systype='container'
grep -qE '/(docker|lxc|kubepods|crio|containerd)/' /proc/1/cgroup 2>/dev/null || [ -f /run/.containerenv ] || [ -f /.dockerenv ] && systype='container'
#检查环境变量
[ "$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
##############################
@@ -37,11 +39,11 @@ mkdir -p "$CRASHDIR"/configs
#判断系统类型写入不同的启动文件
[ -w /usr/lib/systemd/system ] && sysdir=/usr/lib/systemd/system
[ -w /etc/systemd/system ] && sysdir=/etc/systemd/system
if [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ]; then
if [ -f /etc/rc.common -a "$(cat /proc/1/comm 2>/dev/null)" = "procd" ]; then
#设为init.d方式启动
cp -f "$CRASHDIR"/starts/shellcrash.procd /etc/init.d/shellcrash
chmod 755 /etc/init.d/shellcrash
elif [ -n "$sysdir" -a "$USER" = "root" -a "$(cat /proc/1/comm)" = "systemd" ]; then
elif [ -n "$sysdir" -a "$USER" = "root" -a "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ]; then
#创建shellcrash用户
userdel shellcrash 2>/dev/null
sed -i '/0:7890/d' /etc/passwd
@@ -56,7 +58,7 @@ elif [ -n "$sysdir" -a "$USER" = "root" -a "$(cat /proc/1/comm)" = "systemd" ];
mv -f "$CRASHDIR"/starts/shellcrash.service "$sysdir"/shellcrash.service 2>/dev/null
sed -i "s%/etc/ShellCrash%$CRASHDIR%g" "$sysdir"/shellcrash.service
systemctl daemon-reload
rm -rf "$CRASHDIR"/starts/shellcrash.procd
rm -rf "$CRASHDIR"/starts/shellcrash.procd
elif rc-status -r >/dev/null 2>&1; then
#设为openrc方式启动
mv -f "$CRASHDIR"/starts/shellcrash.openrc /etc/init.d/shellcrash
@@ -65,7 +67,7 @@ elif rc-status -r >/dev/null 2>&1; then
else
#设为保守模式启动
setconfig start_old 已开启
rm -rf "$CRASHDIR"/starts/shellcrash.procd
rm -rf "$CRASHDIR"/starts/shellcrash.procd
fi
rm -rf "$CRASHDIR"/starts/shellcrash.service
rm -rf "$CRASHDIR"/starts/shellcrash.openrc
@@ -116,10 +118,10 @@ else
fi
#梅林/Padavan额外设置
[ -n "$initdir" ] && {
touch "$initdir"
touch "$initdir"
sed -i '/ShellCrash初始化/'d "$initdir"
echo "$CRASHDIR/starts/general_init.sh & #ShellCrash初始化脚本" >>"$initdir"
chmod 755 "$CRASHDIR"/starts/general_init.sh
chmod 755 "$CRASHDIR"/starts/general_init.sh
chmod a+rx "$initdir" 2>/dev/null
setconfig initdir "$initdir"
}
@@ -128,14 +130,14 @@ fi
#镜像化OpenWrt(snapshot)额外设置
if [ "$systype" = "mi_snapshot" -o "$systype" = "ng_snapshot" ]; then
chmod 755 "$CRASHDIR"/starts/snapshot_init.sh
if [ "$systype" = "mi_snapshot" ];then
path="/data/shellcrash_init.sh"
sed -i "s#^CRASHDIR=.*#CRASHDIR=$CRASHDIR#" "$CRASHDIR"/starts/snapshot_init.sh
mv -f "$CRASHDIR"/starts/snapshot_init.sh "$path"
[ ! -f /data/auto_start.sh ] && echo '#用于自定义需要开机启动的功能或者命令,会在开机后自动运行' > /data/auto_start.sh
else
path="$CRASHDIR"/starts/snapshot_init.sh
fi
if [ "$systype" = "mi_snapshot" ];then
path="/data/shellcrash_init.sh"
sed -i "s#^CRASHDIR=.*#CRASHDIR=$CRASHDIR#" "$CRASHDIR"/starts/snapshot_init.sh
mv -f "$CRASHDIR"/starts/snapshot_init.sh "$path"
[ ! -f /data/auto_start.sh ] && echo '#用于自定义需要开机启动的功能或者命令,会在开机后自动运行' > /data/auto_start.sh
else
path="$CRASHDIR"/starts/snapshot_init.sh
fi
uci delete firewall.auto_ssh 2>/dev/null
uci delete firewall.ShellCrash 2>/dev/null
uci set firewall.ShellCrash=include
@@ -157,15 +159,15 @@ fi
sed -i "/^PATH=/a\\$CRASHDIR/start.sh init & #ShellCrash初始化脚本" "$dir/asusware.arm/etc/init.d/S50downloadmaster"
#容器环境额外设置
[ "$systype" = 'container' ] && {
setconfig userguide '1'
setconfig crashcore 'meta'
setconfig dns_mod 'mix'
setconfig firewall_area '1'
setconfig firewall_mod 'nftables'
setconfig release_type 'master'
setconfig start_old 'OFF'
echo "$CRASHDIR/menu.sh" >> /etc/profile
cat > /usr/bin/crash <<'EOF'
setconfig userguide '1'
setconfig crashcore 'meta'
setconfig dns_mod 'mix'
setconfig firewall_area '1'
setconfig firewall_mod 'nftables'
setconfig release_type 'master'
setconfig start_old 'OFF'
echo "$CRASHDIR/menu.sh" >> /etc/profile
cat > /usr/bin/crash <<'EOF'
#!/bin/sh
CRASHDIR=${CRASHDIR:-/etc/ShellCrash}
export CRASHDIR
@@ -187,9 +189,18 @@ for file in config.yaml.bak user.yaml proxies.yaml proxy-groups.yaml rules.yaml
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/yamls/"$file" 2>/dev/null
done
[ ! -L "$CRASHDIR"/config.yaml ] && mv -f "$CRASHDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml 2>/dev/null
for file in fake_ip_filter mac web_save servers.list fake_ip_filter.list fallback_filter.list singbox_providers.list clash_providers.list; do
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
#数据库改名
@@ -202,7 +213,7 @@ mv -f "$CRASHDIR"/*.mrs "$CRASHDIR"/ruleset/ 2>/dev/null
for file in dropbear_rsa_host_key authorized_keys tun.ko ShellDDNS.sh; do
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/tools/"$file" 2>/dev/null
done
for file in cron task.list; do
for file in cron task_chs.list task_en.list; do
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/task/"$file" 2>/dev/null
done
mv -f "$CRASHDIR"/menus/task_cmd.sh "$CRASHDIR"/task/task.sh 2>/dev/null

View File

@@ -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="自定义端口及密钥"

View File

@@ -1,4 +1,4 @@
GW_TITLE="访问与控制菜单"
GW_TITLE="访问与控制菜单"
GW_WARN="注意:"
GW_FW_VPS_HINT="如在vps运行还需在vps安全策略对相关端口同时放行"
GW_FW_PORT_LIMIT="最多支持设置放行10个端口请先减少一些"

View File

@@ -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="合并成功!"

View File

@@ -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="无上述问题的设备请勿使用!"

View File

@@ -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配置"
@@ -51,17 +52,6 @@ DNS_IPV6_NOT_SUPPORT="该选项暂不支持IPv6加密DNS"
DNS_ENCRYPT_OK="已设置加密DNS如遇DNS解析问题请重置DNS配置"
DNS_CORE_REQUIRE="请使用Mihomo或SingBox内核"
DNS_SET_TO="设为"
DNS_PROTECT_NOW="当前"
DNS_HOSTS_NOW="当前"
DNS_ENABLED="已启用"
DNS_DISABLED="已禁用"
DNS_PROTECT_DISABLE_Q="DNS防泄漏是否确认禁用"
DNS_PROTECT_ENABLE_Q="DNS防泄漏是否确认启用"
DNS_HOSTS_DISABLE_Q="Hosts优化是否确认禁用"
DNS_HOSTS_ENABLE_Q="Hosts优化是否确认启用"
DNS_YES="是"
DNS_RESET_DEFAULT="重置为默认值"
DNS_NO_BACK="否,返回上级菜单"
DNS_REMOVE_OK="移除成功"
DNS_REMOVE_FAIL="移除失败"
DNS_INPUT_REDIR_PORT="请直接输入旁路由IPV4地址"
@@ -72,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地址"

View File

@@ -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"

View File

@@ -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="是否立即加载为配置文件?"

View File

@@ -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) 是"

View File

@@ -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"
@@ -138,7 +139,6 @@ SET_SNIFFER_ENABLE_Q=" domain sniffer. Enable now?"
SET_SNIFFER_DISABLE_Q=" domain sniffer. Disable now?"
SET_LANG_ZH="简体中文"
SET_LANG_EN="English"
SET_SWITCH_RERUN="Switched successfully! Please re-run the script!"
SET_SWITCH_OK="Switched successfully!"
SET_MODE_SUFFIX="mode"
SET_SET_TO="Set to "

View File

@@ -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!"

View File

@@ -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!"

View File

@@ -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"
@@ -53,17 +54,6 @@ DNS_IPV6_NOT_SUPPORT="This option does not support IPv6 encrypted DNS!"
DNS_ENCRYPT_OK="Encrypted DNS has been configured. If DNS issues occur, please reset DNS settings."
DNS_CORE_REQUIRE="Please use the Mihomo or SingBox core"
DNS_SET_TO="Set to"
DNS_PROTECT_NOW="Current status: "
DNS_HOSTS_NOW="Current status: "
DNS_ENABLED="enabled"
DNS_DISABLED="disabled"
DNS_PROTECT_DISABLE_Q=" DNS leak protection. Disable now?"
DNS_PROTECT_ENABLE_Q=" DNS leak protection. Enable now?"
DNS_HOSTS_DISABLE_Q=" Hosts optimization. Disable now?"
DNS_HOSTS_ENABLE_Q=" Hosts optimization. Enable now?"
DNS_YES="Yes"
DNS_RESET_DEFAULT="Reset to defaults"
DNS_NO_BACK="No, back"
DNS_REMOVE_OK="Removed successfully"
DNS_REMOVE_FAIL="Remove failed"
DNS_INPUT_REDIR_PORT="Please input bypass-router IPv4 address"
@@ -74,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"

View File

@@ -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"

View File

@@ -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) > "

View File

@@ -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"

View File

@@ -1,17 +1,17 @@
check_autostart(){
if [ "$start_old" = ON ];then
[ ! -f "$CRASHDIR"/.dis_startup ] && return 0
elif [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ]; then
[ -n "$(find /etc/rc.d -name '*shellcrash')" ] && return 0
[ ! -f "$CRASHDIR"/.dis_startup ] && return 0
elif ckcmd systemctl; then
[ "$(systemctl is-enabled shellcrash.service 2>&1)" = enabled ] && return 0
elif grep -q 's6' /proc/1/comm; then
[ -f /etc/s6-overlay/s6-rc.d/user/contents.d/afstart ] && return 0
elif rc-status -r >/dev/null 2>&1; then
rc-update show default | grep -q "shellcrash" && return 0
else
return 1
fi
return 1
if [ "$start_old" = ON ];then
[ ! -f "$CRASHDIR"/.dis_startup ] && return 0
elif [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ]; then
[ -n "$(find /etc/rc.d -name '*shellcrash')" ] && return 0
[ ! -f "$CRASHDIR"/.dis_startup ] && return 0
elif ckcmd systemctl; then
[ "$(systemctl is-enabled shellcrash.service 2>&1)" = enabled ] && return 0
elif grep -q 's6' /proc/1/comm; then
[ -f /etc/s6-overlay/s6-rc.d/user/contents.d/afstart ] && return 0
elif rc-status -r >/dev/null 2>&1; then
rc-update show default | grep -q "shellcrash" && return 0
else
return 1
fi
return 1
}

View File

@@ -1,14 +1,14 @@
check_cpucore(){ #自动获取内核架构
cputype=$(uname -ms | tr ' ' '_' | tr '[A-Z]' '[a-z]')
[ -n "$(echo $cputype | grep -E "linux.*armv.*")" ] && cpucore="armv5"
[ -n "$(echo $cputype | grep -E "linux.*armv7.*")" ] && [ -n "$(cat /proc/cpuinfo | grep vfp)" ] && [ ! -d /jffs ] && cpucore="armv7"
[ -n "$(echo $cputype | grep -E "linux.*aarch64.*|linux.*armv8.*")" ] && cpucore="arm64"
[ -n "$(echo $cputype | grep -E "linux.*86.*")" ] && cpucore="386"
[ -n "$(echo $cputype | grep -E "linux.*86_64.*")" ] && cpucore="amd64"
if [ -n "$(echo $cputype | grep -E "linux.*mips.*")" ];then
mipstype=$(echo -n I | hexdump -o 2>/dev/null | awk '{ print substr($2,6,1); exit}') #通过判断大小端判断mips或mipsle
[ "$mipstype" = "0" ] && cpucore="mips-softfloat" || cpucore="mipsle-softfloat"
fi
[ -n "$cpucore" ] && setconfig cpucore $cpucore
cputype=$(uname -ms | tr ' ' '_' | tr '[A-Z]' '[a-z]')
[ -n "$(echo $cputype | grep -E "linux.*armv.*")" ] && cpucore="armv5"
[ -n "$(echo $cputype | grep -E "linux.*armv7.*")" ] && [ -n "$(cat /proc/cpuinfo | grep vfp)" ] && [ ! -d /jffs ] && cpucore="armv7"
[ -n "$(echo $cputype | grep -E "linux.*aarch64.*|linux.*armv8.*")" ] && cpucore="arm64"
[ -n "$(echo $cputype | grep -E "linux.*86.*")" ] && cpucore="386"
[ -n "$(echo $cputype | grep -E "linux.*86_64.*")" ] && cpucore="amd64"
if [ -n "$(echo $cputype | grep -E "linux.*mips.*")" ];then
mipstype=$(echo -n I | hexdump -o 2>/dev/null | awk '{ print substr($2,6,1); exit}') #通过判断大小端判断mips或mipsle
[ "$mipstype" = "0" ] && cpucore="mips-softfloat" || cpucore="mipsle-softfloat"
fi
[ -n "$cpucore" ] && setconfig cpucore $cpucore
}

View File

@@ -1,5 +1,5 @@
#检查目录剩余空间——$1:目标路径 $2:-h参数
dir_avail() {
df -h >/dev/null 2>&1 && h="$2"
df -h >/dev/null 2>&1 && h="$2"
df -P $h "${1:-.}" 2>/dev/null | awk 'NR==2 {print $4}'
}

View File

@@ -1,8 +1,8 @@
if echo "$crashcore" | grep -q 'singbox'; then
target=singbox
format=json
target=singbox
format=json
else
target=clash
format=yaml
target=clash
format=yaml
fi
core_config="$CRASHDIR/${format}s/config.$format"

View File

@@ -3,7 +3,7 @@ compare() { #对比文件
return 1
elif ckcmd cmp; then
cmp -s "$1" "$2"
return $?
return $?
else
[ "$(cat "$1")" = "$(cat "$2")" ] && return 0 || return 1
fi

View File

@@ -3,87 +3,87 @@
[ -n "$(find --help 2>&1 | grep -o size)" ] && find_para=' -size +2000' #find命令兼容
core_unzip() { #$1:需要解压的文件 $2:目标文件名
if echo "$1" |grep -q 'tar.gz$' ;then
[ "$BINDIR" = "$TMPDIR" ] && rm -rf "$TMPDIR"/CrashCore #小闪存模式防止空间不足
[ -n "$(tar --help 2>&1 | grep -o 'no-same-owner')" ] && tar_para='--no-same-owner' #tar命令兼容
mkdir -p "$TMPDIR"/core_tmp
tar -zxf "$1" ${tar_para} -C "$TMPDIR"/core_tmp/
for file in $(find "$TMPDIR"/core_tmp $find_para 2>/dev/null); do
[ -f "$file" ] && [ -n "$(echo $file | sed 's#.*/##' | grep -iE '(CrashCore|sing|meta|mihomo|clash|pre)')" ] && mv -f "$file" "$TMPDIR"/"$2"
done
rm -rf "$TMPDIR"/core_tmp
elif echo "$1" |grep -q '.gz$' ;then
gunzip -c "$1" > "$TMPDIR"/"$2"
elif echo "$1" |grep -q '.upx$' ;then
ln -sf "$1" "$TMPDIR"/"$2"
else
mv -f "$1" "$TMPDIR"/"$2"
fi
chmod +x "$TMPDIR"/"$2"
if echo "$1" |grep -q 'tar.gz$' ;then
[ "$BINDIR" = "$TMPDIR" ] && rm -rf "$TMPDIR"/CrashCore #小闪存模式防止空间不足
[ -n "$(tar --help 2>&1 | grep -o 'no-same-owner')" ] && tar_para='--no-same-owner' #tar命令兼容
mkdir -p "$TMPDIR"/core_tmp
tar -zxf "$1" ${tar_para} -C "$TMPDIR"/core_tmp/
for file in $(find "$TMPDIR"/core_tmp $find_para 2>/dev/null); do
[ -f "$file" ] && [ -n "$(echo $file | sed 's#.*/##' | grep -iE '(CrashCore|sing|meta|mihomo|clash|pre)')" ] && mv -f "$file" "$TMPDIR"/"$2"
done
rm -rf "$TMPDIR"/core_tmp
elif echo "$1" |grep -q '.gz$' ;then
gunzip -c "$1" > "$TMPDIR"/"$2"
elif echo "$1" |grep -q '.upx$' ;then
ln -sf "$1" "$TMPDIR"/"$2"
else
mv -f "$1" "$TMPDIR"/"$2"
fi
chmod +x "$TMPDIR"/"$2"
}
core_find(){
if [ ! -f "$TMPDIR"/CrashCore ];then
[ -n "$(find "$CRASHDIR"/CrashCore.* $find_para 2>/dev/null)" ] && [ "$CRASHDIR" != "$BINDIR" ] &&
mv -f "$CRASHDIR"/CrashCore.* "$BINDIR"/
core_dir=$(find "$BINDIR"/CrashCore.* $find_para 2>/dev/null | head -n 1)
[ -n "$core_dir" ] && core_unzip "$core_dir" CrashCore
fi
if [ ! -f "$TMPDIR"/CrashCore ];then
[ -n "$(find "$CRASHDIR"/CrashCore.* $find_para 2>/dev/null)" ] && [ "$CRASHDIR" != "$BINDIR" ] &&
mv -f "$CRASHDIR"/CrashCore.* "$BINDIR"/
core_dir=$(find "$BINDIR"/CrashCore.* $find_para 2>/dev/null | head -n 1)
[ -n "$core_dir" ] && core_unzip "$core_dir" CrashCore
fi
}
core_check(){
[ -n "$(pidof CrashCore)" ] && "$CRASHDIR"/start.sh stop #停止内核服务防止内存不足
core_unzip "$1" core_new
sbcheck=$(echo "$crashcore" | grep 'singbox')
v=''
if [ -n "$sbcheck" ] && "$TMPDIR"/core_new -h 2>&1 | grep -q 'sing-box'; then
v=$("$TMPDIR"/core_new version 2>/dev/null | grep version | awk '{print $3}')
COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"'
elif [ -z "$sbcheck" ] && "$TMPDIR"/core_new -h 2>&1 | grep -q '\-t';then
v=$("$TMPDIR"/core_new -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //')
COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
fi
if [ -z "$v" ]; then
rm -rf "$1" "$TMPDIR"/core_new
return 2
else
rm -f "$BINDIR"/CrashCore.tar.gz "$BINDIR"/CrashCore.gz "$BINDIR"/CrashCore.upx
if [ -z "$zip_type" ];then
gzip -c "$TMPDIR/core_new" > "$BINDIR/CrashCore.gz"
else
mv -f "$1" "$BINDIR/CrashCore.$zip_type"
fi
if [ "$zip_type" = 'upx' ];then
rm -f "$1" "$TMPDIR"/core_new
ln -sf "$TMPDIR/CrashCore.upx" "$TMPDIR/CrashCore"
else
mv -f "$TMPDIR/core_new" "$TMPDIR/CrashCore"
fi
core_v="$v"
setconfig COMMAND "$COMMAND" "$CRASHDIR"/configs/command.env && . "$CRASHDIR"/configs/command.env
setconfig crashcore "$crashcore"
setconfig core_v "$core_v"
setconfig custcorelink "$custcorelink"
return 0
fi
[ -n "$(pidof CrashCore)" ] && "$CRASHDIR"/start.sh stop #停止内核服务防止内存不足
core_unzip "$1" core_new
sbcheck=$(echo "$crashcore" | grep 'singbox')
v=''
if [ -n "$sbcheck" ] && "$TMPDIR"/core_new -h 2>&1 | grep -q 'sing-box'; then
v=$("$TMPDIR"/core_new version 2>/dev/null | grep version | awk '{print $3}')
COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"'
elif [ -z "$sbcheck" ] && "$TMPDIR"/core_new -h 2>&1 | grep -q '\-t';then
v=$("$TMPDIR"/core_new -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //')
COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
fi
if [ -z "$v" ]; then
rm -rf "$1" "$TMPDIR"/core_new
return 2
else
rm -f "$BINDIR"/CrashCore.tar.gz "$BINDIR"/CrashCore.gz "$BINDIR"/CrashCore.upx
if [ -z "$zip_type" ];then
gzip -c "$TMPDIR/core_new" > "$BINDIR/CrashCore.gz"
else
mv -f "$1" "$BINDIR/CrashCore.$zip_type"
fi
if [ "$zip_type" = 'upx' ];then
rm -f "$1" "$TMPDIR"/core_new
ln -sf "$TMPDIR/CrashCore.upx" "$TMPDIR/CrashCore"
else
mv -f "$TMPDIR/core_new" "$TMPDIR/CrashCore"
fi
core_v="$v"
setconfig COMMAND "$COMMAND" "$CRASHDIR"/configs/command.env && . "$CRASHDIR"/configs/command.env
setconfig crashcore "$crashcore"
setconfig core_v "$core_v"
setconfig custcorelink "$custcorelink"
return 0
fi
}
core_webget(){
. "$CRASHDIR"/libs/web_get_bin.sh
. "$CRASHDIR"/libs/check_target.sh
if [ -z "$custcorelink" ];then
[ -z "$zip_type" ] && zip_type='tar.gz'
get_bin "$TMPDIR/Coretmp.$zip_type" "bin/$crashcore/${target}-linux-${cpucore}.$zip_type"
else
case "$custcorelink" in
*.tar.gz) zip_type="tar.gz" ;;
*.gz) zip_type="gz" ;;
*.upx) zip_type="upx" ;;
esac
[ -n "$zip_type" ] && webget "$TMPDIR/Coretmp.$zip_type" "$custcorelink"
fi
#校验内核
if [ "$?" = 0 ];then
core_check "$TMPDIR/Coretmp.$zip_type"
else
rm -f "$TMPDIR/Coretmp.$zip_type"
return 1
fi
. "$CRASHDIR"/libs/web_get_bin.sh
. "$CRASHDIR"/libs/check_target.sh
if [ -z "$custcorelink" ];then
[ -z "$zip_type" ] && zip_type='tar.gz'
get_bin "$TMPDIR/Coretmp.$zip_type" "bin/$crashcore/${target}-linux-${cpucore}.$zip_type"
else
case "$custcorelink" in
*.tar.gz) zip_type="tar.gz" ;;
*.gz) zip_type="gz" ;;
*.upx) zip_type="upx" ;;
esac
[ -n "$zip_type" ] && webget "$TMPDIR/Coretmp.$zip_type" "$custcorelink"
fi
#校验内核
if [ "$?" = 0 ];then
core_check "$TMPDIR/Coretmp.$zip_type"
else
rm -f "$TMPDIR/Coretmp.$zip_type"
return 1
fi
}

View File

@@ -1,26 +1,26 @@
#生成指定位数的加密秘钥符合ss2022协议
gen_random() {
if ckcmd openssl;then
openssl rand --base64 "$1"
elif ckcmd base64;then
head -c "$1" /dev/urandom | base64 | tr -d '\n'
elif busybox base64 --help >/dev/null 2>&1;then
head -c "$1" /dev/urandom | base64 | tr -d '\n'
elif ckcmd uuencode;then
head -c "$1" /dev/urandom | uuencode -m - | sed -n '2p'
else
return 1
fi
openssl rand --base64 "$1"
elif ckcmd base64;then
head -c "$1" /dev/urandom | base64 | tr -d '\n'
elif busybox base64 --help >/dev/null 2>&1;then
head -c "$1" /dev/urandom | base64 | tr -d '\n'
elif ckcmd uuencode;then
head -c "$1" /dev/urandom | uuencode -m - | sed -n '2p'
else
return 1
fi
}
#对指定字符串进行base64转码
gen_base64() {
if ckcmd base64;then
echo -n "$1" | base64 | tr -d '\n'
elif busybox base64 --help >/dev/null 2>&1;then
echo -n "$1" | busybox base64 | tr -d '\n'
elif ckcmd openssl;then
echo -n "$1" | openssl base64 -A
else
return 1
fi
if ckcmd base64;then
echo -n "$1" | base64 | tr -d '\n'
elif busybox base64 --help >/dev/null 2>&1;then
echo -n "$1" | busybox base64 | tr -d '\n'
elif ckcmd openssl;then
echo -n "$1" | openssl base64 -A
else
return 1
fi
}

View File

@@ -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
@@ -15,8 +16,9 @@ routing_mark=$((fwmark + 2))
[ -z "$table" ] && table=100
[ -z "$dns_nameserver" ] && {
dns_nameserver='223.5.5.5, 1.2.4.8'
netstat -ntlup 2>/dev/null | grep -q '127.0.0.1:53' && dns_nameserver='127.0.0.1'
dns_nameserver='223.5.5.5, 1.2.4.8'
netstat -ntlup 2>/dev/null | grep -q '127.0.0.1:53' && dns_nameserver='127.0.0.1'
}
[ -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"

View File

@@ -5,11 +5,11 @@ get_ecs_address() {
ip=$(grep -A1 "^# Interface wan$" "$f" | grep nameserver | awk '{printf "%s ", $2}')
[ -n "$ip" ] && return
done
. "$CRASHDIR"/libs/web_get_lite.sh
for web in http://members.3322.org/dyndns/getip http://4.ipw.cn http://ipinfo.io/ip; do
ip=$(web_get_lite "$web" 0)
[ -n "$ip" ] && return
done
. "$CRASHDIR"/libs/web_get_lite.sh
for web in http://members.3322.org/dyndns/getip http://4.ipw.cn http://ipinfo.io/ip; do
ip=$(web_get_lite "$web" 0)
[ -n "$ip" ] && return
done
}
get_ecs_address
[ -n "$ip" ] && ecs_address="${ip%.*}.0/24"

View File

@@ -1,8 +1,8 @@
load_lang() {
i18n=$(cat "$CRASHDIR"/configs/i18n.cfg 2>/dev/null)
[ -z "$i18n" ] && i18n=chs
file="$CRASHDIR/lang/$i18n/$1.lang"
[ -s "$file" ] && . "$file"
[ -z "$i18n" ] && i18n=chs
i18n_file="$CRASHDIR/lang/$i18n/$1.lang"
[ -s "$i18n_file" ] && . "$i18n_file"
}

View File

@@ -6,13 +6,13 @@ __IS_LIB_LOGGER=1
. "$CRASHDIR"/libs/web_json.sh
#$1日志内容$2显示颜色$3是否推送$4是否覆盖上一条
logger() {
TMPDIR=/tmp/ShellCrash
TMPDIR=/tmp/ShellCrash
[ -n "$2" -a "$2" != 0 ] && printf "\033[%sm%s\033[0m\n" "$2" "$1"
log_text="$(date "+%G-%m-%d_%H:%M:%S")~$1"
[ "$4" = on ] && sed -i "/$1/d" "$TMPDIR"/ShellCrash.log
[ "$4" = on ] && sed -i "/$1/d" "$TMPDIR"/ShellCrash.log
echo "$log_text" >>"$TMPDIR"/ShellCrash.log
[ "$(wc -l "$TMPDIR"/ShellCrash.log | awk '{print $1}')" -gt 199 ] && sed -i '1,20d' "$TMPDIR"/ShellCrash.log
#推送远程日志
#推送远程日志
[ "$3" != off ] && {
[ -n "$device_name" ] && log_text="$log_text($device_name)"
[ -n "$push_TG" ] && {
@@ -51,6 +51,6 @@ logger() {
url="${push_ChatURL}/webapi/entry.cgi?api=SYNO.Chat.External&method=chatbot&version=2&token=${push_ChatTOKEN}"
content="payload={\"text\":\"${log_text}\", \"user_ids\":[${push_ChatUSERID}]}"
web_json_post "$url" "$content" &
}
}
} &
}

View File

@@ -3,7 +3,7 @@
#meta内核vmess入站生成
[ "$vms_service" = ON ] && {
cat >>"$TMPDIR"/listeners.yaml <<EOF
cat >>"$TMPDIR"/listeners.yaml <<EOF
- name: "vmess-in"
type: vmess
port: $vms_port
@@ -16,7 +16,7 @@ EOF
}
#meta内核ss入站生成
[ "$sss_service" = ON ] && {
cat >>"$TMPDIR"/listeners.yaml <<EOF
cat >>"$TMPDIR"/listeners.yaml <<EOF
- name: "ss-in"
type: shadowsocks
port: $sss_port

View File

@@ -2,24 +2,24 @@
# Copyright (C) Juewuy
[ "$ts_service" = ON ] && ! grep -q '"tailscale"' "$CRASHDIR"/jsons/endpoints.json 2>/dev/null && {
[ "$ts_subnet" = true ] && {
. "$CRASHDIR"/starts/fw_getlanip.sh && getlanip
advertise_routes=$(echo "$host_ipv4"|sed 's/[[:space:]]\+/", "/g; s/^/"/; s/$/"/')
}
[ -z "$ts_exit_node" ] && ts_exit_node=false
[ -z "$ts_hostname" ] && ts_hostname='ShellCrash'
cat >"$TMPDIR"/jsons/tailscale.json <<EOF
[ "$ts_subnet" = true ] && {
. "$CRASHDIR"/starts/fw_getlanip.sh && getlanip
advertise_routes=$(echo "$host_ipv4"|sed 's/[[:space:]]\+/", "/g; s/^/"/; s/$/"/')
}
[ -z "$ts_exit_node" ] && ts_exit_node=false
[ -z "$ts_hostname" ] && ts_hostname='ShellCrash'
cat >"$TMPDIR"/jsons/tailscale.json <<EOF
{
"endpoints": [
{
"type": "tailscale",
"tag": "ts-ep",
"state_directory": "$CRASHDIR/tailscale",
"auth_key": "$ts_auth_key",
"hostname": "$ts_hostname",
"advertise_routes": [$advertise_routes],
"advertise_exit_node": $ts_exit_node,
"udp_timeout": "5m"
"type": "tailscale",
"tag": "ts-ep",
"state_directory": "$CRASHDIR/tailscale",
"auth_key": "$ts_auth_key",
"hostname": "$ts_hostname",
"advertise_routes": [$advertise_routes],
"advertise_exit_node": $ts_exit_node,
"udp_timeout": "5m"
}
]
}
@@ -27,27 +27,27 @@ EOF
}
[ "$wg_service" = ON ] && ! grep -q '"wireguard"' "$CRASHDIR"/jsons/endpoints.json 2>/dev/null && {
[ -n "$wg_ipv6" ] && wg_ipv6_add=", \"$wg_ipv6\""
cat >"$TMPDIR"/jsons/wireguard.json <<EOF
[ -n "$wg_ipv6" ] && wg_ipv6_add=", \"$wg_ipv6\""
cat >"$TMPDIR"/jsons/wireguard.json <<EOF
{
"endpoints": [
{
"type": "wireguard",
"tag": "wg-ep",
"system": true,
"mtu": 1420,
"address": [ "$wg_ipv4"$wg_ipv6_add ],
"private_key": "$wg_private_key",
"peers": [
{
"address": "$wg_server",
"port": $wg_port,
"public_key": "$wg_public_key",
"pre_shared_key": "$wg_pre_shared_key",
"allowed_ips": ["0.0.0.0/0", "::/0"]
}
]
}
{
"type": "wireguard",
"tag": "wg-ep",
"system": true,
"mtu": 1420,
"address": [ "$wg_ipv4"$wg_ipv6_add ],
"private_key": "$wg_private_key",
"peers": [
{
"address": "$wg_server",
"port": $wg_port,
"public_key": "$wg_public_key",
"pre_shared_key": "$wg_pre_shared_key",
"allowed_ips": ["0.0.0.0/0", "::/0"]
}
]
}
]
}
EOF

View File

@@ -2,8 +2,8 @@
# Copyright (C) Juewuy
[ "$vms_service" = ON ] && {
[ -n "$vms_ws_path" ] && transport=', "transport": { "type": "ws", "path": "'"$vms_ws_path"'" }'
cat >"$TMPDIR"/jsons/vmess-in.json <<EOF
[ -n "$vms_ws_path" ] && transport=', "transport": { "type": "ws", "path": "'"$vms_ws_path"'" }'
cat >"$TMPDIR"/jsons/vmess-in.json <<EOF
{
"inbounds": [
{
@@ -11,7 +11,7 @@
"tag": "vmess-in",
"listen": "::",
"listen_port": $vms_port,
"users": [
"users": [
{
"uuid": "$vms_uuid"
}
@@ -23,17 +23,17 @@ EOF
}
[ "$sss_service" = ON ] && {
cat >"$TMPDIR"/jsons/ss-in.json <<EOF
cat >"$TMPDIR"/jsons/ss-in.json <<EOF
{
"inbounds": [
{
"type": "shadowsocks",
"tag": "ss-in",
{
"type": "shadowsocks",
"tag": "ss-in",
"listen": "::",
"listen_port": $sss_port,
"method": "$sss_cipher",
"password": "$sss_pwd",
}
"method": "$sss_cipher",
"password": "$sss_pwd",
}
]
}
EOF

View File

@@ -1,6 +1,6 @@
#参数1代表变量名参数2代表变量值,参数3即文件路径
setconfig() {
[ -z "$3" ] && configpath="$CRASHDIR"/configs/ShellCrash.cfg || configpath="${3}"
sed -i "/^${1}=.*/d" "$configpath"
printf '%s=%s\n' "$1" "$2" >>"$configpath"
sed -i "/^${1}=.*/d" "$configpath"
printf '%s=%s\n' "$1" "$2" >>"$configpath"
}

View File

@@ -4,36 +4,38 @@ 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"
cronadd() { #定时任务工具
if crontab -h 2>&1 | grep -q '\-l'; then
if crontab -h 2>&1 | grep -q '\-l'; then
crontab "$1"
elif [ -f "$crondir/$USER" ];then
cat "$1" >"$crondir"/"$USER" && cru a REFRESH "0 0 1 1 * /bin/true" 2>/dev/null
else
echo "找不到可用的crond或者crontab应用No available crond or crontab application can be found!"
fi
elif [ -f "$crondir/$USER" ];then
cat "$1" >"$crondir"/"$USER" && cru a REFRESH "0 0 1 1 * /bin/true" 2>/dev/null
else
echo "找不到可用的crond或者crontab应用No available crond or crontab application can be found!"
fi
}
cronload() { #定时任务工具
if crontab -h 2>&1 | grep -q '\-l'; then
if crontab -h 2>&1 | grep -q '\-l'; then
crontab -l
elif [ -f "$crondir/$USER" ];then
cat "$crondir"/"$USER" 2>/dev/null
else
return 1
fi
elif [ -f "$crondir/$USER" ];then
cat "$crondir"/"$USER" 2>/dev/null
else
return 1
fi
}
cronset() { #定时任务设置
# 参数1代表要移除的关键字,参数2代表要添加的任务语句
cronload | grep -v '^$' | grep -vF "$1" >"$tmpcron"
[ -n "$2" ] && echo "$2" >>"$tmpcron"
cronadd "$tmpcron"
#华硕/Padavan固件存档在本地,其他则删除
if [ -d /jffs ] || [ -d /etc/storage/ShellCrash ];then
mv -f "$tmpcron" "$CRASHDIR"/task/cron
else
rm -f "$tmpcron"
fi
cronadd "$tmpcron"
#华硕/Padavan固件存档在本地,其他则删除
if [ -d /jffs ] || [ -d /etc/storage/ShellCrash ];then
mkdir -p "$TASKCFGDIR"
mv -f "$tmpcron" "$TASKCFGDIR"/cron
else
rm -f "$tmpcron"
fi
}

View File

@@ -5,5 +5,5 @@ set_profile() {
echo "alias ${my_alias}=\"$shtype $CRASHDIR/menu.sh\"" >>"$1" #设置快捷命令环境变量
sed -i '/export CRASHDIR=*/'d "$1"
echo "export CRASHDIR=\"$CRASHDIR\"" >>"$1" #设置路径环境变量
. "$1" >/dev/null 2>&1 || true
. "$1" >/dev/null 2>&1 || true
}

View File

@@ -1,9 +1,9 @@
setproxy(){
[ -n "$(pidof CrashCore)" ] && {
[ -n "$authentication" ] && auth="$authentication@" || auth=""
[ -z "$mix_port" ] && mix_port=7890
export https_proxy="http://${auth}127.0.0.1:$mix_port"
export http_proxy="http://${auth}127.0.0.1:$mix_port"
}
[ -n "$(pidof CrashCore)" ] && {
[ -n "$authentication" ] && auth="$authentication@" || auth=""
[ -z "$mix_port" ] && mix_port=7890
export https_proxy="http://${auth}127.0.0.1:$mix_port"
export http_proxy="http://${auth}127.0.0.1:$mix_port"
}
}

View File

@@ -1,10 +1,10 @@
i=1
while [ -z "$test" -a "$i" -lt 30 ]; do
sleep 1
if curl --version >/dev/null 2>&1; then
test=$(curl -s -H "Authorization: Bearer $secret" http://127.0.0.1:${db_port}/proxies | grep -o proxies)
else
test=$(wget -q --header="Authorization: Bearer $secret" -O - http://127.0.0.1:${db_port}/proxies | grep -o proxies)
fi
i=$((i + 1))
sleep 1
if curl --version >/dev/null 2>&1; then
test=$(curl -s -H "Authorization: Bearer $secret" http://127.0.0.1:${db_port}/proxies | grep -o proxies)
else
test=$(wget -q --header="Authorization: Bearer $secret" -O - http://127.0.0.1:${db_port}/proxies | grep -o proxies)
fi
i=$((i + 1))
done

View File

@@ -1,77 +1,77 @@
. "$CRASHDIR"/libs/set_proxy.sh
webget(){
if pidof CrashCore >/dev/null; then
setproxy #设置临时代理,【$1】代表下载目录【$2】代表在线地址
url=$(printf '%s\n' "$2" |
sed -e 's#https://.*jsdelivr.net/gh/juewuy/ShellCrash[@|/]#https://raw.githubusercontent.com/juewuy/ShellCrash/#' \
-e 's#https://gh.jwsc.eu.org/#https://raw.githubusercontent.com/juewuy/ShellCrash/#')
else
url=$(printf '%s\n' "$2" |
sed 's#https://raw.githubusercontent.com/juewuy/ShellCrash/#https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@#')
fi
# ===============================================
if pidof CrashCore >/dev/null; then
setproxy #设置临时代理,【$1】代表下载目录【$2】代表在线地址
url=$(printf '%s\n' "$2" |
sed -e 's#https://.*jsdelivr.net/gh/juewuy/ShellCrash[@|/]#https://raw.githubusercontent.com/juewuy/ShellCrash/#' \
-e 's#https://gh.jwsc.eu.org/#https://raw.githubusercontent.com/juewuy/ShellCrash/#')
else
url=$(printf '%s\n' "$2" |
sed 's#https://raw.githubusercontent.com/juewuy/ShellCrash/#https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@#')
fi
# ===============================================
#参数【$1】代表下载目录【$2】代表在线地址
#参数【$3】代表输出显示【$4】不启用重定向
#参数【$5】代表验证证书【$6】使用自定义UA
[ -n "$6" ] && agent="--user-agent $6"
if wget --help 2>&1 | grep -q 'show-progress' >/dev/null 2>&1; then
[ "$3" = "echooff" ] && progress='-q' || progress='-q --show-progress'
[ "$4" = "rediroff" ] && redirect='--max-redirect=0' || redirect=''
if [ "$5" = "skipceroff" ] || [ "$skip_cert" = OFF ];then
certificate=''
else
certificate='--no-check-certificate'
fi
wget -Y on $agent $progress $redirect $certificate --timeout=3 -O "$1" "$url" && return 0 #成功则退出否则重试
wget -Y off $agent $progress $redirect $certificate --timeout=5 -O "$1" "$2"
return $?
elif curl --version >/dev/null 2>&1; then
if [ "$3" = "echooff" ];then
progress='-s'
elif echo "$url" | grep -q 'jsdelivr.net';then
progress='-#'
. "$CRASHDIR"/libs/web_get_curlbar.sh && curl_fsize
else
progress='-#'
fi
[ "$4" = "rediroff" ] && redirect='' || redirect='-L'
if [ "$5" = "skipceroff" ] || [ "$skip_cert" = OFF ];then
certificate=''
else
certificate='-k'
fi
# curl 特殊版本兼容
auth_arg=""
if curl --version | grep -q '^curl 8.' && ckcmd base64; then
auth_b64=$(printf '%s' "$authentication" | base64)
[ -n "$auth_b64" ] && auth_arg="--proxy-header Proxy-Authorization:Basic $auth_b64"
fi
if [ -n "$fsize_raw" ] && [ "$fsize_raw" -gt 204800 ]; then
result=$(execute_curl "$1" "$url" "$fsize_raw" "$agent $auth_arg $redirect $certificate")
else
result=$(curl $agent $auth_arg -w '%{http_code}' --connect-timeout 3 $progress $redirect $certificate -o "$1" "$url")
fi
#参数【$1】代表下载目录【$2】代表在线地址
#参数【$3】代表输出显示【$4】不启用重定向
#参数【$5】代表验证证书【$6】使用自定义UA
[ -n "$6" ] && agent="--user-agent $6"
if wget --help 2>&1 | grep -q 'show-progress' >/dev/null 2>&1; then
[ "$3" = "echooff" ] && progress='-q' || progress='-q --show-progress'
[ "$4" = "rediroff" ] && redirect='--max-redirect=0' || redirect=''
if [ "$5" = "skipceroff" ] || [ "$skip_cert" = OFF ];then
certificate=''
else
certificate='--no-check-certificate'
fi
wget -Y on $agent $progress $redirect $certificate --timeout=3 -O "$1" "$url" && return 0 #成功则退出否则重试
wget -Y off $agent $progress $redirect $certificate --timeout=5 -O "$1" "$2"
return $?
elif curl --version >/dev/null 2>&1; then
if [ "$3" = "echooff" ];then
progress='-s'
elif echo "$url" | grep -q 'jsdelivr.net';then
progress='-#'
. "$CRASHDIR"/libs/web_get_curlbar.sh && curl_fsize
else
progress='-#'
fi
[ "$4" = "rediroff" ] && redirect='' || redirect='-L'
if [ "$5" = "skipceroff" ] || [ "$skip_cert" = OFF ];then
certificate=''
else
certificate='-k'
fi
# curl 特殊版本兼容
auth_arg=""
if curl --version | grep -q '^curl 8.' && ckcmd base64; then
auth_b64=$(printf '%s' "$authentication" | base64)
[ -n "$auth_b64" ] && auth_arg="--proxy-header Proxy-Authorization:Basic $auth_b64"
fi
if [ -n "$fsize_raw" ] && [ "$fsize_raw" -gt 204800 ]; then
result=$(execute_curl "$1" "$url" "$fsize_raw" "$agent $auth_arg $redirect $certificate")
else
result=$(curl $agent $auth_arg -w '%{http_code}' --connect-timeout 3 $progress $redirect $certificate -o "$1" "$url")
fi
[ "$result" = "200" ] && return 0 #成功则退出否则重试
export https_proxy=""
export http_proxy=""
if [ -n "$fsize_raw" ] && [ "$fsize_raw" -gt 204800 ]; then
result=$(execute_curl "$1" "$2" "$fsize_raw" "$agent $redirect $certificate")
else
result=$(curl $agent -w '%{http_code}' --connect-timeout 5 $progress $redirect $certificate -o "$1" "$2")
fi
[ "$result" = "200" ]
return $?
elif ckcmd wget;then
[ "$3" = "echooff" ] && progress='-q'
wget -Y on $progress -O "$1" "$url" && return 0 #成功则退出否则重试
wget -Y off $progress -O "$1" "$2"
return $?
else
echo "No Curl or Wget"
return 1
fi
[ "$result" = "200" ] && return 0 #成功则退出否则重试
export https_proxy=""
export http_proxy=""
if [ -n "$fsize_raw" ] && [ "$fsize_raw" -gt 204800 ]; then
result=$(execute_curl "$1" "$2" "$fsize_raw" "$agent $redirect $certificate")
else
result=$(curl $agent -w '%{http_code}' --connect-timeout 5 $progress $redirect $certificate -o "$1" "$2")
fi
[ "$result" = "200" ]
return $?
elif ckcmd wget;then
[ "$3" = "echooff" ] && progress='-q'
wget -Y on $progress -O "$1" "$url" && return 0 #成功则退出否则重试
wget -Y off $progress -O "$1" "$2"
return $?
else
echo "No Curl or Wget"
return 1
fi
}

View File

@@ -3,13 +3,13 @@
get_bin() { #专用于项目内部文件的下载
[ -z "$update_url" ] && update_url=https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master
if [ -n "$url_id" ]; then
[ -n "$release_type" ] && rt="$release_type" || rt=master
[ -n "$release_type" ] && rt="$release_type" || rt=master
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"

View File

@@ -2,46 +2,46 @@
bar_max=42 #进度条长度
curl_fsize(){ # 获取文件大小
fsize_raw=0
header=$(curl -sIL --connect-timeout 2 "$url")
# 代理容错
[ -z "$header" ] && { export https_proxy=""; export http_proxy=""; header=$(curl -sIL --connect-timeout 2 "$url"); }
# 提取大小 (优先 Content-Length其次 ETag)
fsize_raw=$(echo "$header" | grep -i 'Content-Length' | tail -n 1 | awk '{print $2}' | tr -d '\r' | awk '{print int($1)}')
if [ -z "$fsize_raw" ] || [ "$fsize_raw" -eq 0 ]; then
etag=$(echo "$header" | grep -i 'etag' | tail -n 1 | cut -d '"' -f2 | cut -d '-' -f1)
[ -n "$etag" ] && fsize_raw=$(printf "%d" 0x$etag 2>/dev/null)
fi
fsize_raw=0
header=$(curl -sIL --connect-timeout 2 "$url")
# 代理容错
[ -z "$header" ] && { export https_proxy=""; export http_proxy=""; header=$(curl -sIL --connect-timeout 2 "$url"); }
# 提取大小 (优先 Content-Length其次 ETag)
fsize_raw=$(echo "$header" | grep -i 'Content-Length' | tail -n 1 | awk '{print $2}' | tr -d '\r' | awk '{print int($1)}')
if [ -z "$fsize_raw" ] || [ "$fsize_raw" -eq 0 ]; then
etag=$(echo "$header" | grep -i 'etag' | tail -n 1 | cut -d '"' -f2 | cut -d '-' -f1)
[ -n "$etag" ] && fsize_raw=$(printf "%d" 0x$etag 2>/dev/null)
fi
}
execute_curl(){ # 手搓curl进度条
local path="$1" target_url="$2" total_size="$3" extra_args="$4"
rm -f /tmp/webget_res
# 后台静默下载,状态码写入临时文件
curl $extra_args -s -L -w '%{http_code}' "$target_url" -o "$path" > /tmp/webget_res &
local pid=$!
# 循环监控
while kill -0 $pid 2>/dev/null; do
if [ -f "$path" ]; then
local curr=$(wc -c < "$path")
local pct=$(awk -v c=$curr -v t=$total_size 'BEGIN {p=(c*100/t); if(p>100)p=100; printf "%.1f", p}')
local num=$(awk -v p=$pct -v w=$bar_max 'BEGIN {printf "%d", p*w/100}')
local bar=$(printf "%${num}s" | tr ' ' '#'); local spc_n=$((bar_max - num))
local spc=""; [ "$spc_n" -gt 0 ] && spc=$(printf "%${spc_n}s")
local size=$(( fsize_raw * 100 / 1048576 ))
local fs="$((size / 100)).$((size % 100)) MB"
printf "\r\033[2K%s%s %6s%%(%s)" "$bar" "$spc" "$pct" "$fs" >&2
fi
usleep 200000 2>/dev/null || sleep 1
done
local code=$(cat /tmp/webget_res 2>/dev/null)
if [ "$code" = "200" ] || [ "$code" = "206" ]; then
local full=$(printf "%${bar_max}s" | tr ' ' '#')
printf "\r\033[2K%s 100.0%%(%s)\n" "$full" "$fs" >&2
else
printf "\r\033[2K" >&2; [ -f "$path" ] && rm -f "$path"
fi
echo "$code"
local path="$1" target_url="$2" total_size="$3" extra_args="$4"
rm -f /tmp/webget_res
# 后台静默下载,状态码写入临时文件
curl $extra_args -s -L -w '%{http_code}' "$target_url" -o "$path" > /tmp/webget_res &
local pid=$!
# 循环监控
while kill -0 $pid 2>/dev/null; do
if [ -f "$path" ]; then
local curr=$(wc -c < "$path")
local pct=$(awk -v c=$curr -v t=$total_size 'BEGIN {p=(c*100/t); if(p>100)p=100; printf "%.1f", p}')
local num=$(awk -v p=$pct -v w=$bar_max 'BEGIN {printf "%d", p*w/100}')
local bar=$(printf "%${num}s" | tr ' ' '#'); local spc_n=$((bar_max - num))
local spc=""; [ "$spc_n" -gt 0 ] && spc=$(printf "%${spc_n}s")
local size=$(( fsize_raw * 100 / 1048576 ))
local fs="$((size / 100)).$((size % 100)) MB"
printf "\r\033[2K%s%s %6s%%(%s)" "$bar" "$spc" "$pct" "$fs" >&2
fi
usleep 200000 2>/dev/null || sleep 1
done
local code=$(cat /tmp/webget_res 2>/dev/null)
if [ "$code" = "200" ] || [ "$code" = "206" ]; then
local full=$(printf "%${bar_max}s" | tr ' ' '#')
printf "\r\033[2K%s 100.0%%(%s)\n" "$full" "$fs" >&2
else
printf "\r\033[2K" >&2; [ -f "$path" ] && rm -f "$path"
fi
echo "$code"
}

View File

@@ -1,10 +1,10 @@
. "$CRASHDIR"/libs/set_proxy.sh
#$1:目标地址 $2:禁用proxy
web_get_lite() {
[ -z "$2" ] && setproxy
if curl --version >/dev/null 2>&1; then
curl -ksSl --connect-timeout 3 "$1" 2>/dev/null
else
wget -Y on -q --timeout=3 -O - "$1"
fi
[ -z "$2" ] && setproxy
if curl --version >/dev/null 2>&1; then
curl -ksSl --connect-timeout 3 "$1" 2>/dev/null
else
wget -Y on -q --timeout=3 -O - "$1"
fi
}

View File

@@ -1,10 +1,10 @@
. "$CRASHDIR"/libs/set_proxy.sh
#$1:目标地址 $2:json字符串
web_json_post() {
setproxy
if curl --version >/dev/null 2>&1; then
curl -kfsSl -X POST --connect-timeout 3 -H "Content-Type: application/json" "$1" -d "$2" >/dev/null 2>&1
else
wget -Y on -q --timeout=3 --method=POST --header="Content-Type: application/json" --body-data="$2" "$1"
fi
setproxy
if curl --version >/dev/null 2>&1; then
curl -kfsSl -X POST --connect-timeout 3 -H "Content-Type: application/json" "$1" -d "$2" >/dev/null 2>&1
else
wget -Y on -q --timeout=3 --method=POST --header="Content-Type: application/json" --body-data="$2" "$1"
fi
}

View File

@@ -9,12 +9,12 @@ put_save() { #推送面板选择
fi
}
web_restore() { #还原面板选择
num=$(cat "$CRASHDIR"/configs/web_save | wc -l)
i=1
while [ "$i" -le "$num" ]; do
group_name=$(awk -F ',' 'NR=="'${i}'" {print $1}' "$CRASHDIR"/configs/web_save | sed 's/ /%20/g')
now_name=$(awk -F ',' 'NR=="'${i}'" {print $2}' "$CRASHDIR"/configs/web_save)
put_save "http://127.0.0.1:${db_port}/proxies/${group_name}" "{\"name\":\"${now_name}\"}"
i=$((i + 1))
done
num=$(cat "$CRASHDIR"/configs/web_save | wc -l)
i=1
while [ "$i" -le "$num" ]; do
group_name=$(awk -F ',' 'NR=="'${i}'" {print $1}' "$CRASHDIR"/configs/web_save | sed 's/ /%20/g')
now_name=$(awk -F ',' 'NR=="'${i}'" {print $2}' "$CRASHDIR"/configs/web_save)
put_save "http://127.0.0.1:${db_port}/proxies/${group_name}" "{\"name\":\"${now_name}\"}"
i=$((i + 1))
done
}

View File

@@ -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
}

View File

@@ -2,8 +2,8 @@
# Copyright (C) Juewuy
CRASHDIR=$(
cd $(dirname $0)
pwd
cd $(dirname $0)
pwd
)
CFG_PATH="$CRASHDIR"/configs/ShellCrash.cfg
@@ -32,326 +32,327 @@ load_lang common
load_lang menu
checkrestart() {
comp_box "\033[32m$MENU_RESTART_NOTICE\033[0m"
btm_box "1) 立即重启" \
"0) 暂不重启"
read -r -p "$COMMON_INPUT> " res
if [ "$res" = 1 ]; then
start_service
fi
comp_box "\033[32m$MENU_RESTART_NOTICE\033[0m"
btm_box "1) $MENU_RESTART_NOW" \
"0) $MENU_RESTART_LATER"
read -r -p "$COMMON_INPUT> " res
if [ "$res" = 1 ]; then
start_service
fi
}
# 检查端口冲突
checkport() {
. "$CRASHDIR"/menus/check_port.sh
. "$CRASHDIR"/menus/check_port.sh
while true; do
local conflict_found=0
local conflict_port=""
local conflict_info=""
while true; do
local conflict_found=0
local conflict_port=""
local conflict_info=""
conflict_info=$(check_port_with_info "$mix_port")
if [ $? -ne 0 ]; then
conflict_found=1
conflict_port="$mix_port"
fi
conflict_info=$(check_port_with_info "$mix_port")
if [ $? -ne 0 ]; then
conflict_found=1
conflict_port="$mix_port"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$redir_port")
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$redir_port"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$redir_port")
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$redir_port"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$((redir_port + 1))")
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$((redir_port + 1))"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$((redir_port + 1))")
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$((redir_port + 1))"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$dns_port")
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$dns_port"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$dns_port")
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$dns_port"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$db_port" tcp)
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$db_port"
fi
if [ "$conflict_found" -eq 0 ]; then
conflict_info=$(check_port_with_info "$db_port" tcp)
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$db_port"
fi
if [ "$conflict_found" -eq 1 ]; then
comp_box "$conflict_port】:$MENU_PORT_CONFLICT_TITLE" \
"\033[0m$conflict_info\033[0m" \
"\033[36m$MENU_PORT_CONFLICT_HINT\033[0m"
if [ "$conflict_found" -eq 1 ]; then
comp_box "$conflict_port】:$MENU_PORT_CONFLICT_TITLE" \
"\033[0m$conflict_info\033[0m" \
"\033[36m$MENU_PORT_CONFLICT_HINT\033[0m"
. "$CRASHDIR"/menus/2_settings.sh && set_adv_config
. "$CRASHDIR"/libs/get_config.sh
else
break
fi
done
. "$CRASHDIR"/menus/2_settings.sh && set_adv_config
. "$CRASHDIR"/libs/get_config.sh
else
break
fi
done
}
# 脚本启动前检查
ckstatus() {
versionsh=$(cat "$CRASHDIR"/version)
[ -n "$versionsh" ] && versionsh_l=$versionsh
[ -z "$redir_mod" ] && redir_mod="$MENU_PURE_MOD"
versionsh=$(cat "$CRASHDIR"/version)
[ -n "$versionsh" ] && versionsh_l=$versionsh
[ -z "$redir_mod" ] && redir_mod="$MENU_PURE_MOD"
# 获取本机host地址
[ -z "$host" ] && host=$(ubus call network.interface.lan status 2>&1 | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
[ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'lan' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1)
[ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1)
[ -z "$host" ] && host='$MENU_IP_DF'
# 获取本机host地址
[ -z "$host" ] && host=$(ubus call network.interface.lan status 2>&1 | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
[ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'lan' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1)
[ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1)
[ -z "$host" ] && host='$MENU_IP_DF'
# dashboard目录位置
if [ -f /www/clash/index.html ]; then
dbdir=/www/clash
hostdir=/clash
else
dbdir="$CRASHDIR"/ui
hostdir=":$db_port/ui"
fi
# dashboard目录位置
if [ -f /www/clash/index.html ]; then
dbdir=/www/clash
hostdir=/clash
else
dbdir="$CRASHDIR"/ui
hostdir=":$db_port/ui"
fi
if check_autostart; then
auto="\033[32m$MENU_AUTOSTART_ON\033[0m"
else
auto="\033[31m$MENU_AUTOSTART_OFF\033[0m"
fi
if check_autostart; then
auto="\033[32m$MENU_AUTOSTART_ON\033[0m"
else
auto="\033[31m$MENU_AUTOSTART_OFF\033[0m"
fi
PID=$(pidof CrashCore | awk '{print $NF}')
if [ -n "$PID" ]; then
run="\033[32m$MENU_RUN_ON$redir_mod$MENU_MOD\033[0m"
running_status
elif [ "$firewall_area" = 5 ] && [ -n "$(ip route list table 100)" ]; then
run="\033[32m$MENU_RUN_SET$redir_mod$MENU_MOD\033[0m"
else
run="\033[31m$MENU_RUN_OFF$redir_mod$MENU_MOD\033[0m"
# 检测系统端口占用
checkport
fi
corename=$(echo $crashcore | sed 's/singboxr/SingBoxR/' | sed 's/singbox/SingBox/' | sed 's/clash/Clash/' | sed 's/meta/Mihomo/')
# [ "$firewall_area" = 5 ] && corename='转发'
[ -f "$TMPDIR"/debug.log -o -f "$CRASHDIR"/debug.log -a -n "$PID" ] && auto="\033[33m$MENU_AUTOSTART_DEBUG\033[0m"
PID=$(pidof CrashCore | awk '{print $NF}')
if [ -n "$PID" ]; then
run="\033[32m$MENU_RUN_ON$redir_mod$MENU_MOD\033[0m"
running_status
elif [ "$firewall_area" = 5 ] && [ -n "$(ip route list table 100)" ]; then
run="\033[32m$MENU_RUN_SET$redir_mod$MENU_MOD\033[0m"
else
run="\033[31m$MENU_RUN_OFF$redir_mod$MENU_MOD\033[0m"
# 检测系统端口占用
checkport
fi
corename=$(echo $crashcore | sed 's/singboxr/SingBoxR/' | sed 's/singbox/SingBox/' | sed 's/clash/Clash/' | sed 's/meta/Mihomo/')
# [ "$firewall_area" = 5 ] && corename='转发'
[ -f "$TMPDIR"/debug.log -o -f "$CRASHDIR"/debug.log -a -n "$PID" ] && auto="\033[33m$MENU_AUTOSTART_DEBUG\033[0m"
# 检查新手引导
if [ -z "$userguide" ]; then
userguide=1
. "$CRASHDIR"/menus/userguide.sh && userguide
setconfig userguide 1
. "$CRASHDIR"/configs/ShellCrash.cfg
fi
# 检查新手引导
if [ -z "$userguide" ]; then
userguide=1
. "$CRASHDIR"/menus/userguide.sh && userguide
setconfig userguide 1
. "$CRASHDIR"/configs/ShellCrash.cfg
fi
# 检查执行权限
[ ! -x "$CRASHDIR"/start.sh ] && chmod +x "$CRASHDIR"/start.sh
# 检查执行权限
[ ! -x "$CRASHDIR"/start.sh ] && chmod +x "$CRASHDIR"/start.sh
# 检查/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" \
"$MENU_TMP_CORE_ASK"
btm_box "1) 立即加载" \
"0) 暂不加载"
read -r -p "$COMMON_INPUT> " res
[ "$res" = 1 ] && {
zip_type=$(echo "$file" | grep -oE 'tar.gz$|upx$|gz$')
. "$CRASHDIR"/menus/9_upgrade.sh && setcoretype
. "$CRASHDIR"/libs/core_tools.sh && core_check "/tmp/$file"
if [ "$?" = 0 ]; then
msg_alert "\033[32m$MENU_CORE_LOADED_OK\033[0m"
switch_core
else
rm -rf /tmp/"$file"
msg_alert "\033[33m$MENU_CORE_LOADED_BAD\033[0m" \
"\033[33m$MENU_CORE_REMOVED\033[0m"
fi
}
done
# 检查/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
local tmp_file="/tmp/$file"
comp_box "$MENU_TMP_CORE_FOUND \033[36m$tmp_file\033[0m" \
"$MENU_TMP_CORE_ASK"
btm_box "1) $MENU_LOAD_NOW" \
"0) $MENU_LOAD_LATER"
read -r -p "$COMMON_INPUT> " res
[ "$res" = 1 ] && {
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"
if [ "$?" = 0 ] && [ -n "$crashcore" ]; then
msg_alert "\033[32m$MENU_CORE_LOADED_OK\033[0m"
switch_core
else
rm -rf "$tmp_file"
msg_alert "\033[33m$MENU_CORE_LOADED_BAD\033[0m" \
"\033[33m$MENU_CORE_REMOVED\033[0m"
fi
}
done
# 检查/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" \
"$MENU_TMP_CFG_ASK"
btm_box "1) 立即加载" \
"0) 暂不加载"
read -p "$COMMON_INPUT> " res
[ "$res" = 1 ] && {
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
fi
msg_alert "\033[32m$MENU_CFG_LOADED_OK\033[0m "
}
done
# 检查/tmp配置文件
for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -iE 'config.yaml$|config.yml$|config.json$'); do
local tmp_file="/tmp/$file"
comp_box "$MENU_TMP_CFG_FOUND\033[36m$tmp_file\033[0m" \
"$MENU_TMP_CFG_ASK"
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
else
mv -f "$tmp_file" "$CRASHDIR"/yamls/config.yaml
fi
msg_alert "\033[32m$MENU_CFG_LOADED_OK\033[0m "
}
done
# 检查禁用配置覆写
[ "$disoverride" = "1" ] && {
comp_box "\033[33m$MENU_OVERRIDE_WARN\033[0m" \
"$MENU_OVERRIDE_ASK"
btm_box "1) " \
"0) 否"
read -p "$COMMON_INPUT> " res
[ "$res" = 1 ] && unset disoverride && setconfig disoverride
}
# 检查禁用配置覆写
[ "$disoverride" = "1" ] && {
comp_box "\033[33m$MENU_OVERRIDE_WARN\033[0m" \
"$MENU_OVERRIDE_ASK"
btm_box "1) $MENU_YES" \
"0) $MENU_NO"
read -p "$COMMON_INPUT> " res
[ "$res" = 1 ] && unset disoverride && setconfig disoverride
}
top_box "\033[30;43m$MENU_WELCOME\033[0m\t\t Ver: $versionsh_l" \
"$MENU_TG_CHANNEL\033[36;4mhttps://t.me/ShellClash\033[0m"
separator_line "-"
content_line "$corename$run\t $auto"
if [ -n "$PID" ]; then
content_line "$MENU_MEM_USED\033[44m$VmRSS\033[0m\t $MENU_RUNNING_TIME\033[46;30m$day\033[44;37m$time\033[0m"
fi
separator_line "="
top_box "\033[30;43m$MENU_WELCOME\033[0m\t\t Ver: $versionsh_l" \
"$MENU_TG_CHANNEL\033[36;4mhttps://t.me/ShellClash\033[0m"
separator_line "-"
content_line "$corename$run\t $auto"
if [ -n "$PID" ]; then
content_line "$MENU_MEM_USED\033[44m$VmRSS\033[0m\t $MENU_RUNNING_TIME\033[46;30m$day\033[44;37m$time\033[0m"
fi
separator_line "="
}
main_menu() {
while true; do
ckstatus
while true; do
ckstatus
btm_box "1) \033[32m$MENU_MAIN_1\033[0m" \
"2) \033[36m$MENU_MAIN_2\033[0m" \
"3) \033[31m$MENU_MAIN_3\033[0m" \
"4) \033[33m$MENU_MAIN_4\033[0m" \
"5) \033[32m$MENU_MAIN_5\033[0m" \
"6) \033[36m$MENU_MAIN_6\033[0m" \
"7) \033[33m$MENU_MAIN_7\033[0m" \
"8) $MENU_MAIN_8" \
"9) \033[32m$MENU_MAIN_9\033[0m" \
"" \
"0) $MENU_MAIN_0"
read -r -p "$MENU_MAIN_PROMPT" num
btm_box "1) \033[32m$MENU_MAIN_1\033[0m" \
"2) \033[36m$MENU_MAIN_2\033[0m" \
"3) \033[31m$MENU_MAIN_3\033[0m" \
"4) \033[33m$MENU_MAIN_4\033[0m" \
"5) \033[32m$MENU_MAIN_5\033[0m" \
"6) \033[36m$MENU_MAIN_6\033[0m" \
"7) \033[33m$MENU_MAIN_7\033[0m" \
"8) $MENU_MAIN_8" \
"9) \033[32m$MENU_MAIN_9\033[0m" \
"" \
"0) $MENU_MAIN_0"
read -r -p "$MENU_MAIN_PROMPT" num
case "$num" in
"" | 0)
line_break
exit 0
;;
1)
start_service
line_break
exit
;;
2)
checkcfg=$(cat "$CFG_PATH")
. "$CRASHDIR"/menus/2_settings.sh && settings
if [ -n "$PID" ]; then
checkcfg_new=$(cat "$CFG_PATH")
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi
;;
3)
[ "$bot_tg_service" = ON ] && . "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_stop
"$CRASHDIR"/start.sh stop
sleep 1
msg_alert "\033[31m$corename$MENU_SERVICE_STOPPED\033[0m"
;;
4)
. "$CRASHDIR"/menus/4_setboot.sh && setboot
;;
5)
. "$CRASHDIR"/menus/5_task.sh && task_menu
;;
6)
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
;;
7)
GT_CFG_PATH="$CRASHDIR"/configs/gateway.cfg
touch "$GT_CFG_PATH"
checkcfg=$(cat "$CFG_PATH" "$GT_CFG_PATH")
. "$CRASHDIR"/menus/7_gateway.sh && gateway
if [ -n "$PID" ]; then
checkcfg_new=$(cat "$CFG_PATH" "$GT_CFG_PATH")
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi
;;
8)
. "$CRASHDIR"/menus/8_tools.sh && tools
;;
9)
checkcfg=$(cat "$CFG_PATH")
. "$CRASHDIR"/menus/9_upgrade.sh && upgrade
if [ -n "$PID" ]; then
checkcfg_new=$(cat "$CFG_PATH")
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi
;;
*)
errornum
;;
esac
done
case "$num" in
"" | 0)
line_break
exit 0
;;
1)
start_service
line_break
exit
;;
2)
checkcfg=$(cat "$CFG_PATH")
. "$CRASHDIR"/menus/2_settings.sh && settings
if [ -n "$PID" ]; then
checkcfg_new=$(cat "$CFG_PATH")
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi
;;
3)
[ "$bot_tg_service" = ON ] && . "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_stop
"$CRASHDIR"/start.sh stop
sleep 1
msg_alert "\033[31m$corename$MENU_SERVICE_STOPPED\033[0m"
;;
4)
. "$CRASHDIR"/menus/4_setboot.sh && setboot
;;
5)
. "$CRASHDIR"/menus/5_task.sh && task_menu
;;
6)
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
;;
7)
GT_CFG_PATH="$CRASHDIR"/configs/gateway.cfg
touch "$GT_CFG_PATH"
checkcfg=$(cat "$CFG_PATH" "$GT_CFG_PATH")
. "$CRASHDIR"/menus/7_gateway.sh && gateway
if [ -n "$PID" ]; then
checkcfg_new=$(cat "$CFG_PATH" "$GT_CFG_PATH")
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi
;;
8)
. "$CRASHDIR"/menus/8_tools.sh && tools
;;
9)
checkcfg=$(cat "$CFG_PATH")
. "$CRASHDIR"/menus/9_upgrade.sh && upgrade
if [ -n "$PID" ]; then
checkcfg_new=$(cat "$CFG_PATH")
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi
;;
*)
errornum
;;
esac
done
}
case "$1" in
"")
main_menu
;;
main_menu
;;
-l)
main_menu
;;
main_menu
;;
-t)
shtype=sh
[ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash
"$shtype" -x "$CRASHDIR"/menu.sh -l
;;
shtype=sh
[ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash
"$shtype" -x "$CRASHDIR"/menu.sh -l
;;
-s)
"$CRASHDIR"/start.sh "$2" "$3" "$4" "$5" "$6"
;;
"$CRASHDIR"/start.sh "$2" "$3" "$4" "$5" "$6"
;;
-i)
. "$CRASHDIR"/init.sh 2>/dev/null
;;
. "$CRASHDIR"/init.sh 2>/dev/null
;;
-st)
shtype=sh
ckcmd bash && shtype=bash
"$shtype" -x "$CRASHDIR"/starts/bfstart.sh
. "$CRASHDIR"/starts/start_legacy.sh
start_legacy "$COMMAND" 'shellcrash'
"$shtype" -x "$CRASHDIR"/starts/afstart.sh
"$CRASHDIR"/start.sh stop
;;
shtype=sh
ckcmd bash && shtype=bash
"$shtype" -x "$CRASHDIR"/starts/bfstart.sh
. "$CRASHDIR"/starts/start_legacy.sh
start_legacy "$COMMAND" 'shellcrash'
"$shtype" -x "$CRASHDIR"/starts/afstart.sh
"$CRASHDIR"/start.sh stop
;;
-d)
shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash
comp_box "$MENU_TEST_RUNNING_1" \
"$MENU_TEST_RUNNING_2\033[36;4mhttps://t.me/ShellClash\033[0m"
"$shtype" "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh_bug.log
"$shtype" -x "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh.log
cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug
if [ -s "$TMPDIR"/sh_bug ]; then
line_break
echo "==========================================================="
while read line; do
echo -e "$MENU_ERROR_FOUND\033[33;4m$line\033[0m"
grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log
echo
done <"$TMPDIR"/sh_bug
echo "==========================================================="
rm -rf "$TMPDIR"/sh_bug
comp_box "\033[32m$MENU_TEST_DONE_FAIL\033[0m" \
"$MENU_TEST_LOG_HINT\033[36m$TMPDIR/debug_sh.log\033[0m"
else
rm -rf "$TMPDIR"/debug_sh.log
comp_box "\033[32m$MENU_TEST_DONE_OK\033[0m"
line_break
fi
"$CRASHDIR"/start.sh stop
;;
shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash
comp_box "$MENU_TEST_RUNNING_1" \
"$MENU_TEST_RUNNING_2\033[36;4mhttps://t.me/ShellClash\033[0m"
"$shtype" "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh_bug.log
"$shtype" -x "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh.log
cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug
if [ -s "$TMPDIR"/sh_bug ]; then
line_break
echo "==========================================================="
while read line; do
echo -e "$MENU_ERROR_FOUND\033[33;4m$line\033[0m"
grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log
echo
done <"$TMPDIR"/sh_bug
echo "==========================================================="
rm -rf "$TMPDIR"/sh_bug
comp_box "\033[32m$MENU_TEST_DONE_FAIL\033[0m" \
"$MENU_TEST_LOG_HINT\033[36m$TMPDIR/debug_sh.log\033[0m"
else
rm -rf "$TMPDIR"/debug_sh.log
comp_box "\033[32m$MENU_TEST_DONE_OK\033[0m"
line_break
fi
"$CRASHDIR"/start.sh stop
;;
-u)
. "$CRASHDIR"/menus/uninstall.sh && uninstall
;;
. "$CRASHDIR"/menus/uninstall.sh && uninstall
;;
*)
comp_box "$MENU_WELCOME"
content_line "-t $MENU_CLI_TEST"
content_line "-h $MENU_CLI_HELP"
content_line "-u $MENU_CLI_UNINSTALL"
content_line "-i $MENU_CLI_INIT"
content_line "-d $MENU_CLI_DEBUG"
separator_line "-"
content_line "crash -s start $MENU_CLI_START"
content_line "crash -s stop $MENU_CLI_STOP"
content_line "$CRASHDIR/start.sh init $MENU_CLI_BOOT_INIT"
separator_line "-"
content_line "$MENU_HELP_ONLINE\033[36mhttps://t.me/ShellClash\033[0m"
content_line "$MENU_HELP_BLOG\033[36mhttps://juewuy.github.io\033[0m"
content_line "$MENU_HELP_GITHUB\033[36mhttps://github.com/juewuy/ShellCrash\033[0m"
separator_line "="
line_break
;;
comp_box "$MENU_WELCOME"
content_line "-t $MENU_CLI_TEST"
content_line "-h $MENU_CLI_HELP"
content_line "-u $MENU_CLI_UNINSTALL"
content_line "-i $MENU_CLI_INIT"
content_line "-d $MENU_CLI_DEBUG"
separator_line "-"
content_line "crash -s start $MENU_CLI_START"
content_line "crash -s stop $MENU_CLI_STOP"
content_line "$CRASHDIR/start.sh init $MENU_CLI_BOOT_INIT"
separator_line "-"
content_line "$MENU_HELP_ONLINE\033[36mhttps://t.me/ShellClash\033[0m"
content_line "$MENU_HELP_BLOG\033[36mhttps://juewuy.github.io\033[0m"
content_line "$MENU_HELP_GITHUB\033[36mhttps://github.com/juewuy/ShellCrash\033[0m"
separator_line "="
line_break
;;
esac

File diff suppressed because it is too large Load Diff

View File

@@ -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.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" \

View File

@@ -22,7 +22,7 @@ set_core_config() {
LC_ALL=C awk '{
f1 = $1
f2 = $2
gsub(/\360[\200-\277][\200-\277][\200-\277]/,"",f1)
gsub(/\360[\200-\277][\200-\277][\200-\277]/,"",f1)
if (length(f1) > 12)
f1 = substr(f1, 1, 8) ".."
if (length(f2) > 30)
@@ -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"

File diff suppressed because it is too large Load Diff

View File

@@ -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
@@ -755,14 +756,13 @@ debug() {
main_menu
;;
9)
. "$CRASHDIR"/libs/core_webget.sh && core_find && "$TMPDIR"/CrashCore merge "$TMPDIR"/debug.json -C "$TMPDIR"/jsons && line_break
. "$CRASHDIR"/libs/core_tools.sh && core_find && "$TMPDIR"/CrashCore merge "$TMPDIR"/debug.json -C "$TMPDIR"/jsons && line_break
comp_box "\033[32m$TOOLS_MERGE_OK\033[0m"
[ "$TMPDIR" = "$BINDIR" ] && rm -rf "$TMPDIR"/CrashCore
main_menu
debug
;;
*)
errornum
;;
esac
}

View File

@@ -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 #镜像化设备特殊处理
@@ -1111,19 +1118,20 @@ saveserver() {
setserver() {
while true; do
line_break
LISTFILE="$CRASHDIR"/configs/servers_"$i18n".list
[ -z "$release_type" ] && release_name=$UPG_SOURCE_UNSET
[ -n "$release_type" ] && release_name="$release_type$UPG_SOURCE_ROLLBACK_TAG"
[ "$release_type" = stable ] && release_name=$UPG_SOURCE_STABLE_TEXT
[ "$release_type" = master ] && release_name=$UPG_SOURCE_MASTER_TEXT
[ "$release_type" = dev ] && release_name=$UPG_SOURCE_DEV_TEXT
[ -n "$url_id" ] && url_name=$(grep "$url_id" "$CRASHDIR"/configs/servers.list 2>/dev/null | awk '{print $2}') || url_name="$update_url"
[ -n "$url_id" ] && url_name=$(grep "$url_id" "$LISTFILE" 2>/dev/null | awk '{print $2}') || url_name="$update_url"
comp_box "\033[30;47m$UPG_SOURCE_TITLE\033[0m" \
"" \
"$UPG_SOURCE_CUR_VER\033[4;33m$release_name\033[0m" \
"$UPG_SOURCE_CUR_URL\n\033[4;32m$url_name\033[0m"
grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list |
grep -E "^1|^2" "$LISTFILE" |
awk '{print NR") "$2}' |
while IFS= read -r line; do
content_line "$line"
@@ -1145,12 +1153,12 @@ setserver() {
break
;;
[1-99])
url_id_new=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n "$num"p | awk '{print $1}')
url_id_new=$(grep -E "^1|$release_name" "$LISTFILE" | sed -n "$num"p | awk '{print $1}')
if [ -z "$url_id_new" ]; then
errornum
continue
elif [ "$url_id_new" -ge 200 ]; then
update_url=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n "$num"p | awk '{print $3}')
update_url=$(grep -E "^1|$release_name" "$LISTFILE" | sed -n "$num"p | awk '{print $3}')
url_id=''
saveserver
break
@@ -1257,7 +1265,3 @@ setserver() {
esac
done
}

View File

@@ -19,19 +19,19 @@ OFFSET=0
### --- 基础函数 --- ###
web_download(){
setproxy
if curl --version >/dev/null 2>&1; then
curl -kfsSl "$1" -o "$2"
else
wget -Y on -q --timeout=3 -O "$2" "$1"
fi
setproxy
if curl --version >/dev/null 2>&1; then
curl -kfsSl "$1" -o "$2"
else
wget -Y on -q --timeout=3 -O "$2" "$1"
fi
}
web_upload(){
curl -ksSfl -X POST --connect-timeout 20 "$API/sendDocument" -F "chat_id=$TG_CHATID" -F "document=@$1" >/dev/null
curl -ksSfl -X POST --connect-timeout 20 "$API/sendDocument" -F "chat_id=$TG_CHATID" -F "document=@$1" >/dev/null
}
send_msg(){
TEXT="$1"
web_json_post "$API/sendMessage" "{\"chat_id\":\"$TG_CHATID\",\"text\":\"$TEXT\",\"parse_mode\":\"Markdown\"}"
web_json_post "$API/sendMessage" "{\"chat_id\":\"$TG_CHATID\",\"text\":\"$TEXT\",\"parse_mode\":\"Markdown\"}"
}
send_help(){
TEXT=$(cat <<EOF
@@ -48,18 +48,18 @@ https://dler.pro/auth/register?affid=89698
https://pub.bigmeok.me?code=2PuWY9I7
EOF
)
send_msg "$TEXT"
send_msg "$TEXT"
}
send_menu(){
#获取运行状态
PID=$(pidof CrashCore | awk '{print $NF}')
if [ -n "$PID" ]; then
run="$BOT_TG_RUN_ON"
running_status
else
run="$BOT_TG_RUN_OFF"
fi
corename=$(echo $crashcore | sed 's/singboxr/SingBoxR/' | sed 's/singbox/SingBox/' | sed 's/clash/Clash/' | sed 's/meta/Mihomo/')
#获取运行状态
PID=$(pidof CrashCore | awk '{print $NF}')
if [ -n "$PID" ]; then
run="$BOT_TG_RUN_ON"
running_status
else
run="$BOT_TG_RUN_OFF"
fi
corename=$(echo $crashcore | sed 's/singboxr/SingBoxR/' | sed 's/singbox/SingBox/' | sed 's/clash/Clash/' | sed 's/meta/Mihomo/')
TEXT=$(cat <<EOF
*$BOT_TG_WELCOME*_${versionsh_l}_
$corename$BOT_TG_SERVICE$run
@@ -78,7 +78,7 @@ EOF
],
[
{"text":"$BOT_TG_BTN_LOG","callback_data":"readlog"},
{"text":"$BOT_TG_BTN_TRANSFER","callback_data":"transport"}
{"text":"$BOT_TG_BTN_TRANSFER","callback_data":"transport"}
]
]
}
@@ -89,31 +89,31 @@ web_json_post "$API/sendMessage" "{\"chat_id\":\"$TG_CHATID\",\"text\":\"$TEXT\"
### --- 文件传输 --- ###
send_transport_menu(){
TEXT="$BOT_TG_SELECT_FILE"
if echo "$crashcore" | grep -q 'singbox';then
config_type=json
else
config_type=yaml
fi
if echo "$crashcore" | grep -q 'singbox';then
config_type=json
else
config_type=yaml
fi
if curl -h >/dev/null 2>&1;then
CURL_KB=$(cat <<EOF
[
if curl -h >/dev/null 2>&1;then
CURL_KB=$(cat <<EOF
[
{"text":"$BOT_TG_BTN_GET_LOG","callback_data":"ts_get_log"},
{"text":"$BOT_TG_BTN_GET_BAK","callback_data":"ts_get_bak"},
{"text":"$BOT_TG_BTN_GET_CFG","callback_data":"ts_get_ccf"}
],
EOF
)
else
CURL_KB='[{"text":"$BOT_TG_NO_CURL","callback_data":"noop"}],'
fi
else
CURL_KB='[{"text":"$BOT_TG_NO_CURL","callback_data":"noop"}],'
fi
MENU=$(cat <<EOF
{
"inline_keyboard":[
$CURL_KB
$CURL_KB
[
{"text":"$BOT_TG_BTN_UP_CORE","callback_data":"ts_up_core"},
{"text":"$BOT_TG_BTN_UP_BAK","callback_data":"ts_up_bak"},
{"text":"$BOT_TG_BTN_UP_BAK","callback_data":"ts_up_bak"},
{"text":"$BOT_TG_BTN_UP_CFG","callback_data":"ts_up_ccf"}
]
]
@@ -125,54 +125,54 @@ web_json_post "$API/sendMessage" "{\"chat_id\":\"$TG_CHATID\",\"text\":\"$TEXT\"
}
process_file(){
case "$FILE_TYPE" in
1)
. "$CRASHDIR"/libs/core_tools.sh
core_check "$TMPDIR/$FILE_NAME" && res="$BOT_TG_UPLOAD_OK" || res="$BOT_TG_UPLOAD_FAIL"
send_msg "$BOT_TG_CORE_UPDATE$res"
sleep 2
"$CRASHDIR"/start.sh start
;;
2)
tar -zxf "$TMPDIR/$FILE_NAME" -C "$CRASHDIR"/configs && res="$BOT_TG_CFG_RESTORED" || res="$BOT_TG_RESTORE_FAIL"
send_msg "$res"
;;
3)
mv -f "$TMPDIR/$FILE_NAME" "$CRASHDIR/${config_type}s/" && res="$BOT_TG_CFG_UPLOADED" || res="$BOT_TG_UPLOAD_FAIL2"
send_msg "$res"
;;
esac
rm -f "$TMPDIR/$FILE_NAME"
send_menu
case "$FILE_TYPE" in
1)
. "$CRASHDIR"/libs/core_tools.sh
core_check "$TMPDIR/$FILE_NAME" && res="$BOT_TG_UPLOAD_OK" || res="$BOT_TG_UPLOAD_FAIL"
send_msg "$BOT_TG_CORE_UPDATE$res"
sleep 2
"$CRASHDIR"/start.sh start
;;
2)
tar -zxf "$TMPDIR/$FILE_NAME" -C "$CRASHDIR"/configs && res="$BOT_TG_CFG_RESTORED" || res="$BOT_TG_RESTORE_FAIL"
send_msg "$res"
;;
3)
mv -f "$TMPDIR/$FILE_NAME" "$CRASHDIR/${config_type}s/" && res="$BOT_TG_CFG_UPLOADED" || res="$BOT_TG_UPLOAD_FAIL2"
send_msg "$res"
;;
esac
rm -f "$TMPDIR/$FILE_NAME"
send_menu
}
download_file(){
FILE_NAME=$(echo "$UPDATES" | sed 's/"callback_query".*//g' | grep -o '"file_name":"[^"]*"' | head -n1 | sed 's/.*:"//;s/"$//' | grep -E '\.(gz|upx|json|yaml)$')
if [ -n "$FILE_NAME" ];then
FILE_PATH=$(web_get_lite "$API/getFile?file_id=$FILE_ID" | grep -o '"file_path":"[^"]*"' | sed 's/.*:"//;s/"$//')
API_FILE="https://api.telegram.org/file/bot$TG_TOKEN"
web_download "$API_FILE/$FILE_PATH" "$TMPDIR/$FILE_NAME"
if [ "$?" = 0 ];then
process_file
else
send_msg "$BOT_TG_NET_UPLOAD_FAIL"
fi
else
send_msg "$BOT_TG_FILE_FORMAT_FAIL"
fi
FILE_NAME=$(echo "$UPDATES" | sed 's/"callback_query".*//g' | grep -o '"file_name":"[^"]*"' | head -n1 | sed 's/.*:"//;s/"$//' | grep -E '\.(gz|upx|json|yaml)$')
if [ -n "$FILE_NAME" ];then
FILE_PATH=$(web_get_lite "$API/getFile?file_id=$FILE_ID" | grep -o '"file_path":"[^"]*"' | sed 's/.*:"//;s/"$//')
API_FILE="https://api.telegram.org/file/bot$TG_TOKEN"
web_download "$API_FILE/$FILE_PATH" "$TMPDIR/$FILE_NAME"
if [ "$?" = 0 ];then
process_file
else
send_msg "$BOT_TG_NET_UPLOAD_FAIL"
fi
else
send_msg "$BOT_TG_FILE_FORMAT_FAIL"
fi
}
### --- 具体操作函数 --- ###
do_start_fw(){
[ -z "$redir_mod_bf" ] && redir_mod_bf='Redir'
redir_mod=$redir_mod_bf
setconfig redir_mod $redir_mod
"$CRASHDIR"/start.sh start_firewall
[ -z "$redir_mod_bf" ] && redir_mod_bf='Redir'
redir_mod=$redir_mod_bf
setconfig redir_mod $redir_mod
"$CRASHDIR"/start.sh start_firewall
echo "$BOT_TG_FW_ENABLED*$redir_mod_bf*$BOT_TG_FW_ENABLED_SUFFIX" > "$LOGFILE"
}
do_stop_fw(){
redir_mod_bf=$redir_mod
firewall_area=4
setconfig firewall_area 4
"$CRASHDIR"/start.sh stop_firewall
redir_mod_bf=$redir_mod
firewall_area=4
setconfig firewall_area 4
"$CRASHDIR"/start.sh stop_firewall
echo "$BOT_TG_SWITCH_PURE" > "$LOGFILE"
}
do_restart(){
@@ -185,142 +185,142 @@ do_set_sub(){
}
transport(){ #文件传输
case "$CALLBACK" in
"ts_get_log")
web_upload "$TMPDIR"/ShellCrash.log
send_menu
;;
"ts_get_bak")
now=$(date +%Y%m%d_%H%M%S)
FILE="$TMPDIR/configs_$now.tar.gz"
tar -zcf "$FILE" -C "$CRASHDIR/configs/" .
web_upload "$FILE"
rm -rf "$FILE"
send_menu
;;
"ts_get_ccf")
FILE="$TMPDIR/$config_type.tar.gz"
tar -zcf "$FILE" -C "$CRASHDIR/${config_type}s/" .
web_upload "$FILE"
rm -rf "$FILE"
send_menu
;;
"ts_up_core")
FILE_TYPE=1
send_msg "$BOT_TG_SEND_CORE ${corename} $BOT_TG_SEND_CORE_SUFFIX"
;;
"ts_up_bak")
FILE_TYPE=2
send_msg "$BOT_TG_SEND_BAK"
;;
"ts_up_ccf")
FILE_TYPE=3
send_msg "$BOT_TG_SEND_CFG .${config_type} $BOT_TG_SEND_CFG_SUFFIX"
;;
esac
case "$CALLBACK" in
"ts_get_log")
web_upload "$TMPDIR"/ShellCrash.log
send_menu
;;
"ts_get_bak")
now=$(date +%Y%m%d_%H%M%S)
FILE="$TMPDIR/configs_$now.tar.gz"
tar -zcf "$FILE" -C "$CRASHDIR/configs/" .
web_upload "$FILE"
rm -rf "$FILE"
send_menu
;;
"ts_get_ccf")
FILE="$TMPDIR/$config_type.tar.gz"
tar -zcf "$FILE" -C "$CRASHDIR/${config_type}s/" .
web_upload "$FILE"
rm -rf "$FILE"
send_menu
;;
"ts_up_core")
FILE_TYPE=1
send_msg "$BOT_TG_SEND_CORE ${corename} $BOT_TG_SEND_CORE_SUFFIX"
;;
"ts_up_bak")
FILE_TYPE=2
send_msg "$BOT_TG_SEND_BAK"
;;
"ts_up_ccf")
FILE_TYPE=3
send_msg "$BOT_TG_SEND_CFG .${config_type} $BOT_TG_SEND_CFG_SUFFIX"
;;
esac
}
### --- 轮询主进程 --- ###
polling(){
while true; do
UPDATES=$(web_get_lite "$API/getUpdates?timeout=25&offset=$OFFSET")
while true; do
UPDATES=$(web_get_lite "$API/getUpdates?timeout=25&offset=$OFFSET")
echo "$UPDATES" | grep -q '"update_id"' || {
sleep 10 #防止网络不佳时疯狂请求
continue
}
OFFSET=$(echo "$UPDATES" | grep -o '"update_id":[0-9]*' | tail -n1 | cut -d: -f2)
OFFSET=$((OFFSET + 1))
### --- 校验ChatID --- ###
CHATID=$(echo "$UPDATES" | grep -o '"id":[0-9]*' | tail -n1 | cut -d: -f2)
[ "$CHATID" != "$TG_CHATID" ] && continue
### --- 处理按钮事件 --- ###
CALLBACK=$(echo "$UPDATES" | grep -o '"data":"[^"]*"' | head -n1 | sed 's/.*:"//;s/"$//')
FILE_ID=$(echo "$UPDATES" | sed 's/"callback_query".*//g' | grep -o '"file_id":"[^"]*"' | head -n1 | sed 's/.*:"//;s/"$//')
[ -n "$FILE_ID" ] && {
download_file
continue
}
[ -n "$CALLBACK" ] && case "$CALLBACK" in
"start_redir")
if [ "$firewall_area" = 4 ];then
do_start_fw
send_msg "$BOT_TG_SWITCH_TO$redir_mod_bf"
else
send_msg "$BOT_TG_ALREADY$redir_mod"
fi
send_menu
continue
;;
"stop_redir")
if [ "$firewall_area" != 4 ];then
do_stop_fw
send_msg "$BOT_TG_SWITCH_PURE"
else
send_msg "$BOT_TG_ALREADY_PURE"
fi
send_menu
continue
;;
"restart")
do_restart
send_msg "$BOT_TG_SERVICE_RESTARTED_SHORT"
sleep 10
send_menu
continue
;;
"readlog")
send_msg "$BOT_TG_LOG_CONTENT\n\`\`\`$(grep -v "$BOT_TG_TASK_WORD" $TMPDIR/ShellCrash.log |tail -n 20)\`\`\`"
sleep 3
send_menu
continue
;;
"transport")
send_transport_menu
continue
;;
"set_sub")
echo "await_sub" > "$STATE_FILE"
send_msg "$BOT_TG_INPUT_SUB"
continue
;;
ts_*)
transport
continue
;;
esac
echo "$UPDATES" | grep -q '"update_id"' || {
sleep 10 #防止网络不佳时疯狂请求
continue
}
OFFSET=$(echo "$UPDATES" | grep -o '"update_id":[0-9]*' | tail -n1 | cut -d: -f2)
OFFSET=$((OFFSET + 1))
### --- 校验ChatID --- ###
CHATID=$(echo "$UPDATES" | grep -o '"id":[0-9]*' | tail -n1 | cut -d: -f2)
[ "$CHATID" != "$TG_CHATID" ] && continue
### --- 处理按钮事件 --- ###
CALLBACK=$(echo "$UPDATES" | grep -o '"data":"[^"]*"' | head -n1 | sed 's/.*:"//;s/"$//')
FILE_ID=$(echo "$UPDATES" | sed 's/"callback_query".*//g' | grep -o '"file_id":"[^"]*"' | head -n1 | sed 's/.*:"//;s/"$//')
[ -n "$FILE_ID" ] && {
download_file
continue
}
[ -n "$CALLBACK" ] && case "$CALLBACK" in
"start_redir")
if [ "$firewall_area" = 4 ];then
do_start_fw
send_msg "$BOT_TG_SWITCH_TO$redir_mod_bf"
else
send_msg "$BOT_TG_ALREADY$redir_mod"
fi
send_menu
continue
;;
"stop_redir")
if [ "$firewall_area" != 4 ];then
do_stop_fw
send_msg "$BOT_TG_SWITCH_PURE"
else
send_msg "$BOT_TG_ALREADY_PURE"
fi
send_menu
continue
;;
"restart")
do_restart
send_msg "$BOT_TG_SERVICE_RESTARTED_SHORT"
sleep 10
send_menu
continue
;;
"readlog")
send_msg "$BOT_TG_LOG_CONTENT\n\`\`\`$(grep -v "$BOT_TG_TASK_WORD" $TMPDIR/ShellCrash.log |tail -n 20)\`\`\`"
sleep 3
send_menu
continue
;;
"transport")
send_transport_menu
continue
;;
"set_sub")
echo "await_sub" > "$STATE_FILE"
send_msg "$BOT_TG_INPUT_SUB"
continue
;;
ts_*)
transport
continue
;;
esac
### --- 处理订阅输入 --- ###
TEXT=$(echo "$UPDATES" | grep -o '"text":"[^"]*"' | tail -n1 | sed 's/.*"text":"//;s/"$//')
### --- 处理订阅输入 --- ###
TEXT=$(echo "$UPDATES" | grep -o '"text":"[^"]*"' | tail -n1 | sed 's/.*"text":"//;s/"$//')
if [ "$(cat "$STATE_FILE" 2>/dev/null)" = "await_sub" ]; then
echo "" > "$STATE_FILE"
do_set_sub "$TEXT"
send_msg "$BOT_TG_SUB_UPDATED\n$(cat "$LOGFILE")"
send_menu
continue
fi
if [ "$(cat "$STATE_FILE" 2>/dev/null)" = "await_sub" ]; then
echo "" > "$STATE_FILE"
do_set_sub "$TEXT"
send_msg "$BOT_TG_SUB_UPDATED\n$(cat "$LOGFILE")"
send_menu
continue
fi
### 处理命令 ###
case "$TEXT" in
/crash)
send_menu
;;
/"$my_alias")
send_menu
;;
/help)
send_help
;;
esac
### 处理命令 ###
case "$TEXT" in
/crash)
send_menu
;;
/"$my_alias")
send_menu
;;
/help)
send_help
;;
esac
done
done
}
[ "$TG_menupush" = ON ] && send_menu

View File

@@ -22,7 +22,7 @@ tg_push_token() {
push_TG="$TOKEN"
setconfig push_TG "$TOKEN"
setconfig chat_ID "$chat_ID"
. "$CRASHDIR"/libs/logger.sh && logger "$BOT_TG_SET_DONE" 32
. "$CRASHDIR"/libs/logger.sh && logger "$BOT_TG_SET_DONE" 32
}
get_chatid() {

View File

@@ -1,18 +1,16 @@
. "$CRASHDIR"/libs/set_cron.sh
load_lang bot_tg
bot_tg_start(){
. "$CRASHDIR"/starts/start_legacy.sh
start_legacy "$CRASHDIR/menus/bot_tg.sh" 'bot_tg'
. "$CRASHDIR"/starts/start_legacy.sh
start_legacy "$CRASHDIR/menus/bot_tg.sh" 'bot_tg'
}
bot_tg_stop(){
cronload | grep -q 'TG_BOT' && cronset 'TG_BOT'
[ -f "$TMPDIR/bot_tg.pid" ] && kill -TERM "$(cat "$TMPDIR/bot_tg.pid")" 2>/dev/null
killall bot_tg.sh 2>/dev/null
rm -f "$TMPDIR/bot_tg.pid"
cronload | grep -q 'TG_BOT' && cronset 'TG_BOT'
[ -f "$TMPDIR/bot_tg.pid" ] && kill -TERM "$(cat "$TMPDIR/bot_tg.pid")" 2>/dev/null
killall bot_tg.sh 2>/dev/null
rm -f "$TMPDIR/bot_tg.pid"
}
bot_tg_cron(){
cronset "$BOT_TG_CRON_NAME" "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #$BOT_TG_CRON_NAME"
cronset 'ShellCrash-TG_BOT' "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT"
}

View File

@@ -4,46 +4,46 @@
load_lang check_port
_get_netstat_cmd() {
case "$1" in
tcp) echo "netstat -ntl" ;;
udp) echo "netstat -nul" ;;
*) echo "netstat -ntul" ;;
esac
case "$1" in
tcp) echo "netstat -ntl" ;;
udp) echo "netstat -nul" ;;
*) echo "netstat -ntul" ;;
esac
}
check_port() {
local port="$1"
local protocol="${2:-all}"
local port="$1"
local protocol="${2:-all}"
if [ "$port" -gt 65535 ] || [ "$port" -le 1 ]; then
msg_alert "\033[31m$CHECK_PORT_RANGE_ERR\033[0m"
return 1
fi
if [ "$port" -gt 65535 ] || [ "$port" -le 1 ]; then
msg_alert "\033[31m$CHECK_PORT_RANGE_ERR\033[0m"
return 1
fi
local check_cmd
check_cmd=$(_get_netstat_cmd "$protocol")
local check_cmd
check_cmd=$(_get_netstat_cmd "$protocol")
if $check_cmd 2>/dev/null | grep -q ":${port}[[:space:]]"; then
msg_alert "\033[31m$CHECK_PORT_OCCUPIED_ERR\033[0m"
return 1
fi
if $check_cmd 2>/dev/null | grep -q ":${port}[[:space:]]"; then
msg_alert "\033[31m$CHECK_PORT_OCCUPIED_ERR\033[0m"
return 1
fi
return 0
return 0
}
check_port_with_info() {
local port="$1"
local protocol="${2:-all}"
local check_cmd
check_cmd=$(_get_netstat_cmd "$protocol")
local port="$1"
local protocol="${2:-all}"
local check_cmd
check_cmd=$(_get_netstat_cmd "$protocol")
local conflict_line
conflict_line=$($check_cmd 2>/dev/null | grep ":${port}[[:space:]]" | head -n 1)
local conflict_line
conflict_line=$($check_cmd 2>/dev/null | grep ":${port}[[:space:]]" | head -n 1)
if [ -n "$conflict_line" ]; then
echo "$conflict_line"
return 1
fi
if [ -n "$conflict_line" ]; then
echo "$conflict_line"
return 1
fi
return 0
return 0
}

View File

@@ -12,21 +12,21 @@ add_ddns() {
cat >>"$ddns_dir" <<EOF
config service '$service'
option enabled '1'
option force_unit 'hours'
option lookup_host '$domain'
option service_name '$service_name'
option domain '$domain'
option username '$username'
option use_https '0'
option use_ipv6 '$use_ipv6'
option password '$password'
option ip_source 'web'
option check_unit 'minutes'
option check_interval '$check_interval'
option force_interval '$force_interval'
option interface 'wan'
option bind_network 'wan'
option enabled '1'
option force_unit 'hours'
option lookup_host '$domain'
option service_name '$service_name'
option domain '$domain'
option username '$username'
option use_https '0'
option use_ipv6 '$use_ipv6'
option password '$password'
option ip_source 'web'
option check_unit 'minutes'
option check_interval '$check_interval'
option force_interval '$force_interval'
option interface 'wan'
option bind_network 'wan'
EOF
/usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
sleep 3
@@ -71,12 +71,12 @@ set_ddns() {
set_ddns_service() {
while true; do
services_dir=/etc/ddns/"$serv"
[ -s "$services_dir" ] || services_dir=/etc/ddns/services
[ -s "$services_dir" ] || services_dir=/etc/ddns/services
[ -s "$services_dir" ] || services_dir=/usr/share/ddns/list
[ -s "$services_dir" ] || {
msg_alert "\033[33m$DDNS_LIST_NOT_FOUND\033[0m"
ddns service update >/dev/null || msg_alert "\033[31m$DDNS_DOWNLOAD_FAILED\033[0m"
}
[ -s "$services_dir" ] || {
msg_alert "\033[33m$DDNS_LIST_NOT_FOUND\033[0m"
ddns service update >/dev/null || msg_alert "\033[31m$DDNS_DOWNLOAD_FAILED\033[0m"
}
comp_box "\033[32m$DDNS_SELECT_PROVIDER\033[0m"
list=$(awk '/^#/ || !NF {next} {print $1}' "$services_dir")

View File

@@ -48,116 +48,31 @@ set_dns_mod() {
msg_alert "\033[36m$DNS_SET_OK$dns_mod\033[0m"
;;
4)
while true; do
line_break
separator_line "="
if [ "$dns_protect" = ON ]; then
content_line "$DNS_PROTECT_NOW\033[33m$DNS_ENABLED\033[0m$DNS_PROTECT_DISABLE_Q"
else
content_line "$DNS_PROTECT_NOW\033[33m$DNS_DISABLED\033[0m$DNS_PROTECT_ENABLE_Q"
fi
separator_line "="
btm_box "1) $DNS_YES" \
"2) $DNS_RESET_DEFAULT" \
"0) $DNS_NO_BACK"
read -r -p "$COMMON_INPUT> " num
case "$num" in
0)
break
;;
1)
if [ "$dns_protect" = ON ]; then
dns_protect=OFF
else
dns_protect=ON
fi
;;
2)
dns_protect=ON
;;
*)
errornum
continue
;;
esac
setconfig dns_protect "$dns_protect"
common_success
done
if [ "$dns_protect" = ON ]; then
dns_protect=OFF
else
dns_protect=ON
fi
setconfig dns_protect "$dns_protect"
common_success
;;
5)
while true; do
line_break
separator_line "="
if [ "$hosts_opt" = ON ]; then
content_line "$DNS_HOSTS_NOW\033[33m$DNS_ENABLED\033[0m$DNS_HOSTS_DISABLE_Q"
else
content_line "$DNS_HOSTS_NOW\033[33m$DNS_DISABLED\033[0m$DNS_HOSTS_ENABLE_Q"
fi
separator_line "="
btm_box "1) $DNS_YES" \
"2) $DNS_RESET_DEFAULT" \
"0) $DNS_NO_BACK"
read -r -p "$COMMON_INPUT> " num
case "$num" in
0)
break
;;
1)
if [ "$hosts_opt" = ON ]; then
hosts_opt=OFF
else
hosts_opt=ON
fi
;;
2)
hosts_opt=ON
;;
*)
errornum
continue
;;
esac
setconfig dns_protect "$hosts_opt"
common_success
done
if [ "$hosts_opt" = ON ]; then
hosts_opt=OFF
else
hosts_opt=ON
fi
setconfig hosts_opt "$hosts_opt"
common_success
;;
6)
while true; do
line_break
separator_line "="
if [ "$ecs_subnet" = ON ]; then
content_line "$DNS_HOSTS_NOW\033[33m$DNS_ENABLED\033[0m$DNS_HOSTS_DISABLE_Q"
else
content_line "$DNS_HOSTS_NOW\033[33m$DNS_DISABLED\033[0m$DNS_HOSTS_ENABLE_Q"
fi
separator_line "="
btm_box "1) $DNS_YES" \
"2) $DNS_RESET_DEFAULT" \
"0) $DNS_NO_BACK"
read -r -p "$COMMON_INPUT> " num
case "$num" in
0)
break
;;
1)
if [ "$ecs_subnet" = ON ]; then
ecs_subnet=OFF
else
ecs_subnet=ON
fi
;;
2)
ecs_subnet=OFF
;;
*)
errornum
continue
;;
esac
setconfig dns_protect "$ecs_subnet"
common_success
done
if [ "$ecs_subnet" = ON ]; then
ecs_subnet=OFF
else
ecs_subnet=ON
fi
setconfig ecs_subnet "$ecs_subnet"
common_success
;;
7)
while true; do
@@ -270,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"
@@ -286,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
@@ -312,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
@@ -338,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
@@ -351,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
@@ -365,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

View File

@@ -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" \

View File

@@ -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" \

View File

@@ -97,21 +97,21 @@ gen_providers_txt() {
[ -n "$include" ] && include_ele="\"include\": \"$include\","
if [ -n "$(echo "$2" | grep -E '^./')" ]; then
cat >>"$TMPDIR"/providers/providers.json <<EOF
{
{
"tag": "$tag",
"type": "local",
"path": "$2",
"path": "$2",
EOF
else
cat >>"$TMPDIR"/providers/providers.json <<EOF
{
{
"tag": "$tag",
"type": "remote",
"url": "$2",
"path": "./providers/$tag.yaml",
"user_agent": "$ua",
"update_interval": "${interval2}h",
$exclude_ele
$exclude_ele
$include_ele
EOF
fi
@@ -124,11 +124,14 @@ EOF
"interval": "${interval}m",
"timeout": "3s"
},
"override_tls": {
"enabled": true,
"insecure": $override_tls
}
},
"override_dialer": {
"domain_resolver": "$dns_proxy_server"
},
"override_tls": {
"enabled": true,
"insecure": $override_tls
}
},
EOF
# 写入提供者
echo '{ "tag": "'"$tag"'", "type": "urltest", "tolerance": 100, "providers": ["'"$tag"'"], "include": ".*" },' >>"$TMPDIR"/providers/outbounds_add.json

View File

@@ -1,13 +1,13 @@
running_status(){
VmRSS=$(awk '/^VmRSS:/ {printf "%.2f MB\n", ($2 * 1024) / 1000000}' /proc/$PID/status)
#获取运行时长
touch "$TMPDIR"/crash_start_time #用于延迟启动的校验
start_time=$(cat "$TMPDIR"/crash_start_time)
if [ -n "$start_time" ]; then
time=$(($(date +%s) - start_time))
day=$((time / 86400))
[ "$day" = "0" ] && day='' || day="$dayD"
time=$(date -u -d @${time} +%H:%M:%S)
fi
VmRSS=$(awk '/^VmRSS:/ {printf "%.2f MB\n", ($2 * 1024) / 1000000}' /proc/$PID/status)
#获取运行时长
touch "$TMPDIR"/crash_start_time #用于延迟启动的校验
start_time=$(cat "$TMPDIR"/crash_start_time)
if [ -n "$start_time" ]; then
time=$(($(date +%s) - start_time))
day=$((time / 86400))
[ "$day" = "0" ] && day='' || day="$dayD"
time=$(date -u -d @${time} +%H:%M:%S)
fi
}

View File

@@ -9,6 +9,8 @@ __IS_MODULE_SUBCONVERTER=1
load_lang subconverter
LISTFILE="$CRASHDIR"/configs/servers_"$i18n".list
# Subconverter在线订阅转换
subconverter() {
while true; do
@@ -115,14 +117,14 @@ gen_link_ele() {
# 选择在线规则模版
gen_link_config() {
list=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | awk '{print $2$4}')
now=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}')
list=$(grep -aE '^5' "$LISTFILE" | awk '{print $2$4}')
now=$(grep -aE '^5' "$LISTFILE" | sed -n ""$rule_link"p" | awk '{print $2}')
comp_box "$SUBCONVERTER_RULE_CURRENT\033[33m$now\033[0m"
list_box "$list"
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
@@ -140,8 +142,8 @@ gen_link_config() {
# 选择Subconverter服务器
gen_link_server() {
list=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print $3" "$2}')
now=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
list=$(grep -aE '^3|^4' "$LISTFILE" | awk '{print $3" "$2}')
now=$(grep -aE '^3|^4' "$LISTFILE" | sed -n ""$server_link"p" | awk '{print $3}')
comp_box "\033[36m$SUBCONVERTER_SERVER_HINT\033[0m" \
"\033[32m$SUBCONVERTER_SERVER_THANKS\033[0m" \
@@ -151,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

View File

@@ -10,122 +10,123 @@
. "$CRASHDIR"/libs/web_get_bin.sh
. "$CRASHDIR"/libs/logger.sh
. "$CRASHDIR"/libs/i18n.sh
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
load_lang task_cmd
task_logger(){
[ "$task_push" = 1 ] && push= || push=off
[ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m"
[ "$3" = 'off' ] && push=off
echo "$1" |grep -qE "($TASK_CMD_EVERY|$TASK_CMD_HOURLY)([1-9]|[1-9][0-9])$TASK_CMD_MIN" && {
push=off
cover=on
}
logger "$1" 0 "$push" "$cover"
[ "$task_push" = 1 ] && push= || push=off
[ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m"
[ "$3" = 'off' ] && push=off
echo "$1" |grep -qE "($TASK_CMD_EVERY|$TASK_CMD_HOURLY)([1-9]|[1-9][0-9])$TASK_CMD_MIN" && {
push=off
cover=on
}
logger "$1" 0 "$push" "$cover"
}
#任务命令
check_update(){ #检查更新工具
get_bin "$TMPDIR"/crashversion "$1" echooff
[ "$?" = "0" ] && . "$TMPDIR"/crashversion 2>/dev/null
rm -rf "$TMPDIR"/crashversion
get_bin "$TMPDIR"/crashversion "$1" echooff
[ "$?" = "0" ] && . "$TMPDIR"/crashversion 2>/dev/null
rm -rf "$TMPDIR"/crashversion
}
update_core(){ #自动更新内核
#检查版本
check_update bin/version
crash_v_new=$(eval echo \$${crashcore}_v)
if [ -z "$crash_v_new" -o "$crash_v_new" = "$core_v" ];then
task_logger "$TASK_CMD_CORE_SKIP"
return 0
else
. "$CRASHDIR"/libs/core_tools.sh && core_webget #调用下载工具
case "$?" in
0)
task_logger "$TASK_CMD_CORE_DONE"
"$CRASHDIR"/start.sh start
return 0
;;
1)
task_logger "$TASK_CMD_CORE_DL_FAIL"
return 1
;;
*)
task_logger "$TASK_CMD_CORE_VERIFY_FAIL"
"$CRASHDIR"/start.sh start
return 1
;;
esac
fi
#检查版本
check_update bin/version
crash_v_new=$(eval echo \$${crashcore}_v)
if [ -z "$crash_v_new" -o "$crash_v_new" = "$core_v" ];then
task_logger "$TASK_CMD_CORE_SKIP"
return 0
else
. "$CRASHDIR"/libs/core_tools.sh && core_webget #调用下载工具
case "$?" in
0)
task_logger "$TASK_CMD_CORE_DONE"
"$CRASHDIR"/start.sh start
return 0
;;
1)
task_logger "$TASK_CMD_CORE_DL_FAIL"
return 1
;;
*)
task_logger "$TASK_CMD_CORE_VERIFY_FAIL"
"$CRASHDIR"/start.sh start
return 1
;;
esac
fi
}
update_scripts(){ #自动更新脚本
#检查版本
check_update version
if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ];then
task_logger "$TASK_CMD_SCRIPT_SKIP"
return 0
else
get_bin "$TMPDIR"/ShellCrash.tar.gz "ShellCrash.tar.gz"
if [ "$?" != "0" ];then
rm -rf "$TMPDIR"/ShellCrash.tar.gz
task_logger "$TASK_CMD_CORE_DL_FAIL"
return 1
else
#停止服务
"$CRASHDIR"/start.sh stop
#解压
tar -zxf "$TMPDIR"/ShellCrash.tar.gz ${tar_para} -C "$CRASHDIR"/
if [ $? -ne 0 ];then
rm -rf "$TMPDIR"/ShellCrash.tar.gz
task_logger "$TASK_CMD_SCRIPT_UNZIP_FAIL"
"$CRASHDIR"/start.sh start
return 1
else
. "$CRASHDIR"/init.sh >/dev/null
"$CRASHDIR"/start.sh start
return 0
fi
fi
fi
#检查版本
check_update version
if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ];then
task_logger "$TASK_CMD_SCRIPT_SKIP"
return 0
else
get_bin "$TMPDIR"/ShellCrash.tar.gz "ShellCrash.tar.gz"
if [ "$?" != "0" ];then
rm -rf "$TMPDIR"/ShellCrash.tar.gz
task_logger "$TASK_CMD_CORE_DL_FAIL"
return 1
else
#停止服务
"$CRASHDIR"/start.sh stop
#解压
tar -zxf "$TMPDIR"/ShellCrash.tar.gz ${tar_para} -C "$CRASHDIR"/
if [ $? -ne 0 ];then
rm -rf "$TMPDIR"/ShellCrash.tar.gz
task_logger "$TASK_CMD_SCRIPT_UNZIP_FAIL"
"$CRASHDIR"/start.sh start
return 1
else
. "$CRASHDIR"/init.sh >/dev/null
"$CRASHDIR"/start.sh start
return 0
fi
fi
fi
}
update_mmdb(){ #自动更新数据库
getgeo(){
#检查版本
check_update bin/version
geo_v="$(echo $2 | awk -F "." '{print $1}')_v" #获取版本号类型比如Country_v
geo_v_new=$GeoIP_v
geo_v_now=$(eval echo \$$geo_v)
if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ];then
task_logger "$TASK_CMD_DB_SKIP_PREFIX$2$TASK_CMD_DB_SKIP_SUFFIX"
else
#更新文件
get_bin "$TMPDIR"/$1 "bin/geodata/$2"
if [ "$?" != "0" ];then
task_logger "$TASK_CMD_DB_DL_FAIL_PREFIX$2$TASK_CMD_DB_DL_FAIL_SUFFIX"
rm -rf "$TMPDIR"/$1
else
mv -f "$TMPDIR"/$1 "$BINDIR"/$1
setconfig $geo_v $GeoIP_v
task_logger "$TASK_CMD_DB_OK_PREFIX$2$TASK_CMD_DB_OK_SUFFIX"
fi
fi
}
[ -n "${cn_mini_v}" -a -s "$CRASHDIR"/Country.mmdb ] && getgeo Country.mmdb cn_mini.mmdb
[ -n "${china_ip_list_v}" -a -s "$CRASHDIR"/cn_ip.txt ] && getgeo cn_ip.txt china_ip_list.txt
[ -n "${china_ipv6_list_v}" -a -s "$CRASHDIR"/cn_ipv6.txt ] && getgeo cn_ipv6.txt china_ipv6_list.txt
[ -n "${geosite_v}" -a -s "$CRASHDIR"/GeoSite.dat ] && getgeo GeoSite.dat geosite.dat
[ -n "${geoip_cn_v}" -a -s "$CRASHDIR"/geoip.db ] && getgeo geoip.db geoip_cn.db
[ -n "${geosite_cn_v}" -a -s "$CRASHDIR"/geosite.db ] && getgeo geosite.db geosite_cn.db
return 0
getgeo(){
#检查版本
check_update bin/version
geo_v="$(echo $2 | awk -F "." '{print $1}')_v" #获取版本号类型比如Country_v
geo_v_new=$GeoIP_v
geo_v_now=$(eval echo \$$geo_v)
if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ];then
task_logger "$TASK_CMD_DB_SKIP_PREFIX$2$TASK_CMD_DB_SKIP_SUFFIX"
else
#更新文件
get_bin "$TMPDIR"/$1 "bin/geodata/$2"
if [ "$?" != "0" ];then
task_logger "$TASK_CMD_DB_DL_FAIL_PREFIX$2$TASK_CMD_DB_DL_FAIL_SUFFIX"
rm -rf "$TMPDIR"/$1
else
mv -f "$TMPDIR"/$1 "$BINDIR"/$1
setconfig $geo_v $GeoIP_v
task_logger "$TASK_CMD_DB_OK_PREFIX$2$TASK_CMD_DB_OK_SUFFIX"
fi
fi
}
[ -n "${cn_mini_v}" -a -s "$CRASHDIR"/Country.mmdb ] && getgeo Country.mmdb cn_mini.mmdb
[ -n "${china_ip_list_v}" -a -s "$CRASHDIR"/cn_ip.txt ] && getgeo cn_ip.txt china_ip_list.txt
[ -n "${china_ipv6_list_v}" -a -s "$CRASHDIR"/cn_ipv6.txt ] && getgeo cn_ipv6.txt china_ipv6_list.txt
[ -n "${geosite_v}" -a -s "$CRASHDIR"/GeoSite.dat ] && getgeo GeoSite.dat geosite.dat
[ -n "${geoip_cn_v}" -a -s "$CRASHDIR"/geoip.db ] && getgeo geoip.db geoip_cn.db
[ -n "${geosite_cn_v}" -a -s "$CRASHDIR"/geosite.db ] && getgeo geosite.db geosite_cn.db
return 0
}
reset_firewall(){ #重设透明路由防火墙
"$CRASHDIR"/start.sh stop_firewall
"$CRASHDIR"/start.sh afstart
"$CRASHDIR"/start.sh stop_firewall
"$CRASHDIR"/start.sh afstart
}
ntp(){
ckcmd ntpd && ntpd -n -q -p 203.107.6.88 >/dev/null 2>&1 || exit 0
ckcmd ntpd && ntpd -n -q -p 203.107.6.88 >/dev/null 2>&1 || exit 0
}
web_save_auto(){
. "$CRASHDIR"/libs/web_save.sh && web_save
. "$CRASHDIR"/libs/web_save.sh && web_save
}
update_config() { #更新订阅并重启
. "$CRASHDIR"/starts/core_config.sh && get_core_config && "$CRASHDIR"/start.sh start
@@ -139,14 +140,14 @@ 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_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"
;;
*)
"$1"
;;
[1-9][0-9][0-9])
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"
;;
*)
"$1"
;;
esac

View File

@@ -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
# 检测小内存模式

View File

@@ -16,20 +16,20 @@
. "$CRASHDIR"/libs/web_save.sh
#特殊脚本
bfstart(){
"$CRASHDIR"/starts/bfstart.sh
"$CRASHDIR"/starts/bfstart.sh
}
afstart(){
"$CRASHDIR"/starts/afstart.sh
"$CRASHDIR"/starts/afstart.sh
}
stop_firewall(){
"$CRASHDIR"/starts/fw_stop.sh
"$CRASHDIR"/starts/fw_stop.sh
}
#保守模式启动
start_l(){
bfstart && {
. "$CRASHDIR"/starts/start_legacy.sh
start_legacy "$COMMAND" 'shellcrash'
} && afstart &
bfstart && {
. "$CRASHDIR"/starts/start_legacy.sh
start_legacy "$COMMAND" 'shellcrash'
} && afstart &
}
case "$1" in
@@ -37,26 +37,26 @@ case "$1" in
start)
[ -n "$(pidof CrashCore)" ] && $0 stop #禁止多实例
stop_firewall #清理路由策略
rm -f "$CRASHDIR"/\.start_error #移除自启失败标记
rm -f "$CRASHDIR"/\.start_error #移除自启失败标记
#使用不同方式启动服务
if [ "$firewall_area" = "5" ]; then #主旁转发
if [ "$firewall_area" = "5" ]; then #主旁转发
. "$CRASHDIR"/starts/fw_start.sh
elif [ "$start_old" = "ON" ]; then
start_l
elif [ -f /etc/rc.common ] && grep -q 'procd' /proc/1/comm; then
/etc/init.d/shellcrash start
elif [ "$USER" = "root" ] && grep -q 'systemd' /proc/1/comm; then
FragmentPath=$(systemctl show -p FragmentPath shellcrash | sed 's/FragmentPath=//')
[ -f "$FragmentPath" ] && {
sed -i "s#^ExecStart=.*#ExecStart=$COMMAND >/dev/null#" "$FragmentPath"
systemctl daemon-reload
}
systemctl start shellcrash.service || . "$CRASHDIR"/starts/start_error.sh
FragmentPath=$(systemctl show -p FragmentPath shellcrash | sed 's/FragmentPath=//')
[ -f "$FragmentPath" ] && {
sed -i "s#^ExecStart=.*#ExecStart=$COMMAND >/dev/null#" "$FragmentPath"
systemctl daemon-reload
}
systemctl start shellcrash.service || . "$CRASHDIR"/starts/start_error.sh
elif grep -q 's6' /proc/1/comm; then
bfstart && /command/s6-svc -u /run/service/shellcrash && {
[ ! -f "$CRASHDIR"/.dis_startup ] && touch /etc/s6-overlay/s6-rc.d/user/contents.d/afstart
afstart &
}
bfstart && /command/s6-svc -u /run/service/shellcrash && {
[ ! -f "$CRASHDIR"/.dis_startup ] && touch /etc/s6-overlay/s6-rc.d/user/contents.d/afstart
afstart &
}
elif rc-status -r >/dev/null 2>&1; then
rc-service shellcrash stop >/dev/null 2>&1
rc-service shellcrash start
@@ -68,9 +68,9 @@ stop)
logger ShellCrash服务即将关闭......
[ -n "$(pidof CrashCore)" ] && web_save #保存面板配置
#清理定时任务
cronload | grep -vE '^$|start_legacy_wd.sh|运行时每' > "$TMPDIR"/cron_tmp
cronadd "$TMPDIR"/cron_tmp
rm -f "$TMPDIR"/cron_tmp
cronload | grep -vE '^$|start_legacy_wd.sh|运行时每' > "$TMPDIR"/cron_tmp
cronadd "$TMPDIR"/cron_tmp
rm -f "$TMPDIR"/cron_tmp
#停止tg_bot
. "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_stop
#多种方式结束进程
@@ -83,8 +83,8 @@ stop)
elif [ -f /etc/rc.common ] && grep -q 'procd' /proc/1/comm; then
/etc/init.d/shellcrash stop >/dev/null 2>&1
elif grep -q 's6' /proc/1/comm; then
/command/s6-svc -d /run/service/shellcrash
stop_firewall
/command/s6-svc -d /run/service/shellcrash
stop_firewall
elif rc-status -r >/dev/null 2>&1; then
rc-service shellcrash stop >/dev/null 2>&1
else

View File

@@ -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
@@ -18,13 +22,13 @@
#设置循环检测面板端口以判定服务启动是否成功
. "$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 #标记启动时间
#后台还原面板配置
[ "$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 &
web_restore >/dev/null 2>&1
}
#推送日志
{
@@ -33,22 +37,22 @@ if [ -n "$test" -o -n "$(pidof CrashCore)" ]; then
} &
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 #删除重复行
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 "$CRASHDIR"/task/afstart ] && { . "$CRASHDIR"/task/afstart; } &
[ -s "$CRASHDIR"/task/affirewall -a -s /etc/init.d/firewall -a ! -f /etc/init.d/firewall.bak ] && {
[ -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\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
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\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
sed -i "${line}a\\. $TASKCFGDIR/affirewall" /etc/init.d/firewall
} &
exit 0
else

View File

@@ -5,7 +5,7 @@
[ -z "$CRASHDIR" ] && CRASHDIR=$( cd $(dirname $0);cd ..;pwd)
. "$CRASHDIR"/libs/get_config.sh
[ -z "$BINDIR" -o -z "$TMPDIR" -o -z "$COMMAND" ] && . "$CRASHDIR"/init.sh >/dev/null 2>&1
[ ! -f "$TMPDIR" ] && mkdir -p "$TMPDIR"
[ ! -d "$TMPDIR" ] && mkdir -p "$TMPDIR"
#当上次启动失败时终止自启动
[ -f "$CRASHDIR"/.start_error ] && exit 1
@@ -38,8 +38,8 @@ makehtml() { #生成面板跳转文件
<body>
<div style="text-align: center; margin-top: 50px;">
<h1>您还未安装本地面板</h1>
<h3>请在脚本更新功能中(9-4)安装<br>或者使用在线面板:</h3>
<h4>请复制当前地址/ui(不包括)前面的内容填入url位置即可连接</h3>
<h3>请在脚本更新功能中(9-4)安装<br>或者使用在线面板:</h3>
<h4>请复制当前地址/ui(不包括)前面的内容填入url位置即可连接</h3>
<a href="http://board.zash.run.place" style="font-size: 24px;">Zashboard面板(推荐)<br></a>
<a style="font-size: 21px;"><br>如已安装请使用Ctrl+F5强制刷新此页面<br></a>
</div>
@@ -54,19 +54,19 @@ catpac() { #生成pac文件
[ -z "$host_pac" ] && host_pac=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1)
cat >"$TMPDIR"/shellcrash_pac <<EOF
function FindProxyForURL(url, host) {
if (
isInNet(host, "0.0.0.0", "255.0.0.0")||
isInNet(host, "10.0.0.0", "255.0.0.0")||
isInNet(host, "127.0.0.0", "255.0.0.0")||
isInNet(host, "224.0.0.0", "224.0.0.0")||
isInNet(host, "240.0.0.0", "240.0.0.0")||
isInNet(host, "172.16.0.0", "255.240.0.0")||
isInNet(host, "192.168.0.0", "255.255.0.0")||
isInNet(host, "169.254.0.0", "255.255.0.0")
)
return "DIRECT";
else
return "PROXY $host_pac:$mix_port; DIRECT; SOCKS5 $host_pac:$mix_port"
if (
isInNet(host, "0.0.0.0", "255.0.0.0")||
isInNet(host, "10.0.0.0", "255.0.0.0")||
isInNet(host, "127.0.0.0", "255.0.0.0")||
isInNet(host, "224.0.0.0", "224.0.0.0")||
isInNet(host, "240.0.0.0", "240.0.0.0")||
isInNet(host, "172.16.0.0", "255.240.0.0")||
isInNet(host, "192.168.0.0", "255.255.0.0")||
isInNet(host, "169.254.0.0", "255.255.0.0")
)
return "DIRECT";
else
return "PROXY $host_pac:$mix_port; DIRECT; SOCKS5 $host_pac:$mix_port"
}
EOF
compare "$TMPDIR"/shellcrash_pac "$BINDIR"/ui/pac
@@ -79,64 +79,64 @@ 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
logger "未找到配置文件,正在下载!" 33
. "$CRASHDIR"/starts/core_config.sh && get_core_config
else
logger "未找到配置文件链接,请先导入配置文件!" 31
exit 1
fi
if [ -n "$Url" -o -n "$Https" ]; then
logger "未找到配置文件,正在下载!" 33
. "$CRASHDIR"/starts/core_config.sh && get_core_config
else
logger "未找到配置文件链接,请先导入配置文件!" 31
exit 1
fi
fi
#检查dashboard文件
if [ -f "$CRASHDIR"/ui/CNAME -a ! -f "$BINDIR"/ui/CNAME ]; then
cp -rf "$CRASHDIR"/ui "$BINDIR"
cp -rf "$CRASHDIR"/ui "$BINDIR"
fi
[ ! -s "$BINDIR"/ui/index.html ] && makehtml #如没有面板则创建跳转界面
catpac #生成pac文件
#内核及内核配置文件检查
[ "$CRASHDIR" != "$BINDIR" ] && {
mkdir -p "$BINDIR"/providers
ln -sf "$CRASHDIR"/providers/* "$BINDIR"/providers/
mkdir -p "$BINDIR"/providers
ln -sf "$CRASHDIR"/providers/* "$BINDIR"/providers/
}
if echo "$crashcore" | grep -q 'singbox'; then
. "$CRASHDIR"/starts/singbox_check.sh && singbox_check
[ -d "$TMPDIR"/jsons ] && rm -rf "$TMPDIR"/jsons/* || mkdir -p "$TMPDIR"/jsons #准备目录
if [ "$disoverride" != "1" ];then
. "$CRASHDIR"/starts/singbox_modify.sh && modify_json
else
ln -sf "$core_config" "$TMPDIR"/jsons/config.json
fi
. "$CRASHDIR"/starts/singbox_check.sh && singbox_check
[ -d "$TMPDIR"/jsons ] && rm -rf "$TMPDIR"/jsons/* || mkdir -p "$TMPDIR"/jsons #准备目录
if [ "$disoverride" != "1" ];then
. "$CRASHDIR"/starts/singbox_modify.sh && modify_json
else
ln -sf "$core_config" "$TMPDIR"/jsons/config.json
fi
else
. "$CRASHDIR"/starts/clash_check.sh && clash_check
if [ "$disoverride" != "1" ];then
. "$CRASHDIR"/starts/clash_modify.sh && modify_yaml
else
ln -sf "$core_config" "$TMPDIR"/config.yaml
fi
. "$CRASHDIR"/starts/clash_check.sh && clash_check
if [ "$disoverride" != "1" ];then
. "$CRASHDIR"/starts/clash_modify.sh && modify_yaml
else
ln -sf "$core_config" "$TMPDIR"/config.yaml
fi
fi
#检查下载cnip绕过相关文件
[ "$cn_ip_route" = "ON" ] && [ "$dns_mod" != "fake-ip" ] && {
[ "$firewall_mod" = nftables ] || ckcmd ipset && {
. "$CRASHDIR"/starts/check_cnip.sh
ck_cn_ipv4
[ "$ipv6_redir" = "ON" ] && ck_cn_ipv6
}
[ "$firewall_mod" = nftables ] || ckcmd ipset && {
. "$CRASHDIR"/starts/check_cnip.sh
ck_cn_ipv4
[ "$ipv6_redir" = "ON" ] && ck_cn_ipv6
}
}
#添加shellcrash用户
[ "$firewall_area" = 2 ] || [ "$firewall_area" = 3 ] || [ "$(cat /proc/1/comm)" = "systemd" ] &&
[ -z "$(id shellcrash 2>/dev/null | grep 'root')" ] && {
ckcmd userdel && userdel shellcrash 2>/dev/null
sed -i '/0:7890/d' /etc/passwd
sed -i '/x:7890/d' /etc/group
if ckcmd useradd; then
useradd shellcrash -u 7890
sed -Ei s/7890:7890/0:7890/g /etc/passwd
else
echo "shellcrash:x:0:7890:::" >>/etc/passwd
fi
[ -z "$(id shellcrash 2>/dev/null | grep 'root')" ] && {
ckcmd userdel && userdel shellcrash 2>/dev/null
sed -i '/0:7890/d' /etc/passwd
sed -i '/x:7890/d' /etc/group
if ckcmd useradd; then
useradd shellcrash -u 7890
sed -Ei s/7890:7890/0:7890/g /etc/passwd
else
echo "shellcrash:x:0:7890:::" >>/etc/passwd
fi
}
#加载系统内核组件
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" ] && ckcmd modprobe && modprobe tun 2>/dev/null
@@ -144,4 +144,3 @@ fi
rm -rf /tmp/ShellCrash/debug.log
rm -rf "$CRASHDIR"/debug.log
exit 0

View File

@@ -5,7 +5,7 @@
check_core() { #检查及下载内核文件
[ -n "$(find --help 2>&1 | grep -o size)" ] && find_para=' -size +2000' #find命令兼容
[ -z "$(find "$TMPDIR"/CrashCore $find_para 2>/dev/null)" ] && core_find
[ -z "$(find "$TMPDIR"/CrashCore $find_para 2>/dev/null)" ] && core_find
[ ! -f "$TMPDIR"/CrashCore ] && {
logger "未找到【$crashcore】核心,正在下载!" 33
[ -z "$cpucore" ] && . "$CRASHDIR"/libs/check_cpucore.sh && check_cpucore

View File

@@ -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"
@@ -16,15 +15,15 @@ modify_yaml() {
#Meta内核专属配置
[ "$crashcore" = 'meta' ] && {
[ -z "$(grep 'PROCESS' "$CRASHDIR"/yamls/*.yaml)" ] && find_process='find-process-mode: "off"'
#ecs优化
[ "$ecs_subnet" = ON ] && {
. "$CRASHDIR"/libs/get_ecsip.sh
if [ -n "$ecs_address" ];then
dns_fallback=$(echo "$dns_fallback, " | sed "s|, |#ecs-override=true\&ecs=$ecs_address, |g" | sed 's|, $||')
else
logger "自动获取ecs网段失败"
fi
}
#ecs优化
[ "$ecs_subnet" = ON ] && {
. "$CRASHDIR"/libs/get_ecsip.sh
if [ -n "$ecs_address" ];then
dns_fallback=$(echo "$dns_fallback, " | sed "s|, |#ecs-override=true\&ecs=$ecs_address, |g" | sed 's|, $||')
else
logger "自动获取ecs网段失败"
fi
}
}
#dns配置
[ -z "$(cat "$CRASHDIR"/yamls/user.yaml 2>/dev/null | grep '^dns:')" ] && {
@@ -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
@@ -100,18 +102,21 @@ EOF
if [ "$crashcore" = "meta" ]; then
echo " 'services.googleapis.cn': services.googleapis.com" >>"$TMPDIR"/hosts.yaml
fi
#加载本机hosts
sys_hosts=/etc/hosts
[ -f /data/etc/custom_hosts ] && sys_hosts='/etc/hosts /data/etc/custom_hosts'
cat $sys_hosts | while read line; do
[ -n "$(echo "$line" | grep -oE "([0-9]{1,3}[\.]){3}")" ] &&
[ -z "$(echo "$line" | grep -oE '^#')" ] &&
hosts_ip=$(echo $line | awk '{print $1}') &&
hosts_domain=$(echo $line | awk '{print $2}') &&
[ -z "$(cat "$TMPDIR"/hosts.yaml | grep -oE "$hosts_domain")" ] &&
echo " '$hosts_domain': $hosts_ip" >>"$TMPDIR"/hosts.yaml
done
#加载本机hosts
sys_hosts=/etc/hosts
[ -f /data/etc/custom_hosts ] && sys_hosts='/etc/hosts /data/etc/custom_hosts'
cat $sys_hosts | while read line; do
[ -n "$(echo "$line" | grep -oE "([0-9]{1,3}[\.]){3}")" ] &&
[ -z "$(echo "$line" | grep -oE '^#')" ] &&
hosts_ip=$(echo $line | awk '{print $1}') &&
hosts_domain=$(echo $line | awk '{print $2}') &&
[ -z "$(cat "$TMPDIR"/hosts.yaml | grep -oE "$hosts_domain")" ] &&
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,11 +176,14 @@ EOF
IFS="$oldIFS"
done
}
}
add_custom_inbounds_and_rules() {
#添加自定义入站
[ "$vms_service" = ON ] || [ "$sss_service" = ON ] && {
. "$CRASHDIR"/configs/gateway.cfg
. "$CRASHDIR"/libs/meta_listeners.sh
}
[ "$vms_service" = ON ] || [ "$sss_service" = ON ] && {
. "$CRASHDIR"/configs/gateway.cfg
. "$CRASHDIR"/libs/meta_listeners.sh
}
#节点绕过功能支持
sed -i "/#节点绕过/d" "$TMPDIR"/rules.yaml
[ "$proxies_bypass" = "ON" ] && {
@@ -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
}

View File

@@ -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,24 +29,24 @@ 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链接
#如果传来的是Url链接则合成Https链接否则直接使用Https链接
if [ -z "$Https" ]; then
#Urlencord转码处理保留字符
if ckcmd hexdump;then
Url=$(echo $Url | sed 's/%26/\&/g') #处理分隔符
urlencodeUrl="exclude=$(urlencode "$exclude")&include=$(urlencode "$include")&url=$(urlencode "$Url")&config=$(urlencode "$Config")"
else
urlencodeUrl="exclude=$exclude&include=$include&url=$Url&config=$Config"
fi
Url=$(echo $Url | sed 's/%26/\&/g') #处理分隔符
urlencodeUrl="exclude=$(urlencode "$exclude")&include=$(urlencode "$include")&url=$(urlencode "$Url")&config=$(urlencode "$Config")"
else
urlencodeUrl="exclude=$exclude&include=$include&url=$Url&config=$Config"
fi
Https="${Server}/sub?target=${target}&${Server_ua}=${user_agent}&insert=true&new_name=true&scv=true&udp=true&${urlencodeUrl}"
url_type=true
else
Https=$(echo $Https | sed 's/\\&/\&/g') #还原转义
else
Https=$(echo $Https | sed 's/\\&/\&/g') #还原转义
fi
#输出
echo "-----------------------------------------------"
@@ -92,7 +95,7 @@ get_core_config() { #下载内核配置文件
else
. "$CRASHDIR"/starts/clash_config_check.sh
fi
check_config
check_config
#如果不同则备份并替换文件
if [ -s "$core_config" ]; then
compare "$core_config_new" "$core_config"

View File

@@ -1,36 +1,45 @@
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
sleep 1 && i=$((i + 1))
done
#Tailscale
[ "$ts_service" = ON ] && {
ts_host_ipv4=' 100.64.0.0/10'
ts_host_ipv6=' fd7a:115c:a1e0::/48'
}
#Wireguard
[ "$wg_service" = ON ] && {
. "$CRASHDIR"/configs/gateway.cfg
wg_host_ipv4=' $wg_ipv4'
[ -n "$wg_ipv6" ] && wg_host_ipv6=' $wg_ipv6'
}
#Tailscale
[ "$ts_service" = ON ] && {
ts_host_ipv4=' 100.64.0.0/10'
ts_host_ipv6=' fd7a:115c:a1e0::/48'
}
#Wireguard
[ "$wg_service" = ON ] && {
. "$CRASHDIR"/configs/gateway.cfg
wg_host_ipv4=' $wg_ipv4'
[ -n "$wg_ipv6" ] && wg_host_ipv6=' $wg_ipv6'
}
#添加自定义ipv4局域网网段
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" ] && {
host_ipv4='192.168.0.0/16 10.0.0.0/12 172.16.0.0/12'
logger "无法获取本地LAN-IPV4网段请前往流量过滤设置界面设置自定义网段" 31
}
host_ipv4='192.168.0.0/16 10.0.0.0/12 172.16.0.0/12'
logger "无法获取本地LAN-IPV4网段请前往流量过滤设置界面设置自定义网段" 31
}
host_ipv6="fe80::/10 fd00::/8 $host_ipv6$ts_host_ipv6$wg_host_ipv6"
#获取本机出口IP地址
local_ipv4=$(ip route 2>&1 | grep -Ev 'utun|iot|docker|linkdown' | grep -Eo 'src.*' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort -u)
@@ -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"
}
}

View File

@@ -32,11 +32,12 @@ start_ipt_route() { #iptables-route通用工具
done
[ "$firewall_area" = 5 ] && "$1" $w -t "$2" -A "$4" -s $bypass_host -j RETURN
[ -z "$ports" ] && {
"$1" $w -t "$2" -A "$4" -p tcp -m multiport --dports "$mix_port,$redir_port,$tproxy_port" -j RETURN
"$1" $w -t "$2" -A "$4" -p udp -m multiport --dports "$mix_port,$redir_port,$tproxy_port" -j RETURN
}
"$1" $w -t "$2" -A "$4" -p tcp -m multiport --dports "$mix_port,$redir_port,$tproxy_port" -j RETURN
"$1" $w -t "$2" -A "$4" -p udp -m multiport --dports "$mix_port,$redir_port,$tproxy_port" -j RETURN
}
#跳过目标保留地址及目标本机网段
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
@@ -136,35 +139,35 @@ start_ipt_dns() { #iptables-dns通用工具
"$1" $w -t nat -I "$2" -p udp --dport 53 -j "$3"
}
start_ipt_wan() { #iptables公网防火墙
ipt_wan_accept(){
$iptable -I INPUT -p "$1" -m multiport --dports "$accept_ports" -j ACCEPT
ckcmd ip6tables && $ip6table -I INPUT -p "$1" -m multiport --dports "$accept_ports" -j ACCEPT
}
ipt_wan_reject(){
$iptable -I INPUT -p "$1" -m multiport --dports "$reject_ports" -j REJECT
ckcmd ip6tables && $ip6table -I INPUT -p "$1" -m multiport --dports "$reject_ports" -j REJECT
}
#端口拦截
reject_ports="$mix_port,$db_port"
ipt_wan_reject tcp
ipt_wan_reject udp
#端口放行
[ -f "$CRASHDIR"/configs/gateway.cfg ] && . "$CRASHDIR"/configs/gateway.cfg
accept_ports=$(echo "$fw_wan_ports,$vms_port,$sss_port" | sed "s/,,/,/g ;s/^,// ;s/,$//")
ipt_wan_accept(){
$iptable -I INPUT -p "$1" -m multiport --dports "$accept_ports" -j ACCEPT
ckcmd ip6tables && $ip6table -I INPUT -p "$1" -m multiport --dports "$accept_ports" -j ACCEPT
}
ipt_wan_reject(){
$iptable -I INPUT -p "$1" -m multiport --dports "$reject_ports" -j REJECT
ckcmd ip6tables && $ip6table -I INPUT -p "$1" -m multiport --dports "$reject_ports" -j REJECT
}
#端口拦截
reject_ports="$mix_port,$db_port"
ipt_wan_reject tcp
ipt_wan_reject udp
#端口放行
[ -f "$CRASHDIR"/configs/gateway.cfg ] && . "$CRASHDIR"/configs/gateway.cfg
accept_ports=$(echo "$fw_wan_ports,$vms_port,$sss_port" | sed "s/,,/,/g ;s/^,// ;s/,$//")
[ -n "$accept_ports" ] && {
ipt_wan_accept tcp
ipt_wan_accept udp
}
#局域网请求放行
for ip in $host_ipv4; do
$iptable -I INPUT -s $ip -j ACCEPT
done
ckcmd ip6tables && for ip in $host_ipv6; do
$ip6table -I INPUT -s $ip -j ACCEPT
done
#本机请求全放行
$iptable -I INPUT -i lo -j ACCEPT
ckcmd ip6tables && $ip6table -I INPUT -i lo -j ACCEPT
ipt_wan_accept tcp
ipt_wan_accept udp
}
#局域网请求放行
for ip in $host_ipv4; do
$iptable -I INPUT -s $ip -j ACCEPT
done
ckcmd ip6tables && for ip in $host_ipv6; do
$ip6table -I INPUT -s $ip -j ACCEPT
done
#本机请求全放行
$iptable -I INPUT -i lo -j ACCEPT
ckcmd ip6tables && $ip6table -I INPUT -i lo -j ACCEPT
}
start_iptables() { #iptables配置总入口
#启动公网访问防火墙
@@ -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
}
}
}
}

View File

@@ -5,24 +5,24 @@ RESERVED_IP=$(echo $reserve_ipv4 | sed 's/[[:space:]]\+/, /g')
RESERVED_IP6=$(echo "$reserve_ipv6 $host_ipv6" | sed 's/[[:space:]]\+/, /g')
add_ip6_route(){
#过滤保留地址及本机地址
nft add rule inet shellcrash $1 ip6 daddr {$RESERVED_IP6} return
#仅代理本机局域网网段流量
nft add rule inet shellcrash $1 ip6 saddr != {$HOST_IP6} return
#绕过CN_IPV6
[ "$dns_mod" != "fake-ip" -a "$cn_ip_route" = "ON" -a -f "$BINDIR"/cn_ipv6.txt ] && {
CN_IP6=$(awk '{printf "%s, ",$1}' "$BINDIR"/cn_ipv6.txt)
[ -n "$CN_IP6" ] && {
nft add set inet shellcrash cn_ip6 { type ipv6_addr \; flags interval \; }
nft add element inet shellcrash cn_ip6 { $CN_IP6 }
nft add rule inet shellcrash $1 ip6 daddr @cn_ip6 return
}
}
#过滤保留地址及本机地址
nft add rule inet shellcrash $1 ip6 daddr {$RESERVED_IP6} return
#仅代理本机局域网网段流量
nft add rule inet shellcrash $1 ip6 saddr != {$HOST_IP6} return
#绕过CN_IPV6
[ "$dns_mod" != "fake-ip" -a "$cn_ip_route" = "ON" -a -f "$BINDIR"/cn_ipv6.txt ] && {
CN_IP6=$(awk '{printf "%s, ",$1}' "$BINDIR"/cn_ipv6.txt)
[ -n "$CN_IP6" ] && {
nft add set inet shellcrash cn_ip6 { type ipv6_addr \; flags interval \; }
nft add element inet shellcrash cn_ip6 { $CN_IP6 }
nft add rule inet shellcrash $1 ip6 daddr @cn_ip6 return
}
}
}
start_nft_route() { #nftables-route通用工具
#$1:name $2:hook(prerouting/output) $3:type(nat/mangle/filter) $4:priority(-100/-150)
[ "$common_ports" = "ON" ] && PORTS=$(echo $multiport | sed 's/,/, /g')
[ "$1" = 'prerouting' ] && HOST_IP=$(echo $host_ipv4 | sed 's/[[:space:]]\+/, /g')
[ "$1" = 'prerouting' ] && HOST_IP=$(echo $host_ipv4 | sed 's/[[:space:]]\+/, /g')
[ "$1" = 'output' ] && HOST_IP="127.0.0.0/8, $(echo $local_ipv4 | sed 's/[[:space:]]\+/, /g')"
[ "$1" = 'prerouting_vm' ] && HOST_IP="$(echo $vm_ipv4 | sed 's/[[:space:]]\+/, /g')"
#添加新链
@@ -39,9 +39,9 @@ start_nft_route() { #nftables-route通用工具
#过滤常用端口
[ -n "$PORTS" ] && {
nft add rule inet shellcrash $1 ip daddr != {28.0.0.0/8} tcp dport != {$PORTS} return
nft add rule inet shellcrash $1 ip daddr != {28.0.0.0/8} udp dport != {$PORTS} return
nft add rule inet shellcrash $1 ip daddr != {28.0.0.0/8} udp dport != {$PORTS} return
nft add rule inet shellcrash $1 ip6 daddr != {fc00::/16} tcp dport != {$PORTS} return
nft add rule inet shellcrash $1 ip6 daddr != {fc00::/16} udp dport != {$PORTS} return
nft add rule inet shellcrash $1 ip6 daddr != {fc00::/16} udp dport != {$PORTS} return
}
#nft add rule inet shellcrash $1 ip saddr 28.0.0.0/8 return
nft add rule inet shellcrash $1 ip daddr {$RESERVED_IP} return #过滤保留地址
@@ -76,23 +76,23 @@ start_nft_route() { #nftables-route通用工具
[ "$dns_mod" != "fake-ip" -a "$cn_ip_route" = "ON" -a -f "$BINDIR"/cn_ip.txt ] && {
CN_IP=$(awk '{printf "%s, ",$1}' "$BINDIR"/cn_ip.txt)
[ -n "$CN_IP" ] && {
nft add set inet shellcrash cn_ip { type ipv4_addr \; flags interval \; }
nft add element inet shellcrash cn_ip { $CN_IP }
nft add rule inet shellcrash $1 ip daddr @cn_ip return
}
}
nft add set inet shellcrash cn_ip { type ipv4_addr \; flags interval \; }
nft add element inet shellcrash cn_ip { $CN_IP }
nft add rule inet shellcrash $1 ip daddr @cn_ip return
}
}
#局域网ipv6支持
if [ "$ipv6_redir" = "ON" -a "$1" = 'prerouting' -a "$firewall_area" != 5 ]; then
HOST_IP6=$(echo $host_ipv6 | sed 's/[[:space:]]\+/, /g')
HOST_IP6=$(echo $host_ipv6 | sed 's/[[:space:]]\+/, /g')
add_ip6_route "$1"
elif [ "$ipv6_redir" = "ON" -a "$1" = 'output' -a \( "$firewall_area" = 2 -o "$firewall_area" = 3 \) ]; then
HOST_IP6="::1, $(echo $host_ipv6 | sed 's/[[:space:]]\+/, /g')"
add_ip6_route "$1"
add_ip6_route "$1"
else
nft add rule inet shellcrash $1 meta nfproto ipv6 return
fi
#屏蔽quic
[ "$quic_rj" = 'ON' -a "$lan_proxy" = true ] && nft add rule inet shellcrash $1 udp dport {443, 8443} return
#屏蔽quic
[ "$quic_rj" = 'ON' -a "$lan_proxy" = true ] && nft add rule inet shellcrash $1 udp dport {443, 8443} return
#添加通用路由
nft add rule inet shellcrash "$1" "$JUMP"
#处理特殊路由
@@ -104,10 +104,10 @@ start_nft_route() { #nftables-route通用工具
#nft add rule inet shellcrash local_tproxy log prefix \"pre\" level debug
}
start_nft_dns() { #nftables-dns
[ "$1" = 'prerouting' ] && {
HOST_IP=$(echo $host_ipv4 | sed 's/[[:space:]]\+/, /g')
HOST_IP6=$(echo $host_ipv6 | sed 's/[[:space:]]\+/, /g')
}
[ "$1" = 'prerouting' ] && {
HOST_IP=$(echo $host_ipv4 | sed 's/[[:space:]]\+/, /g')
HOST_IP6=$(echo $host_ipv6 | sed 's/[[:space:]]\+/, /g')
}
[ "$1" = 'output' ] && HOST_IP="127.0.0.0/8, $(echo $local_ipv4 | sed 's/[[:space:]]\+/, /g')"
[ "$1" = 'prerouting_vm' ] && HOST_IP="$(echo $vm_ipv4 | sed 's/[[:space:]]\+/, /g')"
nft add chain inet shellcrash "$1"_dns { type nat hook $2 priority -100 \; }
@@ -133,26 +133,26 @@ start_nft_dns() { #nftables-dns
nft add rule inet shellcrash "$1"_dns tcp dport 53 redirect to "$dns_redir_port"
}
start_nft_wan() { #nftables公网防火墙
HOST_IP=$(echo $host_ipv4 | sed 's/[[:space:]]\+/, /g')
HOST_IP6=$(echo $host_ipv6 | sed 's/[[:space:]]\+/, /g')
HOST_IP=$(echo $host_ipv4 | sed 's/[[:space:]]\+/, /g')
HOST_IP6=$(echo $host_ipv6 | sed 's/[[:space:]]\+/, /g')
nft add chain inet shellcrash input { type filter hook input priority -100 \; }
nft add rule inet shellcrash input iif lo accept #本机请求全放行
#端口放行
[ -f "$CRASHDIR"/configs/gateway.cfg ] && . "$CRASHDIR"/configs/gateway.cfg
accept_ports=$(echo "$fw_wan_ports,$vms_port,$sss_port" | sed "s/,,/,/g ;s/^,// ;s/,$// ;s/,/, /")
#端口放行
[ -f "$CRASHDIR"/configs/gateway.cfg ] && . "$CRASHDIR"/configs/gateway.cfg
accept_ports=$(echo "$fw_wan_ports,$vms_port,$sss_port" | sed "s/,,/,/g ;s/^,// ;s/,$// ;s/,/, /")
[ -n "$accept_ports" ] && {
fw_wan_nfports="{ $(echo "$accept_ports" | sed 's/,/, /g') }"
nft add rule inet shellcrash input tcp dport $fw_wan_nfports meta mark set 0x67890 accept
nft add rule inet shellcrash input udp dport $fw_wan_nfports meta mark set 0x67890 accept
}
#端口拦截
reject_ports="{ $mix_port, $db_port }"
nft add rule inet shellcrash input ip saddr {$HOST_IP} accept
nft add rule inet shellcrash input ip6 saddr {$HOST_IP6} accept
nft add rule inet shellcrash input tcp dport $reject_ports reject
nft add rule inet shellcrash input udp dport $reject_ports reject
#fw4特殊处理
nft list chain inet fw4 input >/dev/null 2>&1 && \
fw_wan_nfports="{ $(echo "$accept_ports" | sed 's/,/, /g') }"
nft add rule inet shellcrash input tcp dport $fw_wan_nfports meta mark set 0x67890 accept
nft add rule inet shellcrash input udp dport $fw_wan_nfports meta mark set 0x67890 accept
}
#端口拦截
reject_ports="{ $mix_port, $db_port }"
nft add rule inet shellcrash input ip saddr {$HOST_IP} accept
nft add rule inet shellcrash input ip6 saddr {$HOST_IP6} accept
nft add rule inet shellcrash input tcp dport $reject_ports reject
nft add rule inet shellcrash input udp dport $reject_ports reject
#fw4特殊处理
nft list chain inet fw4 input >/dev/null 2>&1 && \
nft list chain inet fw4 input | grep -q '67890' || \
nft insert rule inet fw4 input meta mark 0x67890 accept 2>/dev/null
}

View File

@@ -14,27 +14,27 @@
#设置策略路由
[ "$firewall_area" != 4 ] && {
[ "$redir_mod" = "Tproxy" ] && ip route add local default dev lo table $table 2>/dev/null
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" ] && {
i=1
while [ -z "$(ip route list | grep utun)" -a "$i" -le 29 ]; do
sleep 1
i=$((i + 1))
done
if [ -z "$(ip route list | grep utun)" ]; then
logger "找不到tun模块放弃启动tun相关防火墙规则" 31
else
ip route add default dev utun table $table && tun_statu=true
fi
}
[ "$firewall_area" = 5 ] && ip route add default via $bypass_host table $table 2>/dev/null
[ "$redir_mod" != "Redir" ] && ip rule add fwmark $fwmark table $table 2>/dev/null
[ "$redir_mod" = "Tproxy" ] && ip route add local default dev lo table $table 2>/dev/null
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" ] && {
i=1
while [ -z "$(ip route list | grep utun)" -a "$i" -le 29 ]; do
sleep 1
i=$((i + 1))
done
if [ -z "$(ip route list | grep utun)" ]; then
logger "找不到tun模块放弃启动tun相关防火墙规则" 31
else
ip route add default dev utun table $table && tun_statu=true
fi
}
[ "$firewall_area" = 5 ] && ip route add default via $bypass_host table $table 2>/dev/null
[ "$redir_mod" != "Redir" ] && ip rule add fwmark $fwmark table $table 2>/dev/null
}
#添加ipv6路由
[ "$ipv6_redir" = "ON" -a "$firewall_area" -le 3 ] && {
[ "$redir_mod" = "Tproxy" ] && ip -6 route add local default dev lo table $((table + 1)) 2>/dev/null
[ -n "$(ip route list | grep utun)" ] && ip -6 route add default dev utun table $((table + 1)) 2>/dev/null
[ "$redir_mod" != "Redir" ] && ip -6 rule add fwmark $fwmark table $((table + 1)) 2>/dev/null
[ "$redir_mod" = "Tproxy" ] && ip -6 route add local default dev lo table $((table + 1)) 2>/dev/null
[ -n "$(ip route list | grep utun)" ] && ip -6 route add default dev utun table $((table + 1)) 2>/dev/null
[ "$redir_mod" != "Redir" ] && ip -6 rule add fwmark $fwmark table $((table + 1)) 2>/dev/null
}
#判断代理用途
[ "$firewall_area" = 2 -o "$firewall_area" = 3 ] && local_proxy=true
@@ -44,11 +44,11 @@
[ "$firewall_mod" = 'nftables' ] && . "$CRASHDIR"/starts/fw_nftables.sh && start_nftables
#修复部分虚拟机dns查询失败的问题
[ "$firewall_area" = 2 -o "$firewall_area" = 3 ] && [ -z "$(grep '127.0.0.1' /etc/resolv.conf 2>/dev/null)" ] && [ "$systype" != 'container' ] && {
line=$(grep -n 'nameserver' /etc/resolv.conf | awk -F: 'FNR==1{print $1}')
sed -i "$line i\nameserver 127.0.0.1 #shellcrash-dns-repair" /etc/resolv.conf >/dev/null 2>&1
line=$(grep -n 'nameserver' /etc/resolv.conf | awk -F: 'FNR==1{print $1}')
sed -i "$line i\nameserver 127.0.0.1 #shellcrash-dns-repair" /etc/resolv.conf >/dev/null 2>&1
}
#移除openwrt-dnsmasq的DNS重定向
[ "$(uci get dhcp.@dnsmasq[0].dns_redirect 2>/dev/null)" = 1 ] && {
uci del dhcp.@dnsmasq[0].dns_redirect
uci commit dhcp.@dnsmasq[0]
uci del dhcp.@dnsmasq[0].dns_redirect
uci commit dhcp.@dnsmasq[0]
}

View File

@@ -14,110 +14,110 @@
accept_ports=$(echo "$fw_wan_ports,$vms_port,$sss_port" | sed "s/,,/,/g ;s/^,// ;s/,$//")
#重置iptables相关规则
ckcmd iptables && {
ckcmd iptables && iptables -h | grep -q '\-w' && iptable='iptables -w' || iptable=iptables
#dns
$iptable -t nat -D PREROUTING -p tcp --dport 53 -j shellcrash_dns 2>/dev/null
$iptable -t nat -D PREROUTING -p udp --dport 53 -j shellcrash_dns 2>/dev/null
$iptable -t nat -D OUTPUT -p udp --dport 53 -j shellcrash_dns_out 2>/dev/null
$iptable -t nat -D OUTPUT -p tcp --dport 53 -j shellcrash_dns_out 2>/dev/null
#redir
$iptable -t nat -D PREROUTING -p tcp $ports -j shellcrash 2>/dev/null
$iptable -t nat -D PREROUTING -p tcp -d 28.0.0.0/8 -j shellcrash 2>/dev/null
$iptable -t nat -D OUTPUT -p tcp $ports -j shellcrash_out 2>/dev/null
$iptable -t nat -D OUTPUT -p tcp -d 28.0.0.0/8 -j shellcrash_out 2>/dev/null
#vm_dns
$iptable -t nat -D PREROUTING -p tcp --dport 53 -j shellcrash_vm_dns 2>/dev/null
$iptable -t nat -D PREROUTING -p udp --dport 53 -j shellcrash_vm_dns 2>/dev/null
#vm_redir
$iptable -t nat -D PREROUTING -p tcp $ports -j shellcrash_vm 2>/dev/null
$iptable -t nat -D PREROUTING -p tcp -d 28.0.0.0/8 -j shellcrash_vm 2>/dev/null
#TPROXY&tun
$iptable -t mangle -D PREROUTING -p tcp $ports -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D PREROUTING -p udp $ports -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D PREROUTING -p tcp -d 28.0.0.0/8 -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D PREROUTING -p udp -d 28.0.0.0/8 -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D OUTPUT -p tcp $ports -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D OUTPUT -p udp $ports -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D OUTPUT -p tcp -d 28.0.0.0/8 -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D OUTPUT -p udp -d 28.0.0.0/8 -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D PREROUTING -m mark --mark $fwmark -p tcp -j TPROXY --on-port $tproxy_port 2>/dev/null
$iptable -t mangle -D PREROUTING -m mark --mark $fwmark -p udp -j TPROXY --on-port $tproxy_port 2>/dev/null
#tun
$iptable -D FORWARD -o utun -j ACCEPT 2>/dev/null
#屏蔽QUIC
[ "$dns_mod" != "fake-ip" ] && [ "$cn_ip_route" != "OFF" ] && set_cn_ip='-m set ! --match-set cn_ip dst'
$iptable -D INPUT -p udp --dport 443 $set_cn_ip -j REJECT 2>/dev/null
$iptable -D FORWARD -p udp --dport 443 -o utun $set_cn_ip -j REJECT 2>/dev/null
#公网访问
$iptable -D INPUT -i lo -j ACCEPT 2>/dev/null
for ip in $host_ipv4; do
$iptable -D INPUT -s $ip -j ACCEPT 2>/dev/null
done
$iptable -D INPUT -p tcp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$iptable -D INPUT -p udp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$iptable -D INPUT -p tcp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
$iptable -D INPUT -p udp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
#清理shellcrash自建表
for text in shellcrash_dns shellcrash shellcrash_out shellcrash_dns_out shellcrash_vm shellcrash_vm_dns; do
$iptable -t nat -F "$text" 2>/dev/null
$iptable -t nat -X "$text" 2>/dev/null
done
for text in shellcrash_mark shellcrash_mark_out; do
$iptable -t mangle -F "$text" 2>/dev/null
$iptable -t mangle -X "$text" 2>/dev/null
done
ckcmd iptables && iptables -h | grep -q '\-w' && iptable='iptables -w' || iptable=iptables
#dns
$iptable -t nat -D PREROUTING -p tcp --dport 53 -j shellcrash_dns 2>/dev/null
$iptable -t nat -D PREROUTING -p udp --dport 53 -j shellcrash_dns 2>/dev/null
$iptable -t nat -D OUTPUT -p udp --dport 53 -j shellcrash_dns_out 2>/dev/null
$iptable -t nat -D OUTPUT -p tcp --dport 53 -j shellcrash_dns_out 2>/dev/null
#redir
$iptable -t nat -D PREROUTING -p tcp $ports -j shellcrash 2>/dev/null
$iptable -t nat -D PREROUTING -p tcp -d 28.0.0.0/8 -j shellcrash 2>/dev/null
$iptable -t nat -D OUTPUT -p tcp $ports -j shellcrash_out 2>/dev/null
$iptable -t nat -D OUTPUT -p tcp -d 28.0.0.0/8 -j shellcrash_out 2>/dev/null
#vm_dns
$iptable -t nat -D PREROUTING -p tcp --dport 53 -j shellcrash_vm_dns 2>/dev/null
$iptable -t nat -D PREROUTING -p udp --dport 53 -j shellcrash_vm_dns 2>/dev/null
#vm_redir
$iptable -t nat -D PREROUTING -p tcp $ports -j shellcrash_vm 2>/dev/null
$iptable -t nat -D PREROUTING -p tcp -d 28.0.0.0/8 -j shellcrash_vm 2>/dev/null
#TPROXY&tun
$iptable -t mangle -D PREROUTING -p tcp $ports -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D PREROUTING -p udp $ports -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D PREROUTING -p tcp -d 28.0.0.0/8 -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D PREROUTING -p udp -d 28.0.0.0/8 -j shellcrash_mark 2>/dev/null
$iptable -t mangle -D OUTPUT -p tcp $ports -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D OUTPUT -p udp $ports -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D OUTPUT -p tcp -d 28.0.0.0/8 -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D OUTPUT -p udp -d 28.0.0.0/8 -j shellcrash_mark_out 2>/dev/null
$iptable -t mangle -D PREROUTING -m mark --mark $fwmark -p tcp -j TPROXY --on-port $tproxy_port 2>/dev/null
$iptable -t mangle -D PREROUTING -m mark --mark $fwmark -p udp -j TPROXY --on-port $tproxy_port 2>/dev/null
#tun
$iptable -D FORWARD -o utun -j ACCEPT 2>/dev/null
#屏蔽QUIC
[ "$dns_mod" != "fake-ip" ] && [ "$cn_ip_route" != "OFF" ] && set_cn_ip='-m set ! --match-set cn_ip dst'
$iptable -D INPUT -p udp --dport 443 $set_cn_ip -j REJECT 2>/dev/null
$iptable -D FORWARD -p udp --dport 443 -o utun $set_cn_ip -j REJECT 2>/dev/null
#公网访问
$iptable -D INPUT -i lo -j ACCEPT 2>/dev/null
for ip in $host_ipv4; do
$iptable -D INPUT -s $ip -j ACCEPT 2>/dev/null
done
$iptable -D INPUT -p tcp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$iptable -D INPUT -p udp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$iptable -D INPUT -p tcp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
$iptable -D INPUT -p udp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
#清理shellcrash自建表
for text in shellcrash_dns shellcrash shellcrash_out shellcrash_dns_out shellcrash_vm shellcrash_vm_dns; do
$iptable -t nat -F "$text" 2>/dev/null
$iptable -t nat -X "$text" 2>/dev/null
done
for text in shellcrash_mark shellcrash_mark_out; do
$iptable -t mangle -F "$text" 2>/dev/null
$iptable -t mangle -X "$text" 2>/dev/null
done
}
#重置ipv6规则
ckcmd ip6tables && {
ckcmd ip6tables && ip6tables -h | grep -q '\-w' && ip6table='ip6tables -w' || ip6table=ip6tables
#dns
$ip6table -t nat -D PREROUTING -p tcp --dport 53 -j shellcrashv6_dns 2>/dev/null
$ip6table -t nat -D PREROUTING -p udp --dport 53 -j shellcrashv6_dns 2>/dev/null
#redir
$ip6table -t nat -D PREROUTING -p tcp $ports -j shellcrashv6 2>/dev/null
$ip6table -t nat -D PREROUTING -p tcp -d fc00::/16 -j shellcrashv6 2>/dev/null
$ip6table -t nat -D OUTPUT -p tcp $ports -j shellcrashv6_out 2>/dev/null
$ip6table -t nat -D OUTPUT -p tcp -d fc00::/16 -j shellcrashv6_out 2>/dev/null
$ip6table -D INPUT -p tcp --dport 53 -j REJECT 2>/dev/null
$ip6table -D INPUT -p udp --dport 53 -j REJECT 2>/dev/null
#mark
$ip6table -t mangle -D PREROUTING -p tcp $ports -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D PREROUTING -p udp $ports -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D PREROUTING -p tcp -d fc00::/16 -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D PREROUTING -p udp -d fc00::/16 -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D OUTPUT -p tcp $ports -j shellcrashv6_mark_out 2>/dev/null
$ip6table -t mangle -D OUTPUT -p udp $ports -j shellcrashv6_mark_out 2>/dev/null
$ip6table -t mangle -D OUTPUT -p tcp -d fc00::/16 -j shellcrashv6_mark_out 2>/dev/null
$ip6table -t mangle -D OUTPUT -p udp -d fc00::/16 -j shellcrashv6_mark_out 2>/dev/null
$ip6table -D INPUT -p udp --dport 443 $set_cn_ip -j REJECT 2>/dev/null
$ip6table -t mangle -D PREROUTING -m mark --mark $fwmark -p tcp -j TPROXY --on-port $tproxy_port 2>/dev/null
$ip6table -t mangle -D PREROUTING -m mark --mark $fwmark -p udp -j TPROXY --on-port $tproxy_port 2>/dev/null
#tun
$ip6table -D FORWARD -o utun -j ACCEPT 2>/dev/null
#屏蔽QUIC
[ "$dns_mod" != "fake-ip" ] && [ "$cn_ip_route" != "OFF" ] && set_cn_ip6='-m set ! --match-set cn_ip6 dst'
$ip6table -D INPUT -p udp --dport 443 $set_cn_ip6 -j REJECT 2>/dev/null
$ip6table -D FORWARD -p udp --dport 443 -o utun $set_cn_ip6 -j REJECT 2>/dev/null
#公网访问
$ip6table -D INPUT -i lo -j ACCEPT 2>/dev/null
for ip in $host_ipv6; do
$ip6table -D INPUT -s $ip -j ACCEPT 2>/dev/null
done
$ip6table -D INPUT -p tcp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$ip6table -D INPUT -p udp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$ip6table -D INPUT -p tcp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
$ip6table -D INPUT -p udp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
#清理shellcrash自建表
for text in shellcrashv6_dns shellcrashv6 shellcrashv6_out; do
$ip6table -t nat -F "$text" 2>/dev/null
$ip6table -t nat -X "$text" 2>/dev/null
done
for text in shellcrashv6_mark shellcrashv6_mark_out; do
$ip6table -t mangle -F "$text" 2>/dev/null
$ip6table -t mangle -X "$text" 2>/dev/null
done
$ip6table -t mangle -F shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -X shellcrashv6_mark 2>/dev/null
ckcmd ip6tables && ip6tables -h | grep -q '\-w' && ip6table='ip6tables -w' || ip6table=ip6tables
#dns
$ip6table -t nat -D PREROUTING -p tcp --dport 53 -j shellcrashv6_dns 2>/dev/null
$ip6table -t nat -D PREROUTING -p udp --dport 53 -j shellcrashv6_dns 2>/dev/null
#redir
$ip6table -t nat -D PREROUTING -p tcp $ports -j shellcrashv6 2>/dev/null
$ip6table -t nat -D PREROUTING -p tcp -d fc00::/16 -j shellcrashv6 2>/dev/null
$ip6table -t nat -D OUTPUT -p tcp $ports -j shellcrashv6_out 2>/dev/null
$ip6table -t nat -D OUTPUT -p tcp -d fc00::/16 -j shellcrashv6_out 2>/dev/null
$ip6table -D INPUT -p tcp --dport 53 -j REJECT 2>/dev/null
$ip6table -D INPUT -p udp --dport 53 -j REJECT 2>/dev/null
#mark
$ip6table -t mangle -D PREROUTING -p tcp $ports -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D PREROUTING -p udp $ports -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D PREROUTING -p tcp -d fc00::/16 -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D PREROUTING -p udp -d fc00::/16 -j shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -D OUTPUT -p tcp $ports -j shellcrashv6_mark_out 2>/dev/null
$ip6table -t mangle -D OUTPUT -p udp $ports -j shellcrashv6_mark_out 2>/dev/null
$ip6table -t mangle -D OUTPUT -p tcp -d fc00::/16 -j shellcrashv6_mark_out 2>/dev/null
$ip6table -t mangle -D OUTPUT -p udp -d fc00::/16 -j shellcrashv6_mark_out 2>/dev/null
$ip6table -D INPUT -p udp --dport 443 $set_cn_ip -j REJECT 2>/dev/null
$ip6table -t mangle -D PREROUTING -m mark --mark $fwmark -p tcp -j TPROXY --on-port $tproxy_port 2>/dev/null
$ip6table -t mangle -D PREROUTING -m mark --mark $fwmark -p udp -j TPROXY --on-port $tproxy_port 2>/dev/null
#tun
$ip6table -D FORWARD -o utun -j ACCEPT 2>/dev/null
#屏蔽QUIC
[ "$dns_mod" != "fake-ip" ] && [ "$cn_ip_route" != "OFF" ] && set_cn_ip6='-m set ! --match-set cn_ip6 dst'
$ip6table -D INPUT -p udp --dport 443 $set_cn_ip6 -j REJECT 2>/dev/null
$ip6table -D FORWARD -p udp --dport 443 -o utun $set_cn_ip6 -j REJECT 2>/dev/null
#公网访问
$ip6table -D INPUT -i lo -j ACCEPT 2>/dev/null
for ip in $host_ipv6; do
$ip6table -D INPUT -s $ip -j ACCEPT 2>/dev/null
done
$ip6table -D INPUT -p tcp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$ip6table -D INPUT -p udp -m multiport --dports "$accept_ports" -j ACCEPT 2>/dev/null
$ip6table -D INPUT -p tcp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
$ip6table -D INPUT -p udp -m multiport --dports "$mix_port,$db_port" -j REJECT 2>/dev/null
#清理shellcrash自建表
for text in shellcrashv6_dns shellcrashv6 shellcrashv6_out; do
$ip6table -t nat -F "$text" 2>/dev/null
$ip6table -t nat -X "$text" 2>/dev/null
done
for text in shellcrashv6_mark shellcrashv6_mark_out; do
$ip6table -t mangle -F "$text" 2>/dev/null
$ip6table -t mangle -X "$text" 2>/dev/null
done
$ip6table -t mangle -F shellcrashv6_mark 2>/dev/null
$ip6table -t mangle -X shellcrashv6_mark 2>/dev/null
}
#清理ipset规则
ipset destroy cn_ip >/dev/null 2>&1

View File

@@ -3,28 +3,29 @@
#初始化目录
[ -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
. "$CRASHDIR"/configs/ShellCrash.cfg
#padavan和华硕环境变量目录设置
if [ -d "/etc/storage/clash" -o -d "/etc/storage/ShellCrash" ]; then
i=1
while [ ! -w /etc/profile -a "$i" -lt 10 ]; do
sleep 3 && i=$((i + 1))
done
[ -w "$profile" ] || profile=/etc_ro/profile
[ "$zip_type" = 'upx' ] || mount -t tmpfs -o remount,rw,size=45M tmpfs /tmp #增加/tmp空间以适配新的内核压缩方式
sed -i '' "$profile" #将软链接转化为一般文件
i=1
while [ ! -w /etc/profile -a "$i" -lt 10 ]; do
sleep 3 && i=$((i + 1))
done
[ -w "$profile" ] || profile=/etc_ro/profile
[ "$zip_type" = 'upx' ] || mount -t tmpfs -o remount,rw,size=45M tmpfs /tmp #增加/tmp空间以适配新的内核压缩方式
sed -i '' "$profile" #将软链接转化为一般文件
elif [ -d "/jffs" ]; then
sleep 60
[ -w "$profile" ] || profile=$(cat /etc/profile | grep -oE '\-f.*jffs.*profile' | awk '{print $2}')
sleep 60
[ -w "$profile" ] || profile=$(cat /etc/profile | grep -oE '\-f.*jffs.*profile' | awk '{print $2}')
fi
#写入环境变量
set_profile "$profile"
#启动进程或删除守护进程
if [ -f "$CRASHDIR"/.dis_startup ] || [ -f "$CRASHDIR"/.start_error ];then
cronset "保守模式守护进程"
cronset "保守模式守护进程"
else
"$CRASHDIR"/start.sh start
"$CRASHDIR"/start.sh start
fi

View File

@@ -2,8 +2,8 @@
singbox_check() { #singbox启动前检查
#检测singboxr专属功能
[ "$crashcore" != "singboxr" ] && [ -n "$(cat "$CRASHDIR"/jsons/*.json | grep -oE '"shadowsocksr"|"providers"')" ] && {
. "$CRASHDIR"/starts/core_exchange.sh && core_exchange singboxr 'singboxr内核专属功能'
}
. "$CRASHDIR"/starts/core_exchange.sh && core_exchange singboxr 'singboxr内核专属功能'
}
check_core
#预下载cn.srs数据库
[ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && ! grep -Eq '"tag" *:[[:space:]]*"cn"' "$CRASHDIR"/jsons/*.json && check_geo ruleset/cn.srs srs_geosite_cn.srs

View File

@@ -39,9 +39,9 @@ parse_singbox_dns() { #dns转换
esac
fi
# 输出
echo '"type": "'"$type"'", "server": "'"$server"'", "server_port": '"$port"','
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,12 +52,15 @@ 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
. "$CRASHDIR"/libs/sb_endpoints.sh
}
#生成log.json
[ "$ts_service" = ON ] || [ "$wg_service" = ON ] && [ "$zip_type" != upx ] && {
. "$CRASHDIR"/configs/gateway.cfg
. "$CRASHDIR"/libs/sb_endpoints.sh
}
#生成log.json
cat >"$TMPDIR"/jsons/log.json <<EOF
{ "log": { "level": "info", "timestamp": true } }
EOF
@@ -75,7 +78,7 @@ EOF
"path": [
$custom_hosts
"$HOME/.hosts",
"/etc/hosts"
"/etc/hosts"
],
"predefined": {
"localhost": [
@@ -86,28 +89,31 @@ EOF
"time.facebook.com": "203.107.6.88"
}
}
],
],
"rules": [
{
"ip_accept_any": true,
"server": "hosts"
}
]}
]}
}
EOF
fi
}
prepare_dns_config() {
#生成dns.json
[ "$ipv6_dns" != "OFF" ] && strategy='prefer_ipv4' || strategy='ipv4_only'
#获取detour出口
auto_detour=$(grep -E '"type": "urltest"' -A 1 "$TMPDIR"/jsons/outbounds.json | grep '自动' | head -n 1 | sed 's/^[[:space:]]*"tag": //;s/,$//')
auto_detour=$(grep -E '"type": "urltest"' -A 1 "$TMPDIR"/jsons/outbounds.json | grep '自动' | head -n 1 | sed 's/^[[:space:]]*"tag": //;s/,$//')
[ -z "$auto_detour" ] && auto_detour=$(grep -E '"type": "urltest"' -A 1 "$TMPDIR"/jsons/outbounds.json | grep '"tag":' | head -n 1 | sed 's/^[[:space:]]*"tag": //;s/,$//')
[ -z "$auto_detour" ] && auto_detour=$(grep -E '"type": "selector"' -A 1 "$TMPDIR"/jsons/outbounds.json | grep '"tag":' | head -n 1 | sed 's/^[[:space:]]*"tag": //;s/,$//')
[ -z "$auto_detour" ] && auto_detour='"DIRECT"'
#ecs优化
[ "$ecs_subnet" = ON ] && {
. "$CRASHDIR"/libs/get_ecsip.sh
client_subnet='"client_subnet": "'"$ecs_address"'",'
}
#ecs优化
[ "$ecs_subnet" = ON ] && {
. "$CRASHDIR"/libs/get_ecsip.sh
client_subnet='"client_subnet": "'"$ecs_address"'",'
}
#根据dns模式生成
[ "$dns_mod" = "redir_host" ] && {
global_dns=dns_proxy
@@ -131,9 +137,12 @@ 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",'
[ "$crashcore" = "singboxr" ] && srs_path='"path": "./ruleset/cn.srs",'
cat >"$TMPDIR"/jsons/add_rule_set.json <<EOF
{
"route": {
@@ -158,14 +167,14 @@ EOF
{
"tag": "dns_proxy",
$(parse_singbox_dns "$dns_fallback")
"routing_mark": $routing_mark,
"detour": $auto_detour,
"routing_mark": $routing_mark,
"detour": $auto_detour,
"domain_resolver": "dns_resolver"
},
{
"tag": "dns_direct",
$(parse_singbox_dns "$dns_nameserver")
"routing_mark": $routing_mark,
"routing_mark": $routing_mark,
"domain_resolver": "dns_resolver"
},
{
@@ -177,7 +186,12 @@ EOF
{
"tag": "dns_resolver",
$(parse_singbox_dns "$dns_resolver")
"routing_mark": $routing_mark
"routing_mark": $routing_mark
},
{
"tag": "dns_proxy_server",
$(parse_singbox_dns "$dns_proxy_server")
"routing_mark": $routing_mark
}
],
"rules": [
@@ -186,21 +200,24 @@ EOF
$fake_ip_filter_domain
$fake_ip_filter_suffix
$fake_ip_filter_regex
{ "clash_mode": "Global", "query_type": ["A", "AAAA"], "server": "$global_dns", "strategy": "$strategy", "rewrite_ttl": 1 },
{ "clash_mode": "Global", "query_type": ["A", "AAAA"], "server": "$global_dns", "strategy": "$strategy", "rewrite_ttl": 1 },
$direct_dns
$proxy_dns
$proxy_dns
],
"final": "dns_proxy",
"strategy": "$strategy",
"strategy": "$strategy",
"independent_cache": true,
$client_subnet
$client_subnet
"reverse_mapping": true
}
}
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
{
@@ -263,12 +280,12 @@ EOF
}
EOF
#inbounds.json添加自定义入站
[ "$vms_service" = ON ] || [ "$sss_service" = ON ] && {
. "$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",'
[ "$vms_service" = ON ] || [ "$sss_service" = ON ] && {
. "$CRASHDIR"/configs/gateway.cfg
. "$CRASHDIR"/libs/sb_inbounds.sh
}
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" }'
@@ -299,26 +319,30 @@ EOF
[ -n "$add_direct$add_reject$add_global" ] && cat >"$TMPDIR"/jsons/add_outbounds.json <<EOF
{
"outbounds": [
$add_direct
$add_reject
$add_global
$add_direct
$add_reject
$add_global
]
}
EOF
#生成experimental.json
[ "$crashcore" = "singboxr" ] && urltest_unified_delay=',"urltest_unified_delay": true'
cat >"$TMPDIR"/jsons/experimental.json <<EOF
{
"experimental": {
"clash_api": {
"external_controller": "0.0.0.0:$db_port",
"external_ui": "ui",
"external_ui_download_url": "$external_ui_url",
"external_ui_download_url": "$external_ui_url",
"secret": "$secret",
"default_mode": "Rule"
}
}$urltest_unified_delay
}
}
EOF
}
generate_custom_rules_json() {
#生成自定义规则文件
[ -n "$(grep -Ev ^# "$CRASHDIR"/yamls/rules.yaml 2>/dev/null)" ] && {
cat "$CRASHDIR"/yamls/rules.yaml |
@@ -342,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
@@ -361,6 +388,9 @@ EOF
rm -rf "$TMPDIR"/jsons/${file}.json
fi
done
}
link_custom_jsons() {
#加载自定义配置文件
mkdir -p "$TMPDIR"/jsons_base
#以下为覆盖脚本的自定义文件
@@ -376,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
@@ -387,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

View File

@@ -8,104 +8,103 @@ crontab -l | grep -v 'start_legacy_wd.sh shellcrash' | crontab -
#防止usb未加载
i=0
while [ ! -f "$CRASHDIR/configs/ShellCrash.cfg" ]; do
[ $i -gt 20 ] && exit 1
i=$((i + 1))
sleep 3
[ $i -gt 20 ] && exit 1
i=$((i + 1))
sleep 3
done
. "$CRASHDIR"/configs/ShellCrash.cfg
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 commit xiaoqiang_version.version
}
[ -z "$(pidof dropbear)" -o -z "$(netstat -ntul | grep :22)" ] && {
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear
/etc/init.d/dropbear restart
[ -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 telnet_en)" = 0 ] && nvram set telnet_en=1
nvram commit &> /dev/null
#备份还原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
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 commit xiaoqiang_version.version
}
[ -z "$(pidof dropbear)" -o -z "$(netstat -ntul | grep :22)" ] && {
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear
/etc/init.d/dropbear restart
[ -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 telnet_en)" = 0 ] && nvram set telnet_en=1
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||' )
#在/tmp创建并挂载overlay
mkdir -p /tmp/overlay
mkdir -p /tmp/overlay/upper
mkdir -p /tmp/overlay/work
mount -o noatime,lowerdir="$ko_dir",upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work -t overlay "overlay_mods_only" "$ko_dir"
#将tun.ko链接到lib
ln -sf "$CRASHDIR"/tools/tun.ko "$ko_dir"/tun.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
mkdir -p /tmp/overlay/work
mount -o noatime,lowerdir="$ko_dir",upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work -t overlay "overlay_mods_only" "$ko_dir"
#将tun.ko链接到lib
ln -sf "$CRASHDIR"/tools/tun.ko "$ko_dir"/tun.ko
}
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
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(){
#自动清理升级备份文件夹
rm -rf /data/etc_bak
#自动清理被写入闪存的系统日志并禁止服务
/etc/init.d/stat_points stop 2>/dev/null
/etc/init.d/stat_points disable 2>/dev/null
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_clean() {
#自动清理升级备份文件夹
rm -rf /data/etc_bak
#自动清理被写入闪存的系统日志并禁止服务
/etc/init.d/stat_points stop 2>/dev/null
/etc/init.d/stat_points disable 2>/dev/null
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(){
#设置init.d服务
[ ! -x /etc/init.d/shellcrash ] && {
cp -f "$CRASHDIR"/starts/shellcrash.procd /etc/init.d/shellcrash
chmod 755 /etc/init.d/shellcrash
}
#初始化环境变量
grep -q '^export CRASHDIR=' '/etc/profile' || {
. "$CRASHDIR"/libs/set_profile.sh
set_profile '/etc/profile'
}
#启动服务
if [ ! -f "$CRASHDIR"/.dis_startup ] && [ ! -f "$CRASHDIR"/.start_error ]; then
#AX6S/AX6000修复tun功能
[ -s "$CRASHDIR"/tools/tun.ko ] && tunfix
#小米7000/小米万兆修复tproxy
[ -f /etc/init.d/qca-nss-ecm ] && echo "$redir_mod" | grep -q 'Tproxy' && tproxyfix
#自动覆盖根证书文件
[ -s "$CRASHDIR"/tools/ca-certificates.crt ] && cp -f "$CRASHDIR"/tools/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
#启动服务
"$CRASHDIR"/start.sh stop
/etc/init.d/shellcrash start && /etc/init.d/shellcrash enable
fi
auto_start() {
#设置init.d服务
[ ! -x /etc/init.d/shellcrash ] && {
cp -f "$CRASHDIR"/starts/shellcrash.procd /etc/init.d/shellcrash
chmod 755 /etc/init.d/shellcrash
}
#初始化环境变量
grep -q '^export CRASHDIR=' '/etc/profile' || {
. "$CRASHDIR"/libs/set_profile.sh
set_profile '/etc/profile'
}
#启动服务
if [ ! -f "$CRASHDIR"/.dis_startup ] && [ ! -f "$CRASHDIR"/.start_error ]; then
#AX6S/AX6000修复tun功能
[ -s "$CRASHDIR"/tools/tun.ko ] && tunfix
#小米7000/小米万兆修复tproxy
[ -f /etc/init.d/qca-nss-ecm ] && echo "$redir_mod" | grep -q 'Tproxy' && tproxyfix
#自动覆盖根证书文件
[ -s "$CRASHDIR"/tools/ca-certificates.crt ] && cp -f "$CRASHDIR"/tools/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
#启动服务
"$CRASHDIR"/start.sh stop
/etc/init.d/shellcrash start && /etc/init.d/shellcrash enable
fi
}
init(){
#等待启动完成
while ! ip a| grep -q lan; do
sleep 10
done
autoSSH #软固化功能
auto_clean #自动清理
auto_start
#启动自定义服务
[ -s /data/auto_start.sh ] && /bin/sh /data/auto_start.sh &
#兼容auto_ssh脚本
[ -s /data/auto_ssh/auto_ssh.sh ] && /bin/sh /data/auto_ssh/auto_ssh.sh &
init() {
#等待启动完成
while ! ip a | grep -q lan; do
sleep 10
done
autoSSH #软固化功能
auto_clean #自动清理
auto_start
#启动自定义服务
[ -s /data/auto_start.sh ] && /bin/sh /data/auto_start.sh &
#兼容auto_ssh脚本
[ -s /data/auto_ssh/auto_ssh.sh ] && /bin/sh /data/auto_ssh/auto_ssh.sh &
}
case "$1" in
tunfix) tunfix ;;
tproxyfix) tproxyfix ;;
auto_clean) auto_clean ;;
init) init ;;
*)
if [ -z "$(pidof CrashCore)" ];then
init &
fi
;;
tunfix) tunfix ;;
tproxyfix) tproxyfix ;;
auto_clean) auto_clean ;;
init) init ;;
*)
if [ -z "$(pidof CrashCore)" ]; then
init &
fi
;;
esac

View File

@@ -1,11 +1,11 @@
if [ "$start_old" != "ON" ] && ckcmd journalctl; then
journalctl -u shellcrash >"$TMPDIR"/core_test.log
journalctl -u shellcrash >"$TMPDIR"/core_test.log
else
PID=$(pidof CrashCore) && [ -n "$PID" ] && kill -9 "$PID" >/dev/null 2>&1
${COMMAND} >"$TMPDIR"/core_test.log 2>&1 &
sleep 2
kill $! >/dev/null 2>&1
PID=$(pidof CrashCore) && [ -n "$PID" ] && kill -9 "$PID" >/dev/null 2>&1
${COMMAND} >"$TMPDIR"/core_test.log 2>&1 &
sleep 2
kill $! >/dev/null 2>&1
fi
touch "$CRASHDIR"/.start_error #标记启动失败,防止自启
error=$(cat "$TMPDIR"/core_test.log | grep -iEo 'error.*=.*|.*ERROR.*|.*FATAL.*')

View File

@@ -2,14 +2,14 @@
. "$CRASHDIR"/libs/check_cmd.sh
start_legacy(){
ckcmd nohup && _nohup=nohup
if ckcmd su && grep -q 'shellcrash:x:0:7890' /etc/passwd;then
su shellcrash -c "$_nohup $1 >/dev/null 2>&1 & echo \$! > /tmp/ShellCrash/$2.pid"
elif ckcmd setsid; then
ckcmd nohup && _nohup=nohup
if ckcmd su && grep -q 'shellcrash:x:0:7890' /etc/passwd;then
su shellcrash -c "$_nohup $1 >/dev/null 2>&1 & echo \$! > /tmp/ShellCrash/$2.pid"
elif ckcmd setsid; then
$_nohup setsid $1 >/dev/null 2>&1 &
echo $! > "/tmp/ShellCrash/$2.pid"
else
$_nohup $1 >/dev/null 2>&1 &
echo $! > "/tmp/ShellCrash/$2.pid"
fi
else
$_nohup $1 >/dev/null 2>&1 &
echo $! > "/tmp/ShellCrash/$2.pid"
fi
}

View File

@@ -7,24 +7,24 @@ LOCKDIR="/tmp/ShellCrash/start_$1.lock"
mkdir "$LOCKDIR" 2>/dev/null || exit 1
if [ -f "$PIDFILE" ]; then
PID="$(cat "$PIDFILE")"
if [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then
if kill -0 "$PID" 2>/dev/null || [ -d "/proc/$PID" ]; then
rm -fr "$LOCKDIR" 2>/dev/null
exit 0
fi
else
rm -f "$PIDFILE"
fi
PID="$(cat "$PIDFILE")"
if [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then
if kill -0 "$PID" 2>/dev/null || [ -d "/proc/$PID" ]; then
rm -fr "$LOCKDIR" 2>/dev/null
exit 0
fi
else
rm -f "$PIDFILE"
fi
fi
#如果没有进程则拉起
if [ "$1" = "shellcrash" ]; then
"$CRASHDIR"/start.sh start
"$CRASHDIR"/start.sh start
else
[ -f "$CRASHDIR/starts/start_legacy.sh" ] && . "$CRASHDIR/starts/start_legacy.sh"
killall bot_tg.sh 2>/dev/null
start_legacy "$CRASHDIR/menus/bot_tg.sh" "$1"
[ -f "$CRASHDIR/starts/start_legacy.sh" ] && . "$CRASHDIR/starts/start_legacy.sh"
killall bot_tg.sh 2>/dev/null
start_legacy "$CRASHDIR/menus/bot_tg.sh" "$1"
fi
rm -fr "$LOCKDIR" 2>/dev/null

View File

@@ -1 +1 @@
1.9.5alpha11
1.9.5alpha14