Compare commits
59 Commits
codex/impl
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
950432aebc | ||
|
|
8e95c6a292 | ||
|
|
b9c50e825d | ||
|
|
bcb3d9cabd | ||
|
|
49c509d6ef | ||
|
|
47c7331623 | ||
|
|
987ef6ab22 | ||
|
|
2218161e8f | ||
|
|
74b304be6f | ||
|
|
a968551912 | ||
|
|
13fc116985 | ||
|
|
2e7d615f8a | ||
|
|
6b6740a725 | ||
|
|
5e7a46c378 | ||
|
|
c304ec8271 | ||
|
|
cff3479213 | ||
|
|
5b94bce400 | ||
|
|
08e785dc2d | ||
|
|
feb8ff9f80 | ||
|
|
2d5df04dd4 | ||
|
|
b4a9702c82 | ||
|
|
ee2fd53675 | ||
|
|
39084ffd1e | ||
|
|
200d1729fb | ||
|
|
687e72a53f | ||
|
|
8d51f0aab6 | ||
|
|
837f99727a | ||
|
|
ab29b5c036 | ||
|
|
3e2ad3da2e | ||
|
|
13aa2f20cf | ||
|
|
b1622958e0 | ||
|
|
3dad12584a | ||
|
|
91ae2c88de | ||
|
|
5076a29996 | ||
|
|
23571b4f45 | ||
|
|
4f3dc3b70d | ||
|
|
afad3ebb5c | ||
|
|
cf35708a2a | ||
|
|
b750469047 | ||
|
|
96f04a2225 | ||
|
|
b734fc6e1d | ||
|
|
c61c637e0d | ||
|
|
7ed66026be | ||
|
|
21c4f8400b | ||
|
|
75609fbc26 | ||
|
|
c8dfb3780a | ||
|
|
373c9aacbd | ||
|
|
5f5ea62159 | ||
|
|
a9ddbba9fe | ||
|
|
2e71e78a9d | ||
|
|
c0e3992d40 | ||
|
|
1a00022ea2 | ||
|
|
8f781874e3 | ||
|
|
b4363195f3 | ||
|
|
e84bca30b9 | ||
|
|
81d6b36c51 | ||
|
|
0f96cc8c0e | ||
|
|
c5da0da08a | ||
|
|
270dbd4299 |
13
.editorconfig
Normal file
13
.editorconfig
Normal file
@@ -0,0 +1,13 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
|
||||
[*.sh]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
shell_variant = posix
|
||||
simplify = true
|
||||
switch_case_indent = true
|
||||
|
||||
2
.github/workflows/core_auto_update.yml
vendored
2
.github/workflows/core_auto_update.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
uses: juewuy/ShellCrash/.github/workflows/update_singbox_core.yaml@dev
|
||||
with:
|
||||
tag1: reF1nd/sing-box
|
||||
tag2: reF1nd-dev
|
||||
tag2: reF1nd-testing
|
||||
tag4: singboxr
|
||||
tag5: with_gvisor,with_quic,with_dhcp,with_wireguard,with_utls,with_shadowsocksr,with_acme,with_clash_api,with_tailscale
|
||||
tag6: gz
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
meta_v=v1.19.17
|
||||
singboxr_v=1.13.0-alpha.27
|
||||
versionsh=1.9.5alpha11
|
||||
versionsh=1.9.5alpha13
|
||||
GeoIP_v=20251205
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
+.bing.com
|
||||
+.linkedin.com
|
||||
30
public/servers_en.list
Normal file
30
public/servers_en.list
Normal 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
19
public/task_en.list
Normal 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
|
||||
|
||||
|
||||
|
||||
@@ -9,10 +9,9 @@ proxy-groups:
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌍 国外媒体, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -34,7 +33,6 @@ proxy-groups:
|
||||
rules:
|
||||
- GEOSITE,private,🔒 私有网络
|
||||
- GEOSITE,ads,🛑 广告域名
|
||||
- GEOSITE,trackerslist,📋 Trackerslist
|
||||
- GEOSITE,microsoft-cn,🪟 微软服务
|
||||
- GEOSITE,apple-cn,🍎 苹果服务
|
||||
- GEOSITE,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -9,10 +9,9 @@ proxy-groups:
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌍 国外媒体, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -30,7 +29,6 @@ proxy-groups:
|
||||
|
||||
rules:
|
||||
- GEOSITE,private,🔒 私有网络
|
||||
- GEOSITE,trackerslist,📋 Trackerslist
|
||||
- GEOSITE,microsoft-cn,🪟 微软服务
|
||||
- GEOSITE,apple-cn,🍎 苹果服务
|
||||
- GEOSITE,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
|
||||
@@ -3,14 +3,13 @@ proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 本地直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -32,7 +31,6 @@ proxy-groups:
|
||||
rules:
|
||||
- GEOSITE,private,🔒 私有网络
|
||||
- GEOSITE,ads,🛑 广告域名
|
||||
- GEOSITE,trackerslist,📋 Trackerslist
|
||||
- GEOSITE,microsoft-cn,🪟 微软服务
|
||||
- GEOSITE,apple-cn,🍎 苹果服务
|
||||
- GEOSITE,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -3,14 +3,13 @@ proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 本地直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -28,7 +27,6 @@ proxy-groups:
|
||||
|
||||
rules:
|
||||
- GEOSITE,private,🔒 私有网络
|
||||
- GEOSITE,trackerslist,📋 Trackerslist
|
||||
- GEOSITE,microsoft-cn,🪟 微软服务
|
||||
- GEOSITE,apple-cn,🍎 苹果服务
|
||||
- GEOSITE,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -11,10 +11,9 @@ proxy-groups:
|
||||
- {name: 🎥 奈飞视频, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📹 油管视频, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🌍 国外媒体, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -50,14 +49,6 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
type: http
|
||||
behavior: domain
|
||||
@@ -197,7 +188,6 @@ rule-providers:
|
||||
rules:
|
||||
- RULE-SET,private,🔒 私有网络
|
||||
- RULE-SET,ads,🛑 广告域名
|
||||
- RULE-SET,trackerslist,📋 Trackerslist
|
||||
- RULE-SET,microsoft-cn,🪟 微软服务
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -11,10 +11,9 @@ proxy-groups:
|
||||
- {name: 🎥 奈飞视频, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📹 油管视频, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🌍 国外媒体, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -39,14 +38,6 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
type: http
|
||||
behavior: domain
|
||||
@@ -185,7 +176,6 @@ rule-providers:
|
||||
|
||||
rules:
|
||||
- RULE-SET,private,🔒 私有网络
|
||||
- RULE-SET,trackerslist,📋 Trackerslist
|
||||
- RULE-SET,microsoft-cn,🪟 微软服务
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#DustinWin-ruleset轻量规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎯 本地直连, type: select, proxies: [DIRECT, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, DIRECT]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
- {name: 🎯 本地直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
|
||||
- {name: 👑 高级节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(专线|专用|高级|直连|急速|高倍率|游戏|game|IEPL|IPLC|AIA|CTM|CC|AC)"}
|
||||
- {name: 📉 省流节点, type: url-test, tolerance: 100, include-all: true, filter: "(0\\.[1-5]|低倍率|省流|大流量)"}
|
||||
@@ -17,14 +18,6 @@ proxy-groups:
|
||||
- {name: 🇺🇸 美国节点, type: url-test, tolerance: 100, include-all: true, filter: "(?i)(🇺🇸|美|us|unitedstates|united states)"}
|
||||
|
||||
rule-providers:
|
||||
cn:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
private:
|
||||
type: http
|
||||
behavior: domain
|
||||
@@ -77,8 +70,7 @@ rules:
|
||||
- RULE-SET,private,DIRECT
|
||||
- RULE-SET,tld-proxy,🌎 国外域名
|
||||
- RULE-SET,proxy,🌎 国外域名
|
||||
- RULE-SET,cn,🎯 本地直连
|
||||
- RULE-SET,privateip,DIRECT,no-resolve
|
||||
- RULE-SET,cnip,🎯 本地直连
|
||||
- RULE-SET,cnip,🀄️ 国内 IP
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -3,14 +3,13 @@ proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 本地直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -46,14 +45,6 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/ads.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
type: http
|
||||
behavior: domain
|
||||
@@ -145,7 +136,6 @@ rule-providers:
|
||||
rules:
|
||||
- RULE-SET,private,🔒 私有网络
|
||||
- RULE-SET,ads,🛑 广告域名
|
||||
- RULE-SET,trackerslist,📋 Trackerslist
|
||||
- RULE-SET,microsoft-cn,🪟 微软服务
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -3,14 +3,13 @@ proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 本地直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇨🇳 国内域名, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🀄️ 国内 IP, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🎯 本地直连]}
|
||||
- {name: 🌎 国外域名, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
@@ -35,14 +34,6 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
type: http
|
||||
behavior: domain
|
||||
@@ -133,7 +124,6 @@ rule-providers:
|
||||
|
||||
rules:
|
||||
- RULE-SET,private,🔒 私有网络
|
||||
- RULE-SET,trackerslist,📋 Trackerslist
|
||||
- RULE-SET,microsoft-cn,🪟 微软服务
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -31,7 +31,6 @@ proxy-groups:
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🧲 BT下载, type: select, proxies: [🎯 本地直连, 🚀 节点选择, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测速, type: select, proxies: [🎯 本地直连, 🚀 节点选择, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: ↔️ 直连软件, type: select, proxies: [🎯 本地直连, 🚀 节点选择, ♻️ 自动选择, 🛠️ 手动切换, {providers_tags}]}
|
||||
- {name: 🀄️ 国内流量, type: select, proxies: [🎯 本地直连, 🚀 节点选择, ♻️ 自动选择, 🛠️ 手动切换, {providers_tags}]}
|
||||
@@ -85,13 +84,6 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
proxy: DIRECT
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/telegramip.mrs"
|
||||
trackerslist:
|
||||
type: http
|
||||
format: mrs
|
||||
interval: 86400
|
||||
behavior: domain
|
||||
proxy: DIRECT
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/trackerslist.mrs"
|
||||
applications:
|
||||
type: http
|
||||
format: text
|
||||
@@ -224,7 +216,6 @@ rules:
|
||||
|
||||
- RULE-SET,networktest,📈 网络测速
|
||||
- RULE-SET,applications,↔️ 直连软件
|
||||
- RULE-SET,trackerslist,🧲 BT下载
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,microsoft-cn,🪟 微软服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
|
||||
@@ -12,10 +12,9 @@
|
||||
{ "tag": "🎥 奈飞视频", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📹 油管视频", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🌍 国外媒体", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇨🇳 国内域名", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🀄️ 国内 IP", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📲 电报消息", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🐟 漏网之鱼", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags}, "🎯 本地直连" ] },
|
||||
{ "tag": "🛑 广告域名", "type": "selector", "outbounds": [ "🔴 全球拦截", "🎯 本地直连" ] },
|
||||
@@ -36,7 +35,6 @@
|
||||
"rules": [
|
||||
{ "rule_set": [ "private" ], "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "ads" ], "outbound": "🛑 广告域名" },
|
||||
{ "rule_set": [ "trackerslist" ], "outbound": "📋 Trackerslist" },
|
||||
{ "rule_set": [ "microsoft-cn" ], "outbound": "🪟 微软服务" },
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
@@ -74,14 +72,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "trackerslist",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/trackerslist.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/trackerslist.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "microsoft-cn",
|
||||
"type": "remote",
|
||||
|
||||
@@ -12,10 +12,9 @@
|
||||
{ "tag": "🎥 奈飞视频", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📹 油管视频", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🌍 国外媒体", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇨🇳 国内域名", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🀄️ 国内 IP", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📲 电报消息", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🐟 漏网之鱼", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags}, "🎯 本地直连" ] },
|
||||
{ "tag": "🎯 本地直连", "type": "direct" },
|
||||
@@ -33,7 +32,6 @@
|
||||
"route": {
|
||||
"rules": [
|
||||
{ "rule_set": [ "private" ], "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "trackerslist" ], "outbound": "📋 Trackerslist" },
|
||||
{ "rule_set": [ "microsoft-cn" ], "outbound": "🪟 微软服务" },
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
@@ -63,14 +61,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "trackerslist",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/trackerslist.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/trackerslist.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "microsoft-cn",
|
||||
"type": "remote",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
{
|
||||
"outbounds": [
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": [ "♻️ 自动选择", "👉 手动选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", "🎯 本地直连", {providers_tags} ] },
|
||||
{ "tag": "🀄️ 国内 IP", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
{ "tag": "📲 电报消息", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🐟 漏网之鱼", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags}, "🎯 本地直连" ] },
|
||||
@@ -22,22 +23,13 @@
|
||||
{ "rule_set": [ "private" ], "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "tld-proxy" ], "outbound": "🌎 国外域名" },
|
||||
{ "rule_set": [ "proxy" ], "outbound": "🌎 国外域名" },
|
||||
{ "rule_set": [ "cn" ], "outbound": "🎯 本地直连" },
|
||||
{ "ip_is_private": true, "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "telegramip" ], "outbound": "📲 电报消息" },
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
{ "rule_set": [ "cnip" ], "outbound": "🎯 本地直连" }
|
||||
{ "rule_set": [ "cnip" ], "outbound": "🀄️ 国内 IP" }
|
||||
],
|
||||
"rule_set": [
|
||||
{
|
||||
"tag": "cn",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/cn.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cn.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "private",
|
||||
"type": "remote",
|
||||
|
||||
@@ -4,14 +4,13 @@
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": [ "♻️ 自动选择", "👉 手动选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", "🎯 本地直连", {providers_tags} ] },
|
||||
{ "tag": "📈 网络测试", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🎮 游戏服务", "type": "selector", "outbounds": [ "🎯 本地直连", "👑 高级节点", "🚀 节点选择" ] },
|
||||
{ "tag": "🪟 微软服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇬 谷歌服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🍎 苹果服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇨🇳 国内域名", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🀄️ 国内 IP", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📲 电报消息", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🐟 漏网之鱼", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags}, "🎯 本地直连" ] },
|
||||
{ "tag": "🛑 广告域名", "type": "selector", "outbounds": [ "🔴 全球拦截", "🎯 本地直连" ] },
|
||||
@@ -32,7 +31,6 @@
|
||||
"rules": [
|
||||
{ "rule_set": [ "private" ], "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "ads" ], "outbound": "🛑 广告域名" },
|
||||
{ "rule_set": [ "trackerslist" ], "outbound": "📋 Trackerslist" },
|
||||
{ "rule_set": [ "microsoft-cn" ], "outbound": "🪟 微软服务" },
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
@@ -64,14 +62,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "trackerslist",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/trackerslist.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/trackerslist.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "microsoft-cn",
|
||||
"type": "remote",
|
||||
|
||||
@@ -4,14 +4,13 @@
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": [ "♻️ 自动选择", "👉 手动选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", "🎯 本地直连", {providers_tags} ] },
|
||||
{ "tag": "📈 网络测试", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🎮 游戏服务", "type": "selector", "outbounds": [ "🎯 本地直连", "👑 高级节点", "🚀 节点选择" ] },
|
||||
{ "tag": "🪟 微软服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇬 谷歌服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🍎 苹果服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇨🇳 国内域名", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🀄️ 国内 IP", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
{ "tag": "🌎 国外域名", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📲 电报消息", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🐟 漏网之鱼", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags}, "🎯 本地直连" ] },
|
||||
{ "tag": "🎯 本地直连", "type": "direct" },
|
||||
@@ -29,7 +28,6 @@
|
||||
"route": {
|
||||
"rules": [
|
||||
{ "rule_set": [ "private" ], "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "trackerslist" ], "outbound": "📋 Trackerslist" },
|
||||
{ "rule_set": [ "microsoft-cn" ], "outbound": "🪟 微软服务" },
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
@@ -54,14 +52,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "trackerslist",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/trackerslist.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/trackerslist.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "microsoft-cn",
|
||||
"type": "remote",
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
{ "tag": "🪟 微软服务", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "🍎 苹果服务", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "🇬 谷歌服务", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "🧲 BT下载", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "📈 网络测速", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "↔️ 直连软件", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", {providers_tags}] },
|
||||
{ "tag": "🀄️ 国内流量", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", {providers_tags}] },
|
||||
@@ -56,7 +55,6 @@
|
||||
|
||||
{ "rule_set": ["networktest"], "outbound": "📈 网络测速" },
|
||||
{ "rule_set": ["applications"], "outbound": "↔️ 直连软件" },
|
||||
{ "rule_set": ["trackerslist"], "outbound": "🧲 BT下载" },
|
||||
{ "rule_set": ["apple-cn"], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": ["microsoft-cn"], "outbound": "🪟 微软服务" },
|
||||
{ "rule_set": ["google-cn"], "outbound": "🇬 谷歌服务" },
|
||||
@@ -113,14 +111,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/sing-box-ruleset/applications.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "trackerslist",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/trackerslist.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/sing-box-ruleset/trackerslist.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "apple-cn",
|
||||
"type": "remote",
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
[ -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"
|
||||
@@ -37,11 +37,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 +56,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 +65,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 +116,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 +128,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 +157,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,7 +187,7 @@ 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
|
||||
#配置文件改名
|
||||
@@ -202,7 +202,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
|
||||
|
||||
@@ -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="自定义端口及密钥"
|
||||
|
||||
@@ -14,3 +14,84 @@ GW_INPUT_WSPATH="请输入ws-path路径(输入0删除)"
|
||||
GW_INPUT_UUID="请输入UUID(输入0删除)"
|
||||
GW_INPUT_HOST="请输入本机公网IP(4/6)或域名"
|
||||
GW_SHARE_LINK_HINT="你的分享链接是(请勿随意分享给他人):"
|
||||
GW_MENU_FW_WAN="配置公网访问防火墙"
|
||||
GW_MENU_TG_BOT="配置Telegram专属控制机器人"
|
||||
GW_MENU_DDNS="配置DDNS自动域名"
|
||||
GW_MENU_VMESS="自定义公网Vmess入站节点"
|
||||
GW_MENU_SHADOWSOCKS="自定义公网ShadowSocks入站节点"
|
||||
GW_MENU_TS="配置Tailscale内网穿透(限Singbox)"
|
||||
GW_MENU_WG="配置Wireguard客户端(限Singbox)"
|
||||
GW_FW_STOP_WARN="公网访问防火墙需要先停止服务"
|
||||
GW_CONFIRM_CONTINUE="是否确认继续?"
|
||||
GW_YES="是"
|
||||
GW_NO="否"
|
||||
GW_NO_BACK="否,返回上级菜单"
|
||||
GW_FW_MANUAL_PORTS="当前手动放行端口:"
|
||||
GW_FW_AUTO_PORTS="当前自动放行端口:"
|
||||
GW_FW_DEFAULT_BLOCK="默认拦截端口:"
|
||||
GW_FW_TOGGLE="启用/关闭公网防火墙:"
|
||||
GW_FW_ADD_PORT="添加放行端口(可包含默认拦截端口)"
|
||||
GW_FW_REMOVE_PORT="移除指定手动放行端口"
|
||||
GW_FW_CLEAR_PORTS="清空全部手动放行端口"
|
||||
GW_FW_DISABLE_CONFIRM="是否确认关闭防火墙?"
|
||||
GW_FW_DISABLE_RISK="这会带来极大的安全隐患!"
|
||||
GW_ERR_DUP_PORT="输入错误!请勿重复添加!"
|
||||
GW_ERR_PORT_RANGE="输入错误!请输入正确的数值(1-65535)!"
|
||||
GW_ERR_INPUT="输入错误!"
|
||||
GW_INPUT_REMOVE_PORT="请直接输入要移除的端口号"
|
||||
GW_INPUT_0_BACK="或输入 0 返回上级菜单"
|
||||
GW_ERR_PORT_NOT_FOUND="请输入已添加过的端口!"
|
||||
GW_TG_CMD_MENU="呼出ShellCrash菜单"
|
||||
GW_TG_CMD_HELP="查看帮助"
|
||||
GW_TG_WARN="由于网络环境原因,此机器人仅限服务启动时运行!"
|
||||
GW_TG_TOGGLE="启用/关闭TG-BOT服务"
|
||||
GW_TG_BIND="TG-BOT绑定设置"
|
||||
GW_TG_MENUPUSH="启动时推送菜单"
|
||||
GW_TG_BIND_FIRST="请先绑定TG-BOT!"
|
||||
GW_TG_BOUND_DETECTED="检测到已经绑定了TG推送BOT"
|
||||
GW_TG_USE_DIRECT="是否直接使用?"
|
||||
GW_INBOUND_WARN_PORT="设置的端口会添加到公网访问防火墙并自动放行!"
|
||||
GW_INBOUND_WARN_BASIC="脚本只提供基础功能,更多需求请用自定义配置文件功能!"
|
||||
GW_INBOUND_WARN_ILLEGAL="切勿用于搭建违法翻墙节点,违者后果自负!"
|
||||
GW_VMS_TOGGLE="启用/关闭Vmess入站"
|
||||
GW_SET_LISTEN_PORT="设置监听端口:"
|
||||
GW_SET_WSPATH="设置WS-path(可选):"
|
||||
GW_SET_UUID="设置密钥-uuid:"
|
||||
GW_GEN_RANDOM_KEY="一键生成随机密钥"
|
||||
GW_SET_OBFS_HOST="设置混淆host(可选):"
|
||||
GW_GEN_SHARE_LINK="一键生成分享链接"
|
||||
GW_FILL_REQUIRED="请先完成必选设置!"
|
||||
GW_ERR_WSPATH="不是合法的path路径,必须以【/】开头!"
|
||||
GW_ERR_UUID="不是合法的UUID格式,请重新输入或使用随机生成功能!"
|
||||
GW_INPUT_OBFS_HOST="请输入免流混淆host(输入0删除)"
|
||||
GW_SS_TOGGLE="启用/关闭ShadowSocks入站"
|
||||
GW_SS_SELECT_CIPHER="请选择要使用的加密协议:"
|
||||
GW_SS_SET_PWD="设置password:"
|
||||
GW_SS_2022_NOTE_HEADER=" - - - - - - -\033[31m注意\033[0m- - - - - - -"
|
||||
GW_SS_2022_REQUIRE=" 2022系列加密必须使用随机生成的password!"
|
||||
GW_SS_2022_PASSWORD_ONLY="2022系列加密必须使用脚本随机生成的password!"
|
||||
GW_TS_WARN="脚本默认内核为了节约内存没有编译Tailscale模块\n如需使用请先前往自定义内核更新完整版内核文件!"
|
||||
GW_TS_KEY_URL="创建密钥:\033[32;4mhttps://login.tailscale.com/admin/settings/keys\033[0m"
|
||||
GW_TS_ALLOW_URL="访问非本机目标需允许通告:\033[32;4mhttps://login.tailscale.com\033[0m"
|
||||
GW_TS_SUBNET_EXIT_HINT="访问非本机目标需在终端设置使用Subnet或EXIT-NODE模式"
|
||||
GW_TS_TOGGLE="启用/关闭Tailscale服务"
|
||||
GW_TS_SET_AUTHKEY="设置密钥(Auth Key)"
|
||||
GW_TS_SUBNET="通告路由内网地址(Subnet)"
|
||||
GW_TS_EXIT_NODE="通告路由全部流量(EXIT-NODE)"
|
||||
GW_TS_HOSTNAME="设置设备名称(可选)"
|
||||
GW_TS_SET_KEY_FIRST="请先设置密钥!"
|
||||
GW_TS_INPUT_KEY="请输入密钥(输入0删除)"
|
||||
GW_TS_EXITNODE_WARN="目前exitnode的官方DNS有bug,要么启用域名嗅探并禁用TailscaleDNS,\n要么必须在网页设置Globalname servers为分配的本设备子网IP且启用override"
|
||||
GW_TS_INPUT_NAME="请直接输入希望在Tailscale显示的设备名称"
|
||||
GW_WG_WARN="脚本默认内核为了节约内存没有编译WireGuard模块\n如需使用请先前往自定义内核更新完整版内核文件!"
|
||||
GW_WG_TOGGLE="启用/关闭Wireguard服务"
|
||||
GW_WG_SET_ENDPOINT="设置Endpoint地址:"
|
||||
GW_WG_SET_ENDPOINT_PORT="设置Endpoint端口:"
|
||||
GW_WG_SET_PUBLIC="设置公钥-PublicKey:"
|
||||
GW_WG_SET_PRESHARED="设置密钥-PresharedKey:"
|
||||
GW_WG_SET_PRIVATE="设置私钥-PrivateKey:"
|
||||
GW_WG_SET_IPV4="设置组网IPV4地址:"
|
||||
GW_WG_SET_IPV6="可选 组网IPV6地址:"
|
||||
GW_INPUT_TEXT_DEL0="请输入相应内容(回车或0删除)"
|
||||
GW_INPUT_PLAIN="请输入"
|
||||
GW_INPUT_PWD_DEL0="请输入密钥(输入0删除)"
|
||||
|
||||
@@ -9,3 +9,148 @@ TOOLS_SSH_DISABLED="已禁止外网访问SSH!"
|
||||
TOOLS_DISABLE="禁用"
|
||||
TOOLS_ENABLE="启用"
|
||||
TOOLS_CONFIGURED="已配置"
|
||||
TOOLS_SSH_ONLY_OPENWRT="此功能仅针对使用Openwrt系统的设备生效,且不依赖服务"
|
||||
TOOLS_SSH_UNSUPPORTED_SYSTEM="本功能不支持红米AX6S等镜像化系统设备,请勿尝试!"
|
||||
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_PREFIX="3) "
|
||||
TOOLS_SSH_TOGGLE_ITEM_SUFFIX="外网访问SSH"
|
||||
TOOLS_PROMPT_PORT="请输入端口号(1000-65535)> "
|
||||
TOOLS_WARN_COMPAT="本页工具可能无法兼容全部Linux设备,请酌情使用!"
|
||||
TOOLS_DISK_USAGE="磁盘占用/所在目录:"
|
||||
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_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="文件下载失败!"
|
||||
TOOLS_DISABLE_FIX_CONFIRM="是否禁用此功能并移除相关补丁?"
|
||||
TOOLS_YES="1) 是"
|
||||
TOOLS_NO_BACK="0) 否,返回上级菜单"
|
||||
TOOLS_NO="0) 否"
|
||||
TOOLS_SELECT_PROMPT="请输入对应标号> "
|
||||
TOOLS_PATCH_REMOVED="补丁文件已移除,请立即重启设备以防止出错!"
|
||||
TOOLS_TUN_WARN1="本功能需要修改系统文件,不保证没有任何风险!"
|
||||
TOOLS_TUN_WARN2="本功能采集的Tun模块并不一定适用于你的设备!"
|
||||
TOOLS_ACCEPT_RISK="1) 我已知晓,出现问题会自行承担!"
|
||||
TOOLS_TUN_CONNECTING="正在连接服务器获取Tun模块补丁文件......"
|
||||
TOOLS_TUN_OK="设置成功!请重启服务!"
|
||||
TOOLS_TUN_FAIL="文件下载失败,请重试!"
|
||||
TOOLS_DEVICE_NOT_NEED="当前设备无需设置,请勿尝试!"
|
||||
TOOLS_AUTO_SSH_WARN1="本功能使用软件命令进行固化不保证100%成功!"
|
||||
TOOLS_AUTO_SSH_WARN2="如有问题请加群反馈:"
|
||||
TOOLS_AUTO_SSH_PWD_HINT1="请输入需要还原的SSH密码(不影响当前密码)"
|
||||
TOOLS_AUTO_SSH_PWD_HINT2="(回车可跳过)"
|
||||
TOOLS_AUTO_SSH_INPUT="请输入> "
|
||||
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_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日志推送?"
|
||||
TOOLS_CONFIRM_CLOSE_BARK="是否确认关闭Bark日志推送?"
|
||||
TOOLS_CONFIRM_CLOSE_PO="是否确认关闭Pushover日志推送?"
|
||||
TOOLS_CONFIRM_CLOSE_PP="是否确认关闭PushPlus日志推送?"
|
||||
TOOLS_CONFIRM_CLOSE_SYNO="是否确认关闭SynoChat日志推送?"
|
||||
TOOLS_CONFIRM_CLOSE_GOTIFY="是否确认关闭Gotify日志推送?"
|
||||
TOOLS_BOT_PUBLIC="1) 使用公共机器人\t——不依赖内核服务"
|
||||
TOOLS_BOT_PRIVATE="2) 使用私人机器人\t——需要额外申请"
|
||||
TOOLS_PUSHDEER_SELECT_SERVER="请选择PushDeer服务器类型:"
|
||||
TOOLS_PUSHDEER_OFFICIAL="1) 官方服务器(api2.pushdeer.com)"
|
||||
TOOLS_PUSHDEER_CUSTOM="2) 自建服务器"
|
||||
TOOLS_PUSHDEER_CUSTOM_URL_HINT="请输入自建PushDeer服务器地址(不含/message/push)"
|
||||
TOOLS_PUSHDEER_CUSTOM_URL_EXAMPLE="例如:\033[36mhttps://push.example.com\033[0m"
|
||||
TOOLS_PUSHDEER_CUSTOM_URL_INPUT="请直接输入服务器地址"
|
||||
TOOLS_OR_BACK="或输入 0 返回上级菜单"
|
||||
TOOLS_PUSHDEER_INSTALL1="1. 请先前往 \033[32;4mhttp://www.pushdeer.com/official.html\033[0m 扫码安装快应用或下载APP"
|
||||
TOOLS_PUSHDEER_INSTALL2="2. 打开快应用/APP,并完成登陆"
|
||||
TOOLS_PUSHDEER_INSTALL3="3. \033[33m切换到「设备」标签页,点击右上角的加号,注册当前设备\033[0m"
|
||||
TOOLS_PUSHDEER_INSTALL4="4. \033[36m切换到「秘钥」标签页,点击右上角的加号,创建一个秘钥,并复制\033[0m"
|
||||
TOOLS_PUSHDEER_SECRET_HINT="请直接输入你复制的秘钥"
|
||||
TOOLS_PUSHDEER_OK="已完成PushDeer日志推送设置!"
|
||||
TOOLS_BARK_WARN="Bark推送仅支持IOS系统,其他平台请使用其他推送方式!"
|
||||
TOOLS_BARK_INSTALL="请安装Bark-IOS客户端,并在客户端中找到专属推送链接"
|
||||
TOOLS_BARK_URL_HINT="请直接输入你的Bark推送链接"
|
||||
TOOLS_BARK_OK="已完成Bark日志推送设置!"
|
||||
TOOLS_PUSHOVER_REG="请先通过 \033[32;4mhttps://pushover.net/\033[0m 注册账号并获取\033[36mUser Key\033[0m"
|
||||
TOOLS_PUSHOVER_USERKEY_HINT="请直接请输入你的User Key"
|
||||
TOOLS_PUSHOVER_VERIFY="请检查注册邮箱,完成账户验证"
|
||||
TOOLS_PUSHOVER_VERIFIED="我已经验证完成"
|
||||
TOOLS_PUSHOVER_VERIFY_PROMPT="我已经验证完成(1/0)> "
|
||||
TOOLS_PUSHOVER_TOKEN_BUILD="请通过 \033[32;4mhttps://pushover.net/apps/build\033[0m 生成\033[36mAPI Token\033[0m"
|
||||
TOOLS_PUSHOVER_TOKEN_HINT="请输入你的API Token"
|
||||
TOOLS_PUSHOVER_OK="已完成Passover日志推送设置!"
|
||||
TOOLS_PUSHPLUS_REG="请先通过 \033[32;4mhttps://www.pushplus.plus/push1.html\033[0m 注册账号并获取\033[36mtoken\033[0m"
|
||||
TOOLS_PUSHPLUS_TOKEN_HINT="请直接输入你的token"
|
||||
TOOLS_PUSHPLUS_OK="已完成PushPlus日志推送设置!"
|
||||
TOOLS_SYNOCHAT_URL_HINT="请输入你的Synology DSM主页地址"
|
||||
TOOLS_SYNOCHAT_TOKEN_HINT="请输入你的Synology Chat Token"
|
||||
TOOLS_SYNOCHAT_USERID_HINT="请通过\"你的群晖地址/webapi/entry.cgi?api=SYNO.Chat.External&method=user_list&version=2&token=你的TOKEN\"获取user_id"
|
||||
TOOLS_SYNOCHAT_USERID_INPUT="请输入你的user_id> "
|
||||
TOOLS_SYNOCHAT_OK="已完成SynoChat日志推送设置!"
|
||||
TOOLS_GOTIFY_REG="请先通过Gotify服务器获取推送URL"
|
||||
TOOLS_GOTIFY_FORMAT="格式示例: https://gotify.example.com/message?token=你的应用令牌"
|
||||
TOOLS_GOTIFY_URL_HINT="请直接你的Gotify推送URL"
|
||||
TOOLS_LOG_NOT_FOUND="未找到相关日志!"
|
||||
TOOLS_DEVICE_NAME_HINT="请直接输入本设备自定义推送名称"
|
||||
TOOLS_DEVICE_NAME_BACK="或直接回车确认返回上级菜单"
|
||||
TOOLS_LOG_CLEARED="运行日志及任务日志均已清空!"
|
||||
TOOLS_TEST_MENU_TITLE="这里是测试命令菜单"
|
||||
TOOLS_TEST_MENU_HINT="如遇问题尽量运行相应命令后截图提交issue或TG讨论组"
|
||||
TOOLS_TEST_ITEM_1="1) Debug模式运行内核"
|
||||
TOOLS_TEST_ITEM_2="2) 查看系统DNS端口(:53)占用 "
|
||||
TOOLS_TEST_ITEM_3="3) 测试ssl加密(aes-128-gcm)跑分"
|
||||
TOOLS_TEST_ITEM_4="4) 查看ShellCrash相关路由规则"
|
||||
TOOLS_TEST_ITEM_5="5) 查看内核配置文件前40行"
|
||||
TOOLS_TEST_ITEM_6="6) 测试代理服务器连通性(google.tw)"
|
||||
TOOLS_NETSTAT_HINT="可以使用\033[44m netstat -ntulp |grep xxx \033[0m来查询任意(xxx)端口"
|
||||
TOOLS_FW_TITLE="----------------本机防火墙---------------------"
|
||||
TOOLS_PROXY_NOTE="注意:依赖curl(不支持wget),且测试结果不保证一定准确!"
|
||||
TOOLS_PROXY_OK="连接成功!响应时间为:"
|
||||
TOOLS_PROXY_TIMEOUT="连接超时!请重试或检查节点配置!"
|
||||
TOOLS_DEBUG_WARN1="注意:Debug运行均会停止原本的内核服务"
|
||||
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_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_PREFIX="6) 后台运行完整启动流程并配置防火墙劫持,且将错误日志打印到闪存:"
|
||||
TOOLS_DEBUG_ITEM_6_SUFFIX=""
|
||||
TOOLS_DEBUG_ITEM_8="8) 后台运行完整启动流程,输出执行错误并查找上下文,之后关闭进程"
|
||||
TOOLS_DEBUG_ITEM_9_PREFIX="9) 将"
|
||||
TOOLS_DEBUG_ITEM_9_SUFFIX="下json文件合并为"
|
||||
TOOLS_FLASH_WARN="频繁写入闪存会导致闪存寿命降低,如非遇到会导致设备死机或重启的bug,请勿使用此功能!"
|
||||
TOOLS_FLASH_CONFIRM="是否确认启用此功能?"
|
||||
TOOLS_MERGE_OK="合并成功!"
|
||||
|
||||
@@ -47,3 +47,249 @@ UPG_CORE_SWITCH_WARN="二者Geo数据库及yaml/json配置文件不通用"
|
||||
UPG_CORE_SWITCH_KEEP="是否保留相关数据库文件?"
|
||||
UPG_KEEP="保留"
|
||||
UPG_NOT_KEEP="不保留"
|
||||
UPG_PAC_LINK_TEXT="PAC配置链接为:"
|
||||
UPG_PAC_GUIDE_TEXT="PAC的使用教程请参考:"
|
||||
UPG_THANKS_PROJECTS="感谢以下项目及其开发者们的无私奉献!"
|
||||
UPG_THANKS_SPECIAL_TEXT="特别感谢:\033[36m所有帮助及赞助过此项目的同仁们!\033[0m"
|
||||
UPG_GETTING_UPDATE="正在检查更新......"
|
||||
UPG_SCRIPT_CUR_VER_TEXT="当前脚本版本为:"
|
||||
UPG_SCRIPT_NEW_VER_TEXT="最新脚本版本为:"
|
||||
UPG_UPDATE_NOW_TEXT="立即更新"
|
||||
UPG_CPUCORE_HINT1_TEXT="仅适合脚本无法正确识别核心或核心无法正常运行时使用!"
|
||||
UPG_CPUCORE_HINT2_TEXT="不知道如何获取核心版本?"
|
||||
UPG_CPUCORE_HINT3_TEXT="请参考:"
|
||||
UPG_CPUCORE_LIST_TEXT="当前可供在线下载的处理器架构为:"
|
||||
UPG_CORETYPE_CONFIRM_TEXT="请确认该自定义内核的类型:"
|
||||
UPG_CORE_SWITCH_KEEP_TEXT="是否保留相关数据库文件?"
|
||||
UPG_KEEP_TEXT="保留"
|
||||
UPG_NOT_KEEP_TEXT="不保留"
|
||||
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版本"
|
||||
UPG_CORE_LINK_TEXT="正在获取内核文件链接......"
|
||||
UPG_CORE_INFO_TITLE="内核版本:"
|
||||
UPG_CORE_INFO_TIME1="发布时间:"
|
||||
UPG_CORE_INFO_TIME2="更新时间:"
|
||||
UPG_CORE_INFO_SELECT="请确认内核信息并选择:"
|
||||
UPG_CORE_NOT_FOUND="找不到可用内核,可能是开发者没有编译相关CPU架构版本的内核文件!"
|
||||
UPG_CORE_CHECK_FAIL_HINT="查找失败,请尽量在服务启动后再使用本功能!"
|
||||
UPG_CUSTOM_CORE_SOURCE="此处内核通常源自互联网采集,此处致谢各位开发者!"
|
||||
UPG_CUSTOM_CORE_WARN="自定义内核未经过完整适配,使用出现问题请自行解决!"
|
||||
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_ZIPTYPE_TITLE="请选择内核分支及压缩方式:"
|
||||
UPG_ZIPTYPE_1="1) \033[36m最简编译release版本,upx压缩\033[0m"
|
||||
UPG_ZIPTYPE_1_HINT="不支持Gvisor、Tailscale、Wireguard、NaiveProxy"
|
||||
UPG_ZIPTYPE_2="2) \033[32m标准编译release版本,tar.gz压缩\033[0m"
|
||||
UPG_ZIPTYPE_2_HINT="完整支持脚本全部内置功能"
|
||||
UPG_ZIPTYPE_3="3) \033[33m完整编译alpha版本,gz压缩\033[0m"
|
||||
UPG_ZIPTYPE_3_HINT="占用可能略高,稳定性自测"
|
||||
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_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_OK_PREFIX=""
|
||||
UPG_GEO_OK_SUFFIX="数据库文件下载成功!"
|
||||
UPG_GEO_LINKING="正在获取数据库文件......"
|
||||
UPG_GEO_FINDING="正在查找可更新的数据库文件......"
|
||||
UPG_GEO_SELECT="请选择需要更新的数据库文件:"
|
||||
UPG_GEO_NO_RESULT="查找失败,请尽量在服务启动后再使用本功能!"
|
||||
UPG_GEO_CUSTOM_HINT="此处数据库均源自互联网采集,此处致谢各位开发者!"
|
||||
UPG_GEO_CUSTOM_HINT2="请点击或复制链接前往项目页面查看具体说明!"
|
||||
UPG_GEO_CUSTOM_HINT3="自定义数据库不支持定时任务及小闪存模式!"
|
||||
UPG_GEO_CUSTOM_HINT4="如遇到网络错误请先启动ShellCrash服务!"
|
||||
UPG_GEO_SOURCE_SELECT="请选择需要更新的数据库项目来源:"
|
||||
UPG_GEO_LOCAL_ONLY1="(仅限Clash/Mihomo)"
|
||||
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_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_OK="面板安装成功!"
|
||||
UPG_DB_REFRESH_HINT="如未生效,请使用【Ctrl+F5】强制刷新浏览器!"
|
||||
UPG_DB_INSTALLED="检测到已经安装过本地面板"
|
||||
UPG_DB_UPGRADE="升级/覆盖安装"
|
||||
UPG_DB_CANCEL="安装已取消"
|
||||
UPG_DB_DIR_SELECT="请选择面板安装目录:"
|
||||
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="打开管理面板的速度更快且更稳定"
|
||||
UPG_DB_SELECT="请选择面板安装类型:"
|
||||
UPG_DB_WIP=" - - - - - - -维护中- - - - - - -"
|
||||
UPG_DB_OLD=" - - - - - -已停止维护- - - - - -"
|
||||
UPG_DB_INSTALL_1="1) 安装\033[32mzashboard面板\033[0m(约2.2mb)"
|
||||
UPG_DB_INSTALL_2="2) 安装\033[32mMetaXD面板\033[0m(约1.5mb)"
|
||||
UPG_DB_INSTALL_3="3) 安装\033[32mYacd-Meta魔改面板\033[0m(约1.7mb)"
|
||||
UPG_DB_INSTALL_4="4) 安装\033[32m基础面板\033[0m(约500kb)"
|
||||
UPG_DB_INSTALL_5="5) 安装\033[32mMeta基础面板\033[0m(约800kb)"
|
||||
UPG_DB_INSTALL_6="6) 安装\033[32mYacd面板\033[0m(约1.1mb)"
|
||||
UPG_DB_UNINSTALL="9) \033[31m卸载本地面板\033[0m"
|
||||
UPG_DB_UNINSTALL_CONFIRM="是否卸载本地面板?"
|
||||
UPG_DB_UNINSTALL_YES="1) 确认卸载"
|
||||
UPG_DB_UNINSTALL_OK="面板已经卸载!"
|
||||
UPG_CRT_DB_OK="证书安装成功!"
|
||||
UPG_CRT_TITLE1="安装/更新本地根证书文件(ca-certificates.crt)"
|
||||
UPG_CRT_TITLE2="用于解决证书校验错误,x509报错等问题"
|
||||
UPG_CRT_TITLE3="无上述问题的设备请勿使用!"
|
||||
UPG_CRT_EXISTS="检测到系统已经存在根证书文件:"
|
||||
UPG_CRT_UPDATE="1) 覆盖更新"
|
||||
UPG_CRT_INSTALL="1) 立即安装"
|
||||
UPG_CRT_BACK="0) 返回上级菜单"
|
||||
UPG_CRT_WARN="设备可能尚未安装openssl,无法安装证书文件!"
|
||||
UPG_SOURCE_CUR="当前版本:"
|
||||
UPG_SOURCE_CUR2="当前源:"
|
||||
UPG_SOURCE_TITLE="切换ShellCrash版本及更新源地址"
|
||||
UPG_SOURCE_SWITCH_STABLE="a) 切换至\033[32m稳定版-stable\033[0m"
|
||||
UPG_SOURCE_SWITCH_MASTER="b) 切换至\033[36m公测版-master\033[0m"
|
||||
UPG_SOURCE_SWITCH_DEV="c) 切换至\033[33m开发版-dev\033[0m"
|
||||
UPG_SOURCE_CUSTOM="d) 自定义源地址(用于本地源或自建源)"
|
||||
UPG_SOURCE_ROLLBACK="e) \033[31m版本回退\033[0m"
|
||||
UPG_SOURCE_DEV_WARN1="开发版未经过妥善测试,可能依然存在大量bug!!!"
|
||||
UPG_SOURCE_DEV_WARN2="如果你没有足够的耐心或者测试经验,切勿使用此版本!"
|
||||
UPG_SOURCE_DEV_WARN3="请务必加入我们的讨论组:\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
UPG_SOURCE_DEV_CONFIRM="是否依然切换到开发版?"
|
||||
UPG_SOURCE_DEV_YES="1) 确认切换"
|
||||
UPG_SOURCE_CUSTOM_HINT="请直接输入个人源路径"
|
||||
UPG_SOURCE_CUSTOM_HINT2="或者输入 0 返回上级菜单"
|
||||
UPG_SOURCE_CUSTOM_INPUT="请输入个人源路径> "
|
||||
UPG_SOURCE_VER_GETTING="正在获取版本信息......"
|
||||
UPG_SOURCE_VER_OK="获取版本信息成功"
|
||||
UPG_SOURCE_ROLLBACK_SELECT="请选择想要回退至的具体版本:"
|
||||
UPG_SOURCE_ROLLBACK_FAIL="版本回退信息获取失败,请尝试更换其他安装源!"
|
||||
UPG_SOURCE_ROLLBACK_NOTSUP="当前源不支持版本回退"
|
||||
UPG_SOURCE_ROLLBACK_HINT="请尝试更换其他安装源!"
|
||||
UPG_THANKS_ITEM_CLASH="Clash 开发:Dreamacro"
|
||||
UPG_THANKS_ITEM_SINGBOX="sing-box 开发:SagerNet"
|
||||
UPG_THANKS_ITEM_SINGBOX_URL="项目地址:https://github.com/SagerNet/sing-box"
|
||||
UPG_THANKS_ITEM_METACUBE="MetaCubeX 开发:MetaCubeX"
|
||||
UPG_THANKS_ITEM_METACUBE_URL="项目地址:https://github.com/MetaCubeX"
|
||||
UPG_THANKS_ITEM_YACD="YACD面板 开发:haishanh"
|
||||
UPG_THANKS_ITEM_YACD_URL="项目地址:https://github.com/haishanh/yacd"
|
||||
UPG_THANKS_ITEM_ZASH="Zashboard 开发:Zephyruso"
|
||||
UPG_THANKS_ITEM_ZASH_URL="项目地址:https://github.com/Zephyruso/zashboard"
|
||||
UPG_THANKS_ITEM_SUB="Subconverter 开发:tindy2013"
|
||||
UPG_THANKS_ITEM_SUB_URL="项目地址:https://github.com/tindy2013/subconverter"
|
||||
UPG_THANKS_ITEM_REF1ND="sing-box-reF1nd 开发:reF1nd"
|
||||
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_NOTE1="不支持Gvisor、Tailscale、Wireguard、NaiveProxy"
|
||||
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_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_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_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="正在查找可更新的数据库文件......"
|
||||
UPG_GEO_SOURCE_TITLE="请选择需要更新的数据库项目来源:"
|
||||
UPG_GEO_LINK_HINT="请输入自定义数据库的链接地址> "
|
||||
UPG_GEO_CHOOSE_HINT="注意:Mihomo内核和SingBox内核的数据库文件不通用"
|
||||
UPG_GEO_LATEST="在线数据库最新版本(每日同步上游):"
|
||||
UPG_GEO_CHOOSE="请选择需要更新的Geo数据库文件:"
|
||||
UPG_GEO_ITEM1="1) CN-IP绕过文件(约0.1mb)"
|
||||
UPG_GEO_ITEM2="2) CN-IPV6绕过文件(约30kb)"
|
||||
UPG_GEO_ITEM3="3) Mihomo精简版GeoIP_cn数据库(约0.1mb)"
|
||||
UPG_GEO_ITEM4="4) Mihomo完整版GeoSite数据库(约5mb)"
|
||||
UPG_GEO_ITEM5="5) Mihomo-mrs数据库常用包(约1mb,非必要勿用)"
|
||||
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_PREFIX="这将清理"
|
||||
UPG_GEO_CLEAN_WARN_SUFFIX="目录及/ruleset目录下所有数据库文件!"
|
||||
UPG_GEO_CLEAN_WARN2="清理后启动服务即可自动下载所需文件"
|
||||
UPG_GEO_CLEANED="所有数据库文件均已清理!"
|
||||
UPG_DB_CONNECTING="正在连接服务器获取安装文件......"
|
||||
UPG_DB_INSTALLED_HINT="检测到已经安装过本地面板"
|
||||
UPG_DB_INSTALL_CANCEL="安装已取消"
|
||||
UPG_DB_DIR_TITLE="请选择面板安装目录:"
|
||||
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="打开管理面板的速度更快且更稳定"
|
||||
UPG_DB_INSTALL_SELECT="请选择面板安装类型:"
|
||||
UPG_DB_INSTALL_MID=" - - - - - - -维护中- - - - - - -"
|
||||
UPG_DB_INSTALL_END=" - - - - - -已停止维护- - - - - -"
|
||||
UPG_DB_INSTALL_4_TEXT="4) 安装\033[32m基础面板\033[0m(约500kb)"
|
||||
UPG_DB_INSTALL_5_TEXT="5) 安装\033[32mMeta基础面板\033[0m(约800kb)"
|
||||
UPG_DB_INSTALL_6_TEXT="6) 安装\033[32mYacd面板\033[0m(约1.1mb)"
|
||||
UPG_DB_UNINSTALL_PROMPT="是否卸载本地面板?"
|
||||
UPG_DB_UNINSTALL_CONFIRM_TEXT="1) 确认卸载"
|
||||
UPG_DB_UNINSTALLED="面板已经卸载!"
|
||||
UPG_CRT_CONNECTING="正在连接服务器获取安装文件......"
|
||||
UPG_CRT_INSTALL_TITLE1="安装/更新本地根证书文件(ca-certificates.crt)"
|
||||
UPG_CRT_INSTALL_TITLE2="用于解决证书校验错误,x509报错等问题"
|
||||
UPG_CRT_INSTALL_TITLE3="无上述问题的设备请勿使用!"
|
||||
UPG_CRT_EXIST_HINT="检测到系统已经存在根证书文件:"
|
||||
UPG_CRT_OVERWRITE="1) 覆盖更新"
|
||||
UPG_CRT_NOW="1) 立即安装"
|
||||
UPG_CRT_NOT_USE="设备可能尚未安装openssl,无法安装证书文件!"
|
||||
UPG_SOURCE_TITLE2="切换ShellCrash版本及更新源地址"
|
||||
UPG_SOURCE_CUR_VER="当前版本:"
|
||||
UPG_SOURCE_CUR_URL="当前源:"
|
||||
UPG_SOURCE_STABLE_TEXT="稳定版"
|
||||
UPG_SOURCE_MASTER_TEXT="公测版"
|
||||
UPG_SOURCE_DEV_TEXT="开发版"
|
||||
UPG_SOURCE_DEV_WARN4="开发版未经过妥善测试,可能依然存在大量bug!!!"
|
||||
UPG_SOURCE_DEV_WARN5="如果你没有足够的耐心或者测试经验,切勿使用此版本!"
|
||||
UPG_SOURCE_DEV_WARN6="请务必加入我们的讨论组:\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
UPG_SOURCE_DEV_ASK="是否依然切换到开发版?"
|
||||
UPG_SOURCE_DEV_CONFIRM_TEXT="1) 确认切换"
|
||||
UPG_SOURCE_PATH_HINT="请直接输入个人源路径"
|
||||
UPG_SOURCE_PATH_HINT2="或者输入 0 返回上级菜单"
|
||||
UPG_SOURCE_PATH_INPUT="请输入个人源路径> "
|
||||
UPG_SOURCE_GETTING_VER="正在获取版本信息......"
|
||||
UPG_SOURCE_GET_VER_OK="获取版本信息成功"
|
||||
UPG_SOURCE_ROLLBACK_SELECT_TEXT="请选择想要回退至的具体版本:"
|
||||
UPG_SOURCE_ROLLBACK_FAIL_TEXT="版本回退信息获取失败,请尝试更换其他安装源!"
|
||||
UPG_SOURCE_ROLLBACK_NOTSUP_TEXT="当前源不支持版本回退"
|
||||
UPG_SOURCE_ROLLBACK_HINT_TEXT="请尝试更换其他安装源!"
|
||||
UPG_SOURCE_SWITCH_OK="源地址切换成功!"
|
||||
UPG_GEO_TYPE_LITE="精简版"
|
||||
UPG_GEO_TYPE_FULL="全球版"
|
||||
UPG_SOURCE_UNSET="未指定"
|
||||
UPG_SOURCE_ROLLBACK_TAG="(回退)"
|
||||
|
||||
@@ -51,17 +51,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地址"
|
||||
|
||||
91
scripts/lang/chs/fw_filter.lang
Normal file
91
scripts/lang/chs/fw_filter.lang
Normal file
@@ -0,0 +1,91 @@
|
||||
FWF_TITLE="流量过滤"
|
||||
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"
|
||||
FWF_SWITCH_STOP="切换时将停止服务,是否继续:"
|
||||
FWF_YES="1) 是"
|
||||
FWF_NO_BACK="0) 否,返回上级菜单"
|
||||
FWF_QUIC_OFF="已禁止QUIC流量通过ShellCrash内核!"
|
||||
FWF_QUIC_ON="已取消禁止QUIC协议流量!"
|
||||
FWF_CNIP_ON="已开启CN_IP绕过内核功能!"
|
||||
FWF_CNIP_WARN="注意:此功能会导致全局模式及一切CN相关规则失效!"
|
||||
FWF_CNIP_OFF="已禁用CN_IP绕过内核功能!"
|
||||
FWF_NO_IPSET="当前设备缺少ipset模块或未使用nftables模式,无法启用绕过功能!"
|
||||
FWF_WHITE_LIST="白名单"
|
||||
FWF_BLACK_LIST="黑名单"
|
||||
FWF_PASS_WORD="不"
|
||||
FWF_COMMON_NOTE="注意:\n"
|
||||
FWF_MIX_NOTE="MIX模式下,所有fake-ip来源的非常用端口流量不会被过滤"
|
||||
FWF_ALLOWED_PORTS="当前已放行端口:"
|
||||
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) 重置默认放行端口"
|
||||
FWF_PORT_MENU_5="5) 重置为旧版放行端口"
|
||||
FWF_MAX_PORT="最多支持设置放行15个端口,请先减少一些!"
|
||||
FWF_INPUT_ADD_HINT="请直接输入要放行的端口号"
|
||||
FWF_INPUT_ADD_HINT2="(每次只能输入一个端口号,切勿一次添加多个端口号)"
|
||||
FWF_INPUT_REMOVE_HINT="请直接输入要移除的端口号"
|
||||
FWF_OR_BACK="或输入 0 返回上级菜单"
|
||||
FWF_ERR_DUP="输入错误!请勿重复添加!"
|
||||
FWF_ERR_RANGE="输入错误!请输入正确的数值(1~65535)!"
|
||||
FWF_INPUT_PORT="请输入> "
|
||||
FWF_CUST_HOST_TITLE="当前默认透明路由的网段为:"
|
||||
FWF_CUST_HOST_TITLE2="当前已添加的自定义网段为:"
|
||||
FWF_CUST_HOST_MENU_1="1) 移除所有自定义网段"
|
||||
FWF_CUST_HOST_MENU_2="2) 使用自定义网段覆盖默认网段"
|
||||
FWF_CUST_HOST_HINT="请输入对应的序号或需要额外添加的网段> "
|
||||
FWF_NET_ERR="请输入正确的网段地址!"
|
||||
FWF_RESERVE_NOTE="注意:地址必须是空格分隔,错误的设置可能导致网络回环或启动报错,请务必谨慎!"
|
||||
FWF_RESERVE_NOW="当前网段:"
|
||||
FWF_RESERVE_INPUT_HINT="请直接输入自定义保留地址ipv4网段"
|
||||
FWF_RESERVE_INPUT_HINT2="或输入 1 重置默认网段"
|
||||
FWF_RESERVE_INPUT_HINT3="或输入 0 返回上级菜单"
|
||||
FWF_RESERVE_PROMPT="请输入> "
|
||||
FWF_RESERVE_SET="已将保留地址网段设为:"
|
||||
FWF_RESERVE_ERR="输入有误,请重新输入!"
|
||||
FWF_LAN_NO_DEVICE="未知设备"
|
||||
FWF_MAC_HINT="手动输入mac地址时仅支持\033[32mxx:xx:xx:xx:xx:xx\033[0m的形式"
|
||||
FWF_MAC_EXISTED="已添加的mac地址:"
|
||||
FWF_NONE_MAC="暫未添加任何mac地址"
|
||||
FWF_MAC_HEADER="序号 \033[33m设备IP 设备mac地址 设备名称\033[0m"
|
||||
FWF_MAC_NONE="无纪录"
|
||||
FWF_MAC_INPUT_HINT="请输入对应序号或直接输入mac地址> "
|
||||
FWF_MAC_DUP="已添加的设备,请勿重复添加!"
|
||||
FWF_IP_HINT="手动输入时仅支持 \033[32m192.168.1.0/24\033[0m 或 \033[32m192.168.1.0\033[0m 的形式"
|
||||
FWF_IP_HINT2="不支持ipv6地址过滤,可能导致过滤失败,建议使用mac地址过滤"
|
||||
FWF_IP_EXISTED="已添加的IP地址(段):"
|
||||
FWF_NONE_IP="暫未添加任何IP地址(段)"
|
||||
FWF_IP_HEADER="\033[33m序号 设备IP 设备名称\033[32m"
|
||||
FWF_IP_INPUT_HINT="请输入对应序号或直接输入IP地址段> "
|
||||
FWF_IP_DUP="已添加的地址,请勿重复添加!"
|
||||
FWF_REMOVE_NONE="列表中没有需要移除的设备!"
|
||||
FWF_REMOVE_TITLE="请选择需要移除的设备:"
|
||||
FWF_REMOVE_HEADER=" \033[32m设备IP \033[36m设备mac地址 \033[35m设备名称\033[0m"
|
||||
FWF_REMOVE_OK="对应设备已移除!"
|
||||
FWF_FILTER_MENU_TITLE="请在此添加或移除设备"
|
||||
FWF_FILTER_MODE="当前过滤方式为:"
|
||||
FWF_FILTER_ONLY="仅列表内设备流量"
|
||||
FWF_FILTER_MODE_SUFFIX="模式"
|
||||
FWF_FILTER_PASS="经过"
|
||||
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_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"
|
||||
FWF_FILTER_CLEAR="9) \033[31m清空整个列表\033[0m"
|
||||
FWF_SWITCH_OK="已切换成功!"
|
||||
FWF_LIST_CLEARED="设备列表已清空!"
|
||||
@@ -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="是否立即加载为配置文件?"
|
||||
|
||||
93
scripts/lang/chs/override.lang
Normal file
93
scripts/lang/chs/override.lang
Normal file
@@ -0,0 +1,93 @@
|
||||
OVR_TITLE="配置文件覆写"
|
||||
OVR_MENU_2="2) 管理\033[36m自定义规则\033[0m"
|
||||
OVR_MENU_3="3) 管理\033[33m自定义节点\033[0m"
|
||||
OVR_MENU_4="4) 管理\033[36m自定义策略组\033[0m"
|
||||
OVR_MENU_5="5) \033[32m自定义\033[0m高级功能"
|
||||
OVR_MENU_9="9) \033[33m禁用\033[0m配置文件覆写"
|
||||
OVR_BACK="0) 返回上级菜单"
|
||||
OVR_INPUT_NUM="请输入对应数字> "
|
||||
OVR_PROMPT="请输入> "
|
||||
OVR_GROUPS_CHOOSE_TYPE="请选择策略组的类型:"
|
||||
OVR_GROUP_TYPE_CN="手动选择 自动选择 故障转移 负载均衡"
|
||||
OVR_WARN_1="此功能可能会导致严重问题!启用后脚本中大部分功能都将禁用!!!"
|
||||
OVR_WARN_2_PREFIX="如果你不是非常了解"
|
||||
OVR_WARN_2_SUFFIX="的运行机制,切勿开启!"
|
||||
OVR_WARN_3="继续后如出现任何问题,请务必自行解决,一切提问恕不受理!"
|
||||
OVR_WARN_CONFIRM="1) 我确认遇到问题可以自行解决"
|
||||
OVR_CONFIRM_YES="1) 是"
|
||||
OVR_CONFIRM_NO="0) 否,返回上级菜单"
|
||||
OVR_RULES_TITLE="自定义规则"
|
||||
OVR_RULES_MENU_HINT="你可以在这里快捷管理自定义规则"
|
||||
OVR_RULES_MANUAL="如需批量操作,请手动编辑:\033[36m $YAMLSDIR/rules.yaml\033[0m"
|
||||
OVR_RULES_SHARED="singbox和clash共用此处规则,可无缝切换!"
|
||||
OVR_RULES_WARN="大量规则请尽量使用rule-set功能添加,\n\033[31m此处过量添加可能导致启动卡顿!\033[0m"
|
||||
OVR_RULES_ADD="1) 新增自定义规则"
|
||||
OVR_RULES_DEL="2) 移除自定义规则"
|
||||
OVR_RULES_CLEAR="3) 清空规则列表"
|
||||
OVR_RULES_BYPASS="4) 配置节点绕过:"
|
||||
OVR_RULES_NO_RULES="请先添加自定义规则!"
|
||||
OVR_RULES_CLEAR_CONFIRM="是否确认清空全部自定义规则?"
|
||||
OVR_RULES_ADD_RULE="请输入规则语句,\n可以是域名、泛域名、IP网段或者其他匹配规则类型的内容"
|
||||
OVR_RULES_TYPE="请选择规则类型:"
|
||||
OVR_RULES_GROUP="请选择具体规则"
|
||||
OVR_RULES_EXIST_WARN="此处规则读取自现有配置文件,如果你后续更换配置文件时运行出错,请尝试重新添加"
|
||||
OVR_RULES_INPUT_RULE="请输入对应规则> "
|
||||
OVR_RULES_INPUT_NUM="请输入对应数字> "
|
||||
OVR_RULES_INPUT_TYPE="请输入对应数字> "
|
||||
OVR_RULES_INPUT_SELECT="请输入对应数字> "
|
||||
OVR_RULES_DEL_HINT="输入对应数字即可移除相应规则:"
|
||||
OVR_RULES_ADD_OK="添加成功!"
|
||||
OVR_RULES_BYPASS_WARN1="本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!"
|
||||
OVR_RULES_BYPASS_WARN2="请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!"
|
||||
OVR_RULES_BYPASS_PROMPT="是否启用节点绕过?"
|
||||
OVR_RULES_BYPASS_CONFIRM="是否确认清空全部自定义规则?"
|
||||
OVR_GROUPS_TITLE="自定义clash策略组"
|
||||
OVR_GROUPS_MENU_HINT="你可以在这里快捷管理自定义策略组"
|
||||
OVR_GROUPS_MANUAL="如需修改或批量操作,请手动编辑:$YAMLSDIR/proxy-groups.yaml"
|
||||
OVR_GROUPS_ADD="1) 添加自定义策略组"
|
||||
OVR_GROUPS_VIEW="2) 查看自定义策略组"
|
||||
OVR_GROUPS_CLEAR="3) 清空自定义策略组"
|
||||
OVR_GROUPS_WARN1="注意策略组名称必须和【自定义规则】或【自定义节点】功能中指定的策略组一致!"
|
||||
OVR_GROUPS_WARN2="建议先创建策略组,之后可在【自定义规则】或【自定义节点】功能中智能指定"
|
||||
OVR_GROUPS_WARN3="如需在当前策略组下添加节点,请手动编辑$YAMLSDIR/proxy-groups.yaml"
|
||||
OVR_GROUPS_INPUT_NAME="请直接输入自定义策略组名称\n(不支持纯数字且不要包含特殊字符!)"
|
||||
OVR_GROUPS_INPUT_NUM="请输入对应数字> "
|
||||
OVR_GROUPS_URL="请输入测速地址"
|
||||
OVR_GROUPS_URL_HINT="或直接回车使用默认地址:https://www.gstatic.com/generate_204"
|
||||
OVR_GROUPS_MULTI_HINT="如需添加到多个策略组,请一次性输入多个数字并用空格隔开"
|
||||
OVR_GROUPS_SKIP="0) 跳过添加"
|
||||
OVR_GROUPS_CLEAR_CONFIRM="是否确认清空全部自定义策略组?"
|
||||
OVR_GROUPS_ADD_OK="添加成功!"
|
||||
OVR_PROXIES_TITLE="自定义clash节点"
|
||||
OVR_PROXIES_MENU_HINT="你可以在这里快捷管理自定义节点"
|
||||
OVR_PROXIES_MANUAL="如需批量操作,请手动编辑:$YAMLSDIR/proxies.yaml"
|
||||
OVR_PROXIES_ADD="1) 添加自定义节点"
|
||||
OVR_PROXIES_MANAGE="2) 管理自定义节点"
|
||||
OVR_PROXIES_CLEAR="3) 清空自定义节点"
|
||||
OVR_PROXIES_BYPASS="4) 配置节点绕过:"
|
||||
OVR_PROXIES_WARN1="注意\n节点格式必须是单行、不包括括号、“name:”为开头,例如:"
|
||||
OVR_PROXIES_WARN2="更多写法请参考:\033[32mhttps://juewuy.github.io/\033[0m"
|
||||
OVR_PROXIES_INPUT="请直接输入自定义节点"
|
||||
OVR_PROXIES_BLOCK_HASH="绝对禁止包含【#】号!"
|
||||
OVR_PROXIES_ADD_HINT="请选择想要将节点添加到的策略组"
|
||||
OVR_PROXIES_MULTI_HINT="如需添加到多个策略组,请一次性输入多个数字并用空格隔开"
|
||||
OVR_PROXIES_GROUP_HINT="如需自定义策略组,请先使用【管理自定义策略组功能】添加"
|
||||
OVR_PROXIES_EXIST_HINT="输入节点对应数字可以移除对应节点"
|
||||
OVR_PROXIES_EXIST_TITLE="当前已添加的自定义节点为:"
|
||||
OVR_PROXIES_NO_PROXY="请先添加自定义节点!"
|
||||
OVR_PROXIES_CLEAR_CONFIRM="是否确认清空全部自定义节点?"
|
||||
OVR_PROXIES_BYPASS_WARN1="本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!"
|
||||
OVR_PROXIES_BYPASS_WARN2="请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!"
|
||||
OVR_PROXIES_BYPASS_PROMPT="是否确定启用节点绕过:"
|
||||
OVR_PROXIES_ADD_OK="添加成功!"
|
||||
OVR_ADV_USER_CREATED1="已经创建自定义设定文件:$YAMLSDIR/user.yaml !"
|
||||
OVR_ADV_USER_CREATED2="可用于编写自定义的DNS等功能"
|
||||
OVR_ADV_USER_CREATED3="已经创建自定义功能文件:$YAMLSDIR/others.yaml !"
|
||||
OVR_ADV_USER_CREATED4="可用于编写自定义的锚点、入站、proxy-providers、rule-set、sub-rules、script等功能"
|
||||
OVR_ADV_WIN="Windows下请使用\033[33mWinSCP软件\033[0m进行编辑!"
|
||||
OVR_ADV_MAC="MacOS下请使用\033[33mSecureFX软件\033[0m进行编辑!"
|
||||
OVR_ADV_LIN="Linux可使用\033[33mvim\033[0m进行编辑(路由设备若不显示中文请勿使用)!"
|
||||
OVR_SING_TITLE1="支持覆盖脚本设置的模块有:"
|
||||
OVR_SING_TITLE2="支持与内置功能合并(但不可冲突)的模块有:"
|
||||
OVR_SING_TITLE3="将相应json文件放入\033[33m$JSONSDIR\033[0m目录后即可在启动时自动加载"
|
||||
OVR_SING_TITLE4="使用前请务必参考配置教程:\033[32;4m https://juewuy.github.io/nWTjEpkSK \033[0m"
|
||||
@@ -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 "
|
||||
|
||||
@@ -14,3 +14,84 @@ GW_INPUT_WSPATH="Enter ws-path (0 to delete)"
|
||||
GW_INPUT_UUID="Enter UUID (0 to delete)"
|
||||
GW_INPUT_HOST="Enter your public IP (v4/v6) or domain"
|
||||
GW_SHARE_LINK_HINT="Your share link (do not share casually):"
|
||||
GW_MENU_FW_WAN="Configure WAN Firewall"
|
||||
GW_MENU_TG_BOT="Configure Telegram Control Bot"
|
||||
GW_MENU_DDNS="Configure DDNS Domain"
|
||||
GW_MENU_VMESS="Custom Public Vmess Inbound"
|
||||
GW_MENU_SHADOWSOCKS="Custom Public ShadowSocks Inbound"
|
||||
GW_MENU_TS="Configure Tailscale Intranet (Singbox only)"
|
||||
GW_MENU_WG="Configure Wireguard Client (Singbox only)"
|
||||
GW_FW_STOP_WARN="WAN firewall requires stopping the service first"
|
||||
GW_CONFIRM_CONTINUE="Continue?"
|
||||
GW_YES="Yes"
|
||||
GW_NO="No"
|
||||
GW_NO_BACK="No, back to previous menu"
|
||||
GW_FW_MANUAL_PORTS="Manual allowed ports: "
|
||||
GW_FW_AUTO_PORTS="Auto allowed ports: "
|
||||
GW_FW_DEFAULT_BLOCK="Default blocked ports: "
|
||||
GW_FW_TOGGLE="Enable/Disable WAN firewall: "
|
||||
GW_FW_ADD_PORT="Add allowed ports (can include default blocked ports)"
|
||||
GW_FW_REMOVE_PORT="Remove a specific manual port"
|
||||
GW_FW_CLEAR_PORTS="Clear all manual allowed ports"
|
||||
GW_FW_DISABLE_CONFIRM="Confirm disabling firewall?"
|
||||
GW_FW_DISABLE_RISK="This can pose a serious security risk!"
|
||||
GW_ERR_DUP_PORT="Invalid input! Do not add duplicates!"
|
||||
GW_ERR_PORT_RANGE="Invalid input! Enter a valid number (1-65535)!"
|
||||
GW_ERR_INPUT="Invalid input!"
|
||||
GW_INPUT_REMOVE_PORT="Enter the port to remove"
|
||||
GW_INPUT_0_BACK="Or enter 0 to go back"
|
||||
GW_ERR_PORT_NOT_FOUND="Please enter a port that was added!"
|
||||
GW_TG_CMD_MENU="Open ShellCrash menu"
|
||||
GW_TG_CMD_HELP="View help"
|
||||
GW_TG_WARN="Due to network conditions, this bot only runs when the service is started!"
|
||||
GW_TG_TOGGLE="Enable/Disable TG-BOT service"
|
||||
GW_TG_BIND="TG-BOT binding"
|
||||
GW_TG_MENUPUSH="Push menu on start"
|
||||
GW_TG_BIND_FIRST="Please bind TG-BOT first!"
|
||||
GW_TG_BOUND_DETECTED="Detected an existing TG push bot binding"
|
||||
GW_TG_USE_DIRECT="Use it directly?"
|
||||
GW_INBOUND_WARN_PORT="The configured port will be added to the WAN firewall and allowed automatically!"
|
||||
GW_INBOUND_WARN_BASIC="This script provides basic features only. Use custom config for more needs!"
|
||||
GW_INBOUND_WARN_ILLEGAL="Do not use it for illegal proxying. You are responsible for consequences!"
|
||||
GW_VMS_TOGGLE="Enable/Disable Vmess inbound"
|
||||
GW_SET_LISTEN_PORT="Set listen port:"
|
||||
GW_SET_WSPATH="Set WS-path (optional):"
|
||||
GW_SET_UUID="Set key-uuid:"
|
||||
GW_GEN_RANDOM_KEY="Generate random key"
|
||||
GW_SET_OBFS_HOST="Set obfs host (optional):"
|
||||
GW_GEN_SHARE_LINK="Generate share link"
|
||||
GW_FILL_REQUIRED="Please complete required settings first!"
|
||||
GW_ERR_WSPATH="Invalid path. It must start with '/'."
|
||||
GW_ERR_UUID="Invalid UUID format. Re-enter or use random generation."
|
||||
GW_INPUT_OBFS_HOST="Enter obfs host (0 to delete)"
|
||||
GW_SS_TOGGLE="Enable/Disable ShadowSocks inbound"
|
||||
GW_SS_SELECT_CIPHER="Select cipher to use:"
|
||||
GW_SS_SET_PWD="Set password:"
|
||||
GW_SS_2022_NOTE_HEADER=" - - - - - - -\033[31mNotice\033[0m- - - - - - -"
|
||||
GW_SS_2022_REQUIRE=" 2022 ciphers require a randomly generated password!"
|
||||
GW_SS_2022_PASSWORD_ONLY="2022 ciphers require a script-generated password!"
|
||||
GW_TS_WARN="The default core is built without the Tailscale module to save memory.\nPlease switch to a full custom core if you need it!"
|
||||
GW_TS_KEY_URL="Create key:\033[32;4mhttps://login.tailscale.com/admin/settings/keys\033[0m"
|
||||
GW_TS_ALLOW_URL="Allow advertised routes for non-local targets:\033[32;4mhttps://login.tailscale.com\033[0m"
|
||||
GW_TS_SUBNET_EXIT_HINT="For non-local targets, use Subnet or EXIT-NODE mode in the client"
|
||||
GW_TS_TOGGLE="Enable/Disable Tailscale service"
|
||||
GW_TS_SET_AUTHKEY="Set Auth Key"
|
||||
GW_TS_SUBNET="Advertise subnet routes"
|
||||
GW_TS_EXIT_NODE="Advertise all traffic (EXIT-NODE)"
|
||||
GW_TS_HOSTNAME="Set device name (optional)"
|
||||
GW_TS_SET_KEY_FIRST="Please set the Auth Key first!"
|
||||
GW_TS_INPUT_KEY="Enter Auth Key (0 to delete)"
|
||||
GW_TS_EXITNODE_WARN="The official exitnode DNS has a bug. Either enable domain sniffing and disable Tailscale DNS,\nor set Globalname servers to this device subnet IP in the web UI and enable override."
|
||||
GW_TS_INPUT_NAME="Enter the device name to show in Tailscale"
|
||||
GW_WG_WARN="The default core is built without the WireGuard module to save memory.\nPlease switch to a full custom core if you need it!"
|
||||
GW_WG_TOGGLE="Enable/Disable Wireguard service"
|
||||
GW_WG_SET_ENDPOINT="Set Endpoint address:"
|
||||
GW_WG_SET_ENDPOINT_PORT="Set Endpoint port:"
|
||||
GW_WG_SET_PUBLIC="Set PublicKey:"
|
||||
GW_WG_SET_PRESHARED="Set PresharedKey:"
|
||||
GW_WG_SET_PRIVATE="Set PrivateKey:"
|
||||
GW_WG_SET_IPV4="Set IPv4 address:"
|
||||
GW_WG_SET_IPV6="Optional IPv6 address:"
|
||||
GW_INPUT_TEXT_DEL0="Enter value (Enter or 0 to delete)"
|
||||
GW_INPUT_PLAIN="Enter"
|
||||
GW_INPUT_PWD_DEL0="Enter password (0 to delete)"
|
||||
|
||||
@@ -9,3 +9,148 @@ TOOLS_SSH_DISABLED="WAN SSH access disabled!"
|
||||
TOOLS_DISABLE="Disable"
|
||||
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_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_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:"
|
||||
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_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!"
|
||||
TOOLS_DISABLE_FIX_CONFIRM="Disable this feature and remove related patches?"
|
||||
TOOLS_YES="1) Yes"
|
||||
TOOLS_NO_BACK="0) No, return to previous menu"
|
||||
TOOLS_NO="0) No"
|
||||
TOOLS_SELECT_PROMPT="Please enter the number> "
|
||||
TOOLS_PATCH_REMOVED="Patch file removed. Reboot the device immediately to avoid errors!"
|
||||
TOOLS_TUN_WARN1="This feature needs to modify system files and does not guarantee zero risk!"
|
||||
TOOLS_TUN_WARN2="The collected Tun module may not suit your device!"
|
||||
TOOLS_ACCEPT_RISK="1) I understand and will take responsibility if anything goes wrong!"
|
||||
TOOLS_TUN_CONNECTING="Connecting to the server to fetch the Tun patch..."
|
||||
TOOLS_TUN_OK="Set successfully! Please restart the service!"
|
||||
TOOLS_TUN_FAIL="File download failed, please retry!"
|
||||
TOOLS_DEVICE_NOT_NEED="This device does not need this setting. Do not try it!"
|
||||
TOOLS_AUTO_SSH_WARN1="This feature hardens SSH using software commands and is not guaranteed to succeed 100%!"
|
||||
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_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_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?"
|
||||
TOOLS_CONFIRM_CLOSE_BARK="Are you sure you want to disable Bark log push?"
|
||||
TOOLS_CONFIRM_CLOSE_PO="Are you sure you want to disable Pushover log push?"
|
||||
TOOLS_CONFIRM_CLOSE_PP="Are you sure you want to disable PushPlus log push?"
|
||||
TOOLS_CONFIRM_CLOSE_SYNO="Are you sure you want to disable SynoChat log push?"
|
||||
TOOLS_CONFIRM_CLOSE_GOTIFY="Are you sure you want to disable Gotify log push?"
|
||||
TOOLS_BOT_PUBLIC="1) Use public bot\t——No kernel service required"
|
||||
TOOLS_BOT_PRIVATE="2) Use private bot\t——Requires extra application"
|
||||
TOOLS_PUSHDEER_SELECT_SERVER="Please choose the PushDeer server type:"
|
||||
TOOLS_PUSHDEER_OFFICIAL="1) Official server (api2.pushdeer.com)"
|
||||
TOOLS_PUSHDEER_CUSTOM="2) Self-hosted server"
|
||||
TOOLS_PUSHDEER_CUSTOM_URL_HINT="Please enter the self-hosted PushDeer server address (without /message/push)"
|
||||
TOOLS_PUSHDEER_CUSTOM_URL_EXAMPLE="Example: \033[36mhttps://push.example.com\033[0m"
|
||||
TOOLS_PUSHDEER_CUSTOM_URL_INPUT="Please enter the server address directly"
|
||||
TOOLS_OR_BACK="Or enter 0 to return to the previous menu"
|
||||
TOOLS_PUSHDEER_INSTALL1="1. First go to \033[32;4mhttp://www.pushdeer.com/official.html\033[0m to scan and install the quick app or download the app"
|
||||
TOOLS_PUSHDEER_INSTALL2="2. Open the quick app/app and finish logging in"
|
||||
TOOLS_PUSHDEER_INSTALL3="3. Switch to the \"Device\" tab, tap the plus in the top-right corner, and register this device"
|
||||
TOOLS_PUSHDEER_INSTALL4="4. Switch to the \"Secret\" tab, tap the plus in the top-right corner, create a secret, and copy it"
|
||||
TOOLS_PUSHDEER_SECRET_HINT="Please enter the secret you copied"
|
||||
TOOLS_PUSHDEER_OK="PushDeer log push setup completed!"
|
||||
TOOLS_BARK_WARN="Bark push only supports iOS. Use another push method on other platforms!"
|
||||
TOOLS_BARK_INSTALL="Please install the Bark iOS client and find the dedicated push link in the app"
|
||||
TOOLS_BARK_URL_HINT="Please enter your Bark push link directly"
|
||||
TOOLS_BARK_OK="Bark log push setup completed!"
|
||||
TOOLS_PUSHOVER_REG="Please register at \033[32;4mhttps://pushover.net/\033[0m and get the \033[36mUser Key\033[0m"
|
||||
TOOLS_PUSHOVER_USERKEY_HINT="Please enter your User Key directly"
|
||||
TOOLS_PUSHOVER_VERIFY="Please check your registration email and complete account verification"
|
||||
TOOLS_PUSHOVER_VERIFIED="I have completed verification"
|
||||
TOOLS_PUSHOVER_VERIFY_PROMPT="I have completed verification (1/0)> "
|
||||
TOOLS_PUSHOVER_TOKEN_BUILD="Generate an \033[36mAPI Token\033[0m at \033[32;4mhttps://pushover.net/apps/build\033[0m"
|
||||
TOOLS_PUSHOVER_TOKEN_HINT="Please enter your API Token"
|
||||
TOOLS_PUSHOVER_OK="Passover log push setup completed!"
|
||||
TOOLS_PUSHPLUS_REG="Please register at \033[32;4mhttps://www.pushplus.plus/push1.html\033[0m and get the \033[36mtoken\033[0m"
|
||||
TOOLS_PUSHPLUS_TOKEN_HINT="Please enter your token directly"
|
||||
TOOLS_PUSHPLUS_OK="PushPlus log push setup completed!"
|
||||
TOOLS_SYNOCHAT_URL_HINT="Please enter your Synology DSM home address"
|
||||
TOOLS_SYNOCHAT_TOKEN_HINT="Please enter your Synology Chat token"
|
||||
TOOLS_SYNOCHAT_USERID_HINT="Get the user_id via \"your NAS address/webapi/entry.cgi?api=SYNO.Chat.External&method=user_list&version=2&token=YOUR_TOKEN\""
|
||||
TOOLS_SYNOCHAT_USERID_INPUT="Please enter your user_id> "
|
||||
TOOLS_SYNOCHAT_OK="SynoChat log push setup completed!"
|
||||
TOOLS_GOTIFY_REG="Please obtain the push URL from your Gotify server"
|
||||
TOOLS_GOTIFY_FORMAT="Format example: https://gotify.example.com/message?token=your_app_token"
|
||||
TOOLS_GOTIFY_URL_HINT="Please enter your Gotify push URL directly"
|
||||
TOOLS_LOG_NOT_FOUND="No related log found!"
|
||||
TOOLS_DEVICE_NAME_HINT="Please enter a custom push name for this device"
|
||||
TOOLS_DEVICE_NAME_BACK="Or press Enter directly to return to the previous menu"
|
||||
TOOLS_LOG_CLEARED="Runtime logs and task logs have been cleared!"
|
||||
TOOLS_TEST_MENU_TITLE="This is the test command menu"
|
||||
TOOLS_TEST_MENU_HINT="If you encounter issues, run the relevant command and submit a screenshot to the issue or TG group"
|
||||
TOOLS_TEST_ITEM_1="1) Run the kernel in Debug mode"
|
||||
TOOLS_TEST_ITEM_2="2) Check system DNS port (:53) usage "
|
||||
TOOLS_TEST_ITEM_3="3) Test SSL encryption (aes-128-gcm) benchmark"
|
||||
TOOLS_TEST_ITEM_4="4) View ShellCrash routing rules"
|
||||
TOOLS_TEST_ITEM_5="5) View the first 40 lines of the kernel config file"
|
||||
TOOLS_TEST_ITEM_6="6) Test proxy server connectivity (google.tw)"
|
||||
TOOLS_NETSTAT_HINT="You can use \033[44m netstat -ntulp |grep xxx \033[0m to query any (xxx) port"
|
||||
TOOLS_FW_TITLE="----------------Local Firewall---------------------"
|
||||
TOOLS_PROXY_NOTE="Note: depends on curl (wget is not supported), and the test result is not guaranteed to be accurate!"
|
||||
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_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_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_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_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!"
|
||||
|
||||
@@ -47,3 +47,249 @@ UPG_CORE_SWITCH_WARN="Geo DB and yaml/json configs are not compatible between th
|
||||
UPG_CORE_SWITCH_KEEP="Keep related database files?"
|
||||
UPG_KEEP="Keep"
|
||||
UPG_NOT_KEEP="Do not keep"
|
||||
UPG_PAC_LINK_TEXT="PAC URL: "
|
||||
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_SCRIPT_CUR_VER_TEXT="Current script version: "
|
||||
UPG_SCRIPT_NEW_VER_TEXT="Latest script version: "
|
||||
UPG_UPDATE_NOW_TEXT="Update now"
|
||||
UPG_CPUCORE_HINT1_TEXT="Use only when CPU architecture detection fails or core cannot run!"
|
||||
UPG_CPUCORE_HINT2_TEXT="Not sure how to get core arch?"
|
||||
UPG_CPUCORE_HINT3_TEXT="Refer to: "
|
||||
UPG_CPUCORE_LIST_TEXT="Available online CPU architectures:"
|
||||
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_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"
|
||||
UPG_CORE_LINK_TEXT="Fetching core file links..."
|
||||
UPG_CORE_INFO_TITLE="Core version: "
|
||||
UPG_CORE_INFO_TIME1="Release time: "
|
||||
UPG_CORE_INFO_TIME2="Updated: "
|
||||
UPG_CORE_INFO_SELECT="Please confirm the core info and choose:"
|
||||
UPG_CORE_NOT_FOUND="No available core found. The developer may not have built a binary for this CPU architecture!"
|
||||
UPG_CORE_CHECK_FAIL_HINT="Search failed. Please try again after the service starts!"
|
||||
UPG_CUSTOM_CORE_SOURCE="This core is usually collected from the internet. Thanks to the developers!"
|
||||
UPG_CUSTOM_CORE_WARN="Custom cores have not been fully adapted. Please fix issues yourself if they occur!"
|
||||
UPG_CUSTOM_CORE_TASK_WARN="Custom cores support scheduled tasks but do not support low-flash mode!"
|
||||
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_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"
|
||||
UPG_ZIPTYPE_2="2) \033[32mStandard release build, tar.gz compressed\033[0m"
|
||||
UPG_ZIPTYPE_2_HINT="Fully supports all built-in script features"
|
||||
UPG_ZIPTYPE_3="3) \033[33mFull alpha build, gz compressed\033[0m"
|
||||
UPG_ZIPTYPE_3_HINT="May use a bit more space; stability is self-tested"
|
||||
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_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_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:"
|
||||
UPG_GEO_NO_RESULT="Search failed. Please try again after the service starts!"
|
||||
UPG_GEO_CUSTOM_HINT="These database files are usually collected from the internet. Thanks to the developers!"
|
||||
UPG_GEO_CUSTOM_HINT2="Please click or copy the link to visit the project page for details!"
|
||||
UPG_GEO_CUSTOM_HINT3="Custom databases do not support scheduled tasks or low-flash mode!"
|
||||
UPG_GEO_CUSTOM_HINT4="If you encounter network errors, start the ShellCrash service first!"
|
||||
UPG_GEO_SOURCE_SELECT="Please choose the database source:"
|
||||
UPG_GEO_LOCAL_ONLY1="(Clash/Mihomo only)"
|
||||
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_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_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_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"
|
||||
UPG_DB_SELECT="Please choose the panel installation type:"
|
||||
UPG_DB_WIP=" - - - - - - -Maintenance - - - - - - -"
|
||||
UPG_DB_OLD=" - - - - - -Maintenance stopped - - - - - -"
|
||||
UPG_DB_INSTALL_1="1) Install \033[32mzashboard panel\033[0m (about 2.2mb)"
|
||||
UPG_DB_INSTALL_2="2) Install \033[32mMetaXD panel\033[0m (about 1.5mb)"
|
||||
UPG_DB_INSTALL_3="3) Install \033[32mYacd-Meta modified panel\033[0m (about 1.7mb)"
|
||||
UPG_DB_INSTALL_4="4) Install \033[32mbasic panel\033[0m (about 500kb)"
|
||||
UPG_DB_INSTALL_5="5) Install \033[32mMeta basic panel\033[0m (about 800kb)"
|
||||
UPG_DB_INSTALL_6="6) Install \033[32mYacd panel\033[0m (about 1.1mb)"
|
||||
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_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"
|
||||
UPG_CRT_TITLE3="Do not use on devices without the above issues!"
|
||||
UPG_CRT_EXISTS="The system already has a root certificate file:"
|
||||
UPG_CRT_UPDATE="1) Overwrite update"
|
||||
UPG_CRT_INSTALL="1) Install now"
|
||||
UPG_CRT_BACK="0) Return to previous menu"
|
||||
UPG_CRT_WARN="This device may not have openssl installed, so certificate files cannot be installed!"
|
||||
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_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"
|
||||
UPG_SOURCE_DEV_WARN1="The development branch has not been properly tested and may still contain many bugs!!!"
|
||||
UPG_SOURCE_DEV_WARN2="If you do not have enough patience or testing experience, do not use this version!"
|
||||
UPG_SOURCE_DEV_WARN3="Please join our discussion group: \033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
UPG_SOURCE_DEV_CONFIRM="Still switch to the development branch?"
|
||||
UPG_SOURCE_DEV_YES="1) Confirm switch"
|
||||
UPG_SOURCE_CUSTOM_HINT="Please enter the personal source path directly"
|
||||
UPG_SOURCE_CUSTOM_HINT2="Or enter 0 to return to the previous menu"
|
||||
UPG_SOURCE_CUSTOM_INPUT="Please enter the personal source path> "
|
||||
UPG_SOURCE_VER_GETTING="Fetching version information..."
|
||||
UPG_SOURCE_VER_OK="Version information fetched successfully"
|
||||
UPG_SOURCE_ROLLBACK_SELECT="Please select the specific version to roll back to:"
|
||||
UPG_SOURCE_ROLLBACK_FAIL="Failed to fetch rollback information. Please try another source!"
|
||||
UPG_SOURCE_ROLLBACK_NOTSUP="Current source does not support version rollback"
|
||||
UPG_SOURCE_ROLLBACK_HINT="Please try another installation source!"
|
||||
UPG_THANKS_ITEM_CLASH="Clash Developer: Dreamacro"
|
||||
UPG_THANKS_ITEM_SINGBOX="sing-box Developer: SagerNet"
|
||||
UPG_THANKS_ITEM_SINGBOX_URL="Project: https://github.com/SagerNet/sing-box"
|
||||
UPG_THANKS_ITEM_METACUBE="MetaCubeX Developer: MetaCubeX"
|
||||
UPG_THANKS_ITEM_METACUBE_URL="Project: https://github.com/MetaCubeX"
|
||||
UPG_THANKS_ITEM_YACD="YACD panel Developer: haishanh"
|
||||
UPG_THANKS_ITEM_YACD_URL="Project: https://github.com/haishanh/yacd"
|
||||
UPG_THANKS_ITEM_ZASH="Zashboard Developer: Zephyruso"
|
||||
UPG_THANKS_ITEM_ZASH_URL="Project: https://github.com/Zephyruso/zashboard"
|
||||
UPG_THANKS_ITEM_SUB="Subconverter Developer: tindy2013"
|
||||
UPG_THANKS_ITEM_SUB_URL="Project: https://github.com/tindy2013/subconverter"
|
||||
UPG_THANKS_ITEM_REF1ND="sing-box-reF1nd Developer: reF1nd"
|
||||
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_NOTE1="Gvisor, Tailscale, Wireguard, and NaiveProxy are not supported"
|
||||
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_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_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_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..."
|
||||
UPG_GEO_SOURCE_TITLE="Please choose the database source:"
|
||||
UPG_GEO_LINK_HINT="Please enter the custom database URL> "
|
||||
UPG_GEO_CHOOSE_HINT="Note: Mihomo and SingBox database files are not interchangeable"
|
||||
UPG_GEO_LATEST="Latest online database version (synced daily): "
|
||||
UPG_GEO_CHOOSE="Please choose the Geo database file to update:"
|
||||
UPG_GEO_ITEM1="1) CN-IP bypass file (about 0.1mb)"
|
||||
UPG_GEO_ITEM2="2) CN-IPV6 bypass file (about 30kb)"
|
||||
UPG_GEO_ITEM3="3) Mihomo lite GeoIP_cn database (about 0.1mb)"
|
||||
UPG_GEO_ITEM4="4) Mihomo full GeoSite database (about 5mb)"
|
||||
UPG_GEO_ITEM5="5) Mihomo-mrs common package (about 1mb, use only if needed)"
|
||||
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_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_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_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"
|
||||
UPG_DB_INSTALL_SELECT="Please choose the panel installation type:"
|
||||
UPG_DB_INSTALL_MID=" - - - - - - -Maintenance - - - - - - -"
|
||||
UPG_DB_INSTALL_END=" - - - - - -Maintenance stopped - - - - - -"
|
||||
UPG_DB_INSTALL_4_TEXT="4) Install \033[32mbasic panel\033[0m (about 500kb)"
|
||||
UPG_DB_INSTALL_5_TEXT="5) Install \033[32mMeta basic panel\033[0m (about 800kb)"
|
||||
UPG_DB_INSTALL_6_TEXT="6) Install \033[32mYacd panel\033[0m (about 1.1mb)"
|
||||
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_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!"
|
||||
UPG_CRT_EXIST_HINT="The system already has a root certificate file:"
|
||||
UPG_CRT_OVERWRITE="1) Overwrite update"
|
||||
UPG_CRT_NOW="1) Install now"
|
||||
UPG_CRT_NOT_USE="This device may not have openssl installed, so certificate files cannot be installed!"
|
||||
UPG_SOURCE_TITLE2="Switch ShellCrash version and update source"
|
||||
UPG_SOURCE_CUR_VER="Current version: "
|
||||
UPG_SOURCE_CUR_URL="Current source: "
|
||||
UPG_SOURCE_STABLE_TEXT="stable"
|
||||
UPG_SOURCE_MASTER_TEXT="beta"
|
||||
UPG_SOURCE_DEV_TEXT="dev"
|
||||
UPG_SOURCE_DEV_WARN4="The development branch has not been properly tested and may still contain many bugs!!!"
|
||||
UPG_SOURCE_DEV_WARN5="If you do not have enough patience or testing experience, do not use this version!"
|
||||
UPG_SOURCE_DEV_WARN6="Please join our discussion group: \033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
UPG_SOURCE_DEV_ASK="Still switch to the development branch?"
|
||||
UPG_SOURCE_DEV_CONFIRM_TEXT="1) Confirm switch"
|
||||
UPG_SOURCE_PATH_HINT="Please enter the personal source path directly"
|
||||
UPG_SOURCE_PATH_HINT2="Or enter 0 to return to the previous menu"
|
||||
UPG_SOURCE_PATH_INPUT="Please enter the personal source path> "
|
||||
UPG_SOURCE_GETTING_VER="Fetching version information..."
|
||||
UPG_SOURCE_GET_VER_OK="Version information fetched successfully"
|
||||
UPG_SOURCE_ROLLBACK_SELECT_TEXT="Please select the specific version to roll back to:"
|
||||
UPG_SOURCE_ROLLBACK_FAIL_TEXT="Failed to fetch rollback information. Please try another source!"
|
||||
UPG_SOURCE_ROLLBACK_NOTSUP_TEXT="Current source does not support version rollback"
|
||||
UPG_SOURCE_ROLLBACK_HINT_TEXT="Please try another installation source!"
|
||||
UPG_SOURCE_SWITCH_OK="Source switched successfully!"
|
||||
UPG_GEO_TYPE_LITE="lite"
|
||||
UPG_GEO_TYPE_FULL="global"
|
||||
UPG_SOURCE_UNSET="unset"
|
||||
UPG_SOURCE_ROLLBACK_TAG="(rollback)"
|
||||
|
||||
@@ -53,17 +53,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"
|
||||
|
||||
91
scripts/lang/en/fw_filter.lang
Normal file
91
scripts/lang/en/fw_filter.lang
Normal file
@@ -0,0 +1,91 @@
|
||||
FWF_TITLE="Traffic Filter"
|
||||
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"
|
||||
FWF_SWITCH_STOP="Switching will stop the service. Continue?"
|
||||
FWF_YES="1) Yes"
|
||||
FWF_NO_BACK="0) No, return to previous menu"
|
||||
FWF_QUIC_OFF="QUIC traffic through the ShellCrash core has been disabled!"
|
||||
FWF_QUIC_ON="QUIC protocol traffic disable has been canceled!"
|
||||
FWF_CNIP_ON="CN_IP core bypass has been enabled!"
|
||||
FWF_CNIP_WARN="Note: this will cause global mode and all CN-related rules to become ineffective!"
|
||||
FWF_CNIP_OFF="CN_IP core bypass has been disabled!"
|
||||
FWF_NO_IPSET="This device lacks the ipset module or is not using nftables mode, so bypass cannot be enabled!"
|
||||
FWF_WHITE_LIST="Whitelist"
|
||||
FWF_BLACK_LIST="Blacklist"
|
||||
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_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"
|
||||
FWF_PORT_MENU_5="5) Reset to legacy allowed ports"
|
||||
FWF_MAX_PORT="Up to 15 allowed ports are supported. Please remove some first!"
|
||||
FWF_INPUT_ADD_HINT="Please enter the port number to allow directly"
|
||||
FWF_INPUT_ADD_HINT2="(Only one port number at a time. Do not add multiple at once.)"
|
||||
FWF_INPUT_REMOVE_HINT="Please enter the port number to remove directly"
|
||||
FWF_OR_BACK="Or enter 0 to return to the previous menu"
|
||||
FWF_ERR_DUP="Invalid input! Do not add duplicates!"
|
||||
FWF_ERR_RANGE="Invalid input! Please enter a valid number (1-65535)!"
|
||||
FWF_INPUT_PORT="Please enter> "
|
||||
FWF_CUST_HOST_TITLE="Current default transparent routing subnet: "
|
||||
FWF_CUST_HOST_TITLE2="Currently added custom subnet(s): "
|
||||
FWF_CUST_HOST_MENU_1="1) Remove all custom subnets"
|
||||
FWF_CUST_HOST_MENU_2="2) Use custom subnets to override the default subnet"
|
||||
FWF_CUST_HOST_HINT="Please enter the number or an additional subnet> "
|
||||
FWF_NET_ERR="Please enter a valid subnet address!"
|
||||
FWF_RESERVE_NOTE="Note: addresses must be separated by spaces. Incorrect settings may cause network loops or startup errors. Use with caution!"
|
||||
FWF_RESERVE_NOW="Current subnet: "
|
||||
FWF_RESERVE_INPUT_HINT="Please enter a custom reserved-address IPv4 subnet directly"
|
||||
FWF_RESERVE_INPUT_HINT2="Or enter 1 to reset to the default subnet"
|
||||
FWF_RESERVE_INPUT_HINT3="Or enter 0 to return to the previous menu"
|
||||
FWF_RESERVE_PROMPT="Please enter> "
|
||||
FWF_RESERVE_SET="Reserved-address subnet set to: "
|
||||
FWF_RESERVE_ERR="Invalid input, please try again!"
|
||||
FWF_LAN_NO_DEVICE="Unknown device"
|
||||
FWF_MAC_HINT="Manual MAC input only supports the format \033[32mxx:xx:xx:xx:xx:xx\033[0m"
|
||||
FWF_MAC_EXISTED="Added MAC addresses:"
|
||||
FWF_NONE_MAC="No MAC addresses added yet"
|
||||
FWF_MAC_HEADER="No. \033[33mDevice IP Device MAC Device name\033[0m"
|
||||
FWF_MAC_NONE="No records"
|
||||
FWF_MAC_INPUT_HINT="Please enter the number or a MAC address directly> "
|
||||
FWF_MAC_DUP="This device is already added. Do not add it again!"
|
||||
FWF_IP_HINT="Manual input only supports \033[32m192.168.1.0/24\033[0m or \033[32m192.168.1.0\033[0m"
|
||||
FWF_IP_HINT2="IPv6 addresses are not supported and filtering may fail. MAC filtering is recommended."
|
||||
FWF_IP_EXISTED="Added IP addresses (subnets):"
|
||||
FWF_NONE_IP="No IP addresses (subnets) added yet"
|
||||
FWF_IP_HEADER="\033[33mNo. Device IP Device name\033[32m"
|
||||
FWF_IP_INPUT_HINT="Please enter the number or an IP subnet directly> "
|
||||
FWF_IP_DUP="This address is already added. Do not add it again!"
|
||||
FWF_REMOVE_NONE="There are no devices to remove!"
|
||||
FWF_REMOVE_TITLE="Please choose the device to remove:"
|
||||
FWF_REMOVE_HEADER=" \033[32mDevice IP \033[36mDevice MAC \033[35mDevice name\033[0m"
|
||||
FWF_REMOVE_OK="Corresponding device removed!"
|
||||
FWF_FILTER_MENU_TITLE="Add or remove devices here"
|
||||
FWF_FILTER_MODE="Current filtering mode: "
|
||||
FWF_FILTER_ONLY="Only devices in the list"
|
||||
FWF_FILTER_MODE_SUFFIX=" mode"
|
||||
FWF_FILTER_PASS="traffic passes through"
|
||||
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_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"
|
||||
FWF_FILTER_CLEAR="9) \033[31mClear the entire list\033[0m"
|
||||
FWF_SWITCH_OK="Switch completed!"
|
||||
FWF_LIST_CLEARED="Device list cleared!"
|
||||
@@ -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) > "
|
||||
|
||||
93
scripts/lang/en/override.lang
Normal file
93
scripts/lang/en/override.lang
Normal file
@@ -0,0 +1,93 @@
|
||||
OVR_TITLE="Config Override"
|
||||
OVR_MENU_2="2) Manage \033[36mcustom rules\033[0m"
|
||||
OVR_MENU_3="3) Manage \033[33mcustom nodes\033[0m"
|
||||
OVR_MENU_4="4) Manage \033[36mcustom proxy groups\033[0m"
|
||||
OVR_MENU_5="5) \033[32mCustom\033[0m advanced features"
|
||||
OVR_MENU_9="9) \033[33mDisable\033[0m config override"
|
||||
OVR_BACK="0) Return to previous menu"
|
||||
OVR_INPUT_NUM="Please enter the corresponding number> "
|
||||
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_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"
|
||||
OVR_CONFIRM_NO="0) No, return to previous menu"
|
||||
OVR_RULES_TITLE="Custom Rules"
|
||||
OVR_RULES_MENU_HINT="You can quickly manage custom rules here"
|
||||
OVR_RULES_MANUAL="For batch operations, edit manually: \033[36m $YAMLSDIR/rules.yaml\033[0m"
|
||||
OVR_RULES_SHARED="singbox and clash share these rules, so switching is seamless!"
|
||||
OVR_RULES_WARN="For many rules, use the rule-set feature as much as possible.\n\033[31mToo many rules here may cause startup lag!\033[0m"
|
||||
OVR_RULES_ADD="1) Add custom rule"
|
||||
OVR_RULES_DEL="2) Remove custom rule"
|
||||
OVR_RULES_CLEAR="3) Clear rule list"
|
||||
OVR_RULES_BYPASS="4) Configure node bypass:"
|
||||
OVR_RULES_NO_RULES="Please add custom rules first!"
|
||||
OVR_RULES_CLEAR_CONFIRM="Are you sure you want to clear all custom rules?"
|
||||
OVR_RULES_ADD_RULE="Enter the rule text,\nwhich can be a domain, wildcard domain, IP subnet, or other matching rule content"
|
||||
OVR_RULES_TYPE="Please choose a rule type:"
|
||||
OVR_RULES_GROUP="Please choose a specific rule"
|
||||
OVR_RULES_EXIST_WARN="These rules are read from the existing config file. If errors occur after changing the config later, try adding them again."
|
||||
OVR_RULES_INPUT_RULE="Please enter the corresponding rule> "
|
||||
OVR_RULES_INPUT_NUM="Please enter the corresponding number> "
|
||||
OVR_RULES_INPUT_TYPE="Please enter the corresponding number> "
|
||||
OVR_RULES_INPUT_SELECT="Please enter the corresponding number> "
|
||||
OVR_RULES_DEL_HINT="Enter the corresponding number to remove the matching rule:"
|
||||
OVR_RULES_ADD_OK="Added successfully!"
|
||||
OVR_RULES_BYPASS_WARN1="This feature will automatically set node domains or IPs from the current config file to direct rules to prevent double traffic!"
|
||||
OVR_RULES_BYPASS_WARN2="Make sure the nodes used by downstream devices are the same as those used in ShellCrash, otherwise it will not take effect!"
|
||||
OVR_RULES_BYPASS_PROMPT="Enable node bypass?"
|
||||
OVR_RULES_BYPASS_CONFIRM="Are you sure you want to clear all custom rules?"
|
||||
OVR_GROUPS_TITLE="Custom Clash Proxy Groups"
|
||||
OVR_GROUPS_MENU_HINT="You can quickly manage custom proxy groups here"
|
||||
OVR_GROUPS_MANUAL="For modifications or batch operations, edit manually: $YAMLSDIR/proxy-groups.yaml"
|
||||
OVR_GROUPS_ADD="1) Add custom proxy group"
|
||||
OVR_GROUPS_VIEW="2) View custom proxy groups"
|
||||
OVR_GROUPS_CLEAR="3) Clear custom proxy groups"
|
||||
OVR_GROUPS_WARN1="The proxy group name must match the group specified in the [Custom Rules] or [Custom Nodes] feature!"
|
||||
OVR_GROUPS_WARN2="It is recommended to create the proxy group first, then specify it intelligently in [Custom Rules] or [Custom Nodes]"
|
||||
OVR_GROUPS_WARN3="To add nodes under the current proxy group, edit $YAMLSDIR/proxy-groups.yaml manually"
|
||||
OVR_GROUPS_INPUT_NAME="Please enter the custom proxy group name directly\n(pure numbers are not supported and special characters are not allowed!)"
|
||||
OVR_GROUPS_INPUT_NUM="Please enter the corresponding number> "
|
||||
OVR_GROUPS_URL="Please enter a test URL"
|
||||
OVR_GROUPS_URL_HINT="Or press Enter to use the default URL: https://www.gstatic.com/generate_204"
|
||||
OVR_GROUPS_MULTI_HINT="If you want to add to multiple proxy groups, enter multiple numbers separated by spaces"
|
||||
OVR_GROUPS_SKIP="0) Skip adding"
|
||||
OVR_GROUPS_CLEAR_CONFIRM="Are you sure you want to clear all custom proxy groups?"
|
||||
OVR_GROUPS_ADD_OK="Added successfully!"
|
||||
OVR_PROXIES_TITLE="Custom Clash Nodes"
|
||||
OVR_PROXIES_MENU_HINT="You can quickly manage custom nodes here"
|
||||
OVR_PROXIES_MANUAL="For batch operations, edit manually: $YAMLSDIR/proxies.yaml"
|
||||
OVR_PROXIES_ADD="1) Add custom node"
|
||||
OVR_PROXIES_MANAGE="2) Manage custom nodes"
|
||||
OVR_PROXIES_CLEAR="3) Clear custom nodes"
|
||||
OVR_PROXIES_BYPASS="4) Configure node bypass:"
|
||||
OVR_PROXIES_WARN1="Note\nThe node format must be a single line, without parentheses, and start with \"name:\", for example:"
|
||||
OVR_PROXIES_WARN2="For more formats, see: \033[32mhttps://juewuy.github.io/\033[0m"
|
||||
OVR_PROXIES_INPUT="Please enter the custom node directly"
|
||||
OVR_PROXIES_BLOCK_HASH="Absolutely no [#] character is allowed!"
|
||||
OVR_PROXIES_ADD_HINT="Please choose the proxy group to add the node to"
|
||||
OVR_PROXIES_MULTI_HINT="If you want to add to multiple proxy groups, enter multiple numbers separated by spaces"
|
||||
OVR_PROXIES_GROUP_HINT="To use custom proxy groups, first add them using [Manage custom proxy groups]"
|
||||
OVR_PROXIES_EXIST_HINT="Enter the node number to remove the corresponding node"
|
||||
OVR_PROXIES_EXIST_TITLE="Currently added custom nodes:"
|
||||
OVR_PROXIES_NO_PROXY="Please add custom nodes first!"
|
||||
OVR_PROXIES_CLEAR_CONFIRM="Are you sure you want to clear all custom nodes?"
|
||||
OVR_PROXIES_BYPASS_WARN1="This feature will automatically set node domains or IPs from the current config file to direct rules to prevent double traffic!"
|
||||
OVR_PROXIES_BYPASS_WARN2="Make sure the nodes used by downstream devices are the same as those used in ShellCrash, otherwise it will not take effect!"
|
||||
OVR_PROXIES_BYPASS_PROMPT="Enable node bypass:"
|
||||
OVR_PROXIES_ADD_OK="Added successfully!"
|
||||
OVR_ADV_USER_CREATED1="Custom config file created: $YAMLSDIR/user.yaml!"
|
||||
OVR_ADV_USER_CREATED2="Can be used for custom DNS and similar features"
|
||||
OVR_ADV_USER_CREATED3="Custom feature file created: $YAMLSDIR/others.yaml!"
|
||||
OVR_ADV_USER_CREATED4="Can be used for custom anchors, inbound, proxy-providers, rule-set, sub-rules, script, and similar features"
|
||||
OVR_ADV_WIN="On Windows, use \033[33mWinSCP\033[0m to edit it!"
|
||||
OVR_ADV_MAC="On macOS, use \033[33mSecureFX\033[0m to edit it!"
|
||||
OVR_ADV_LIN="On Linux, you can use \033[33mvim\033[0m to edit it (do not use it on router devices if Chinese text is not displayed)!"
|
||||
OVR_SING_TITLE1="Supported modules that can override script settings:"
|
||||
OVR_SING_TITLE2="Modules that can be merged with built-in features (but must not conflict):"
|
||||
OVR_SING_TITLE3="Place the corresponding JSON files into the \033[33m$JSONSDIR\033[0m directory to load them automatically at startup"
|
||||
OVR_SING_TITLE4="Be sure to read the configuration guide before use: \033[32;4m https://juewuy.github.io/nWTjEpkSK \033[0m"
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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}'
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -15,8 +15,8 @@ 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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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" ] && {
|
||||
@@ -27,7 +27,8 @@ logger() {
|
||||
web_json_post "$url" "$content" &
|
||||
}
|
||||
[ -n "$push_Deer" ] && {
|
||||
url="https://api2.pushdeer.com/message/push"
|
||||
url="${push_Deer_url%/}"
|
||||
url="${url:-https://api2.pushdeer.com}/message/push"
|
||||
content="{\"pushkey\":\"${push_Deer}\",\"text\":\"$log_text\"}"
|
||||
web_json_post "$url" "$content" &
|
||||
}
|
||||
@@ -50,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" &
|
||||
}
|
||||
}
|
||||
} &
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -8,32 +8,32 @@ 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
|
||||
mv -f "$tmpcron" "$CRASHDIR"/task/cron
|
||||
else
|
||||
rm -f "$tmpcron"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
554
scripts/menu.sh
554
scripts/menu.sh
@@ -2,8 +2,8 @@
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
CRASHDIR=$(
|
||||
cd $(dirname $0)
|
||||
pwd
|
||||
cd $(dirname $0)
|
||||
pwd
|
||||
)
|
||||
|
||||
CFG_PATH="$CRASHDIR"/configs/ShellCrash.cfg
|
||||
@@ -32,315 +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() {
|
||||
while true; do
|
||||
# Before each round of checks begins, execute netstat only once and cache the results
|
||||
# Avoid calling the system command once for each port
|
||||
current_listening=$(netstat -ntul 2>&1)
|
||||
. "$CRASHDIR"/menus/check_port.sh
|
||||
|
||||
conflict_found=0
|
||||
while true; do
|
||||
local conflict_found=0
|
||||
local conflict_port=""
|
||||
local conflict_info=""
|
||||
|
||||
for portx in $dns_port $mix_port $redir_port $((redir_port + 1)) $db_port; do
|
||||
# Use `grep` to search within the cached variables instead of re-running `netstat`
|
||||
conflict_line=$(echo "$current_listening" | grep ":$portx ")
|
||||
conflict_info=$(check_port_with_info "$mix_port")
|
||||
if [ $? -ne 0 ]; then
|
||||
conflict_found=1
|
||||
conflict_port="$mix_port"
|
||||
fi
|
||||
|
||||
if [ -n "$conflict_line" ]; then
|
||||
if [ "$conflict_found" -eq 0 ]; then
|
||||
conflict_info=$(check_port_with_info "$redir_port")
|
||||
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$redir_port"
|
||||
fi
|
||||
|
||||
comp_box "【$portx】:$MENU_PORT_CONFLICT_TITLE" \
|
||||
"\033[0m$(echo "$conflict_line" | head -n 1)\033[0m" \
|
||||
"\033[36m$MENU_PORT_CONFLICT_HINT\033[0m"
|
||||
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
|
||||
|
||||
. "$CRASHDIR"/menus/2_settings.sh && set_adv_config
|
||||
. "$CRASHDIR"/libs/get_config.sh
|
||||
if [ "$conflict_found" -eq 0 ]; then
|
||||
conflict_info=$(check_port_with_info "$dns_port")
|
||||
[ $? -ne 0 ] && conflict_found=1 && conflict_port="$dns_port"
|
||||
fi
|
||||
|
||||
# Mark conflict and exit the for loop, triggering the while loop to restart the check
|
||||
# This replaces the original recursive call to `checkport`
|
||||
conflict_found=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
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 no conflicts are found after the entire for loop completes,
|
||||
# the while loop exits and the function terminates.
|
||||
if [ "$conflict_found" -eq 0 ]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
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
|
||||
}
|
||||
|
||||
# 脚本启动前检查
|
||||
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
|
||||
|
||||
@@ -20,7 +20,7 @@ settings() {
|
||||
comp_box "\033[30;47m$SET_MENU_TITLE\033[0m"
|
||||
content_line "1) $SET_MENU_REDIR\t\033[36m$redir_mod$MENU_MOD\033[0m"
|
||||
content_line "2) $SET_MENU_DNS\t\033[36m$dns_mod\033[0m"
|
||||
content_line "3) $SET_MENU_FW_FILTER"
|
||||
content_line "3) $SET_MENU_FW_FILTER\t$SET_MENU_FW_FILTER_DESC"
|
||||
[ "$disoverride" != "1" ] && {
|
||||
content_line "4) $SET_MENU_SKIP_CERT\t\033[36m$skip_cert\033[0m"
|
||||
content_line "5) $SET_MENU_SNIFFER\t\033[36m$sniffer\033[0m"
|
||||
@@ -214,7 +214,7 @@ settings() {
|
||||
;;
|
||||
1)
|
||||
echo chs >"$CRASHDIR"/configs/i18n.cfg
|
||||
msg_alert "\033[32m$SET_SWITCH_RERUN\033[0m"
|
||||
msg_alert "\033[32m切换成功,请重新执行脚本!\033[0m"
|
||||
;;
|
||||
2)
|
||||
echo en >"$CRASHDIR"/configs/i18n.cfg
|
||||
@@ -265,6 +265,7 @@ set_redir_mod() {
|
||||
[ -z "$firewall_area" ] && firewall_area=1
|
||||
[ "$firewall_area" = 4 ] && redir_mod="$MENU_PURE_MOD"
|
||||
[ -z "$redir_mod" ] && redir_mod='Redir'
|
||||
[ -z "$vm_redir" ] && vm_redir='OFF'
|
||||
firewall_area_dsc=$(echo "$SET_FW_AREA_DESC($bypass_host)" | cut -d'|' -f$firewall_area)
|
||||
comp_box "\033[33m$SET_REDIR_RESTART_HINT\033[0m" \
|
||||
"$SET_REDIR_CURRENT\033[47;30m$redir_mod$MENU_MOD\033[0m; $SET_CORE_CURRENT\033[47;30m$crashcore\033[0m"
|
||||
@@ -389,17 +390,30 @@ set_redir_mod() {
|
||||
}
|
||||
|
||||
inputport() {
|
||||
local protocol="${1:-all}"
|
||||
line_break
|
||||
read -r -p "$INPUT_PORT(1~65535)> " portx
|
||||
. "$CRASHDIR"/menus/check_port.sh # 加载测试函数
|
||||
if check_port "$portx"; then
|
||||
setconfig "$xport" "$portx"
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
return 0
|
||||
else
|
||||
. "$CRASHDIR"/menus/check_port.sh
|
||||
|
||||
if ! check_port "$portx" "$protocol"; then
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local ports_to_check=""
|
||||
[ "$xport" != "mix_port" ] && ports_to_check="$ports_to_check|$mix_port"
|
||||
[ "$xport" != "redir_port" ] && ports_to_check="$ports_to_check|$redir_port"
|
||||
[ "$xport" != "dns_port" ] && ports_to_check="$ports_to_check|$dns_port"
|
||||
[ "$xport" != "db_port" ] && ports_to_check="$ports_to_check|$db_port"
|
||||
|
||||
if echo "$ports_to_check|" | grep -q "|$portx|"; then
|
||||
msg_alert "\033[31m$CHECK_PORT_DUP_ERR\033[0m"
|
||||
return 1
|
||||
fi
|
||||
|
||||
setconfig "$xport" "$portx"
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 端口设置
|
||||
@@ -476,7 +490,7 @@ set_adv_config() {
|
||||
;;
|
||||
5)
|
||||
xport=db_port
|
||||
inputport
|
||||
inputport tcp
|
||||
if [ $? -eq 1 ]; then
|
||||
break
|
||||
else
|
||||
@@ -537,7 +551,6 @@ set_adv_config() {
|
||||
|
||||
set_firewall_area() {
|
||||
while true; do
|
||||
[ -z "$vm_redir" ] && vm_redir='OFF'
|
||||
comp_box "\033[33m$FW_AREA_NOTE_1\033[0m" \
|
||||
"\033[33m$FW_AREA_NOTE_2\033[0m" \
|
||||
"" \
|
||||
|
||||
@@ -111,7 +111,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 "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print $3}')
|
||||
list_box "$list"
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -122,8 +122,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 "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
|
||||
task_type
|
||||
break
|
||||
else
|
||||
@@ -292,7 +292,7 @@ task_manager() {
|
||||
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 "$CRASHDIR"/task/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 +313,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 "$CRASHDIR"/task/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"
|
||||
;;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -12,15 +12,15 @@ load_lang 7_gateway
|
||||
# 访问与控制主菜单
|
||||
gateway() {
|
||||
while true; do
|
||||
comp_box "\033[30;47m访问与控制菜单\033[0m"
|
||||
content_line "1) 配置\033[33m公网访问防火墙 \033[32m$fw_wan\033[0m"
|
||||
content_line "2) 配置\033[36mTelegram专属控制机器人 \033[32m$bot_tg_service\033[0m"
|
||||
content_line "3) 配置\033[36mDDNS自动域名\033[0m"
|
||||
comp_box "\033[30;47m$GW_TITLE\033[0m"
|
||||
content_line "1) $GW_MENU_FW_WAN \033[32m$fw_wan\033[0m"
|
||||
content_line "2) $GW_MENU_TG_BOT \033[32m$bot_tg_service\033[0m"
|
||||
content_line "3) $GW_MENU_DDNS"
|
||||
[ "$disoverride" != "1" ] && {
|
||||
content_line "4) 自定义\033[33m公网Vmess入站\033[0m节点 \033[32m$vms_service\033[0m"
|
||||
content_line "5) 自定义\033[33m公网ShadowSocks入站\033[0m节点 \033[32m$sss_service\033[0m"
|
||||
content_line "6) 配置\033[36mTailscale内网穿透\033[0m(限Singbox) \033[32m$ts_service\033[0m"
|
||||
content_line "7) 配置\033[36mWireguard客户端\033[0m(限Singbox) \033[32m$wg_service\033[0m"
|
||||
content_line "4) $GW_MENU_VMESS \033[32m$vms_service\033[0m"
|
||||
content_line "5) $GW_MENU_SHADOWSOCKS \033[32m$sss_service\033[0m"
|
||||
content_line "6) $GW_MENU_TS \033[32m$ts_service\033[0m"
|
||||
content_line "7) $GW_MENU_WG \033[32m$wg_service\033[0m"
|
||||
}
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -31,11 +31,11 @@ gateway() {
|
||||
;;
|
||||
1)
|
||||
if [ -n "$(pidof CrashCore)" ] && [ "$firewall_mod" = 'iptables' ]; then
|
||||
comp_box "\033[33m公网访问防火墙需要先停止服务\033[0m" \
|
||||
"是否确认继续?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "\033[33m$GW_FW_STOP_WARN\033[0m" \
|
||||
"$GW_CONFIRM_CONTINUE"
|
||||
btm_box "1) $GW_YES" \
|
||||
"0) $GW_NO_BACK"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
"$CRASHDIR"/start.sh stop && set_fw_wan
|
||||
else
|
||||
@@ -61,14 +61,14 @@ gateway() {
|
||||
if echo "$crashcore" | grep -q 'sing'; then
|
||||
set_tailscale
|
||||
else
|
||||
msg_alert "\033[33m$crashcore内核暂不支持此功能,请先更换内核!\033[0m"
|
||||
msg_alert "\033[33m$crashcore$GW_CORE_UNSUPPORTED\033[0m"
|
||||
fi
|
||||
;;
|
||||
7)
|
||||
if echo "$crashcore" | grep -q 'sing'; then
|
||||
set_wireguard
|
||||
else
|
||||
msg_alert "\033[33m$crashcore内核暂不支持此功能,请先更换内核!\033[0m"
|
||||
msg_alert "\033[33m$crashcore$GW_CORE_UNSUPPORTED\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -84,17 +84,17 @@ set_fw_wan() {
|
||||
[ -z "$fw_wan" ] && fw_wan=ON
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m如在vps运行,还需在vps安全策略对相关端口同时放行"
|
||||
content_line "\033[31m$GW_WARN\033[0m$GW_FW_VPS_HINT"
|
||||
[ -n "$fw_wan_ports" ] &&
|
||||
content_line "当前手动放行端口:\033[36m$fw_wan_ports\033[0m"
|
||||
content_line "$GW_FW_MANUAL_PORTS\033[36m$fw_wan_ports\033[0m"
|
||||
[ -n "$vms_port$sss_port" ] &&
|
||||
content_line "当前自动放行端口:\033[36m$vms_port $sss_port\033[0m"
|
||||
content_line "默认拦截端口:\033[33m$mix_port,$db_port\033[0m"
|
||||
content_line "$GW_FW_AUTO_PORTS\033[36m$vms_port $sss_port\033[0m"
|
||||
content_line "$GW_FW_DEFAULT_BLOCK\033[33m$mix_port,$db_port\033[0m"
|
||||
separator_line "="
|
||||
btm_box "1) 启用/关闭公网防火墙:\033[36m$fw_wan\033[0m" \
|
||||
"2) 添加放行端口(可包含默认拦截端口)" \
|
||||
"3) 移除指定手动放行端口" \
|
||||
"4) 清空全部手动放行端口" \
|
||||
btm_box "1) $GW_FW_TOGGLE\033[36m$fw_wan\033[0m" \
|
||||
"2) $GW_FW_ADD_PORT" \
|
||||
"3) $GW_FW_REMOVE_PORT" \
|
||||
"4) $GW_FW_CLEAR_PORTS" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -104,11 +104,11 @@ set_fw_wan() {
|
||||
;;
|
||||
1)
|
||||
if [ "$fw_wan" = ON ]; then
|
||||
comp_box "是否确认关闭防火墙?" \
|
||||
"这会带来极大的安全隐患!"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$GW_FW_DISABLE_CONFIRM" \
|
||||
"$GW_FW_DISABLE_RISK"
|
||||
btm_box "1) $GW_YES" \
|
||||
"0) $GW_NO_BACK"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
fw_wan=OFF
|
||||
else
|
||||
@@ -122,14 +122,14 @@ set_fw_wan() {
|
||||
2)
|
||||
port_count=$(echo "$fw_wan_ports" | awk -F',' '{print NF}')
|
||||
if [ "$port_count" -ge 10 ]; then
|
||||
msg_alert "\033[31m最多支持设置放行10个端口,请先减少一些!\033[0m"
|
||||
msg_alert "\033[31m$GW_FW_PORT_LIMIT\033[0m"
|
||||
else
|
||||
line_break
|
||||
read -r -p "$GW_INPUT_ALLOW_PORT> " port
|
||||
if echo ",$fw_wan_ports," | grep -q ",$port,"; then
|
||||
msg_alert "\033[31m输入错误!请勿重复添加!\033[0m"
|
||||
msg_alert "\033[31m$GW_ERR_DUP_PORT\033[0m"
|
||||
elif [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
msg_alert "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
msg_alert "\033[31m$GW_ERR_PORT_RANGE\033[0m"
|
||||
else
|
||||
fw_wan_ports=$(echo "$fw_wan_ports,$port" | sed "s/^,//")
|
||||
if setconfig fw_wan_ports "$fw_wan_ports"; then
|
||||
@@ -142,30 +142,30 @@ set_fw_wan() {
|
||||
;;
|
||||
3)
|
||||
while true; do
|
||||
comp_box "\033[36m请直接输入要移除的端口号\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " port
|
||||
comp_box "\033[36m$GW_INPUT_REMOVE_PORT\033[0m" \
|
||||
"$GW_INPUT_0_BACK"
|
||||
read -r -p "$GW_INPUT_PLAIN> " port
|
||||
if [ "$port" = 0 ]; then
|
||||
break
|
||||
elif echo ",$fw_wan_ports," | grep -q ",$port,"; then
|
||||
if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
msg_alert "\033[31m输入错误!\033[0m" \
|
||||
"\033[31m请输入正确的数值(1-65535)!\033[0m"
|
||||
msg_alert "\033[31m$GW_ERR_INPUT\033[0m" \
|
||||
"\033[31m$GW_ERR_PORT_RANGE\033[0m"
|
||||
else
|
||||
fw_wan_ports=$(echo ",$fw_wan_ports," | sed "s/,$port//; s/^,//; s/,$//")
|
||||
setconfig fw_wan_ports "$fw_wan_ports"
|
||||
break
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入错误!\033[0m" \
|
||||
"\033[31m请输入已添加过的端口!\033[0m"
|
||||
msg_alert "\033[31m$GW_ERR_INPUT\033[0m" \
|
||||
"\033[31m$GW_ERR_PORT_NOT_FOUND\033[0m"
|
||||
fi
|
||||
done
|
||||
;;
|
||||
4)
|
||||
fw_wan_ports=''
|
||||
setconfig fw_wan_ports
|
||||
msg_alert "\033[32m操作成功\033[0m"
|
||||
msg_alert "\033[32m$GW_OK\033[0m"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
@@ -183,8 +183,8 @@ set_bot_tg_config() {
|
||||
cat <<EOF
|
||||
{
|
||||
"commands": [
|
||||
{"command": "$my_alias", "description": "呼出ShellCrash菜单"},
|
||||
{"command": "help", "description": "查看帮助"}
|
||||
{"command": "$my_alias", "description": "$GW_TG_CMD_MENU"},
|
||||
{"command": "help", "description": "$GW_TG_CMD_HELP"}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
@@ -214,7 +214,7 @@ set_bot_tg_service() {
|
||||
. "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_stop
|
||||
else
|
||||
bot_tg_service=ON
|
||||
[ -n "$(pidof CrashCore)" ] && . "$CRASHDIR"/menus/bot_tg_service.sh &&
|
||||
[ -n "$(pidof CrashCore)" ] && . "$CRASHDIR"/menus/bot_tg_service.sh &&
|
||||
bot_tg_start && bot_tg_cron
|
||||
fi
|
||||
setconfig bot_tg_service "$bot_tg_service"
|
||||
@@ -224,10 +224,10 @@ set_bot_tg() {
|
||||
while true; do
|
||||
[ -n "$ts_auth_key" ] && ts_auth_key_info="$GW_SET"
|
||||
[ -n "$TG_CHATID" ] && TG_CHATID_info="$GW_BOUND"
|
||||
comp_box "\033[31m注意:\033[0m由于网络环境原因,此机器人仅限服务启动时运行!"
|
||||
btm_box "1) 启用/关闭TG-BOT服务 \033[32m$bot_tg_service\033[0m" \
|
||||
"2) TG-BOT绑定设置 \033[32m$TG_CHATID_info\033[0m" \
|
||||
"3) 启动时推送菜单 \033[32m$TG_menupush\033[0m" \
|
||||
comp_box "\033[31m$GW_WARN\033[0m$GW_TG_WARN"
|
||||
btm_box "1) $GW_TG_TOGGLE \033[32m$bot_tg_service\033[0m" \
|
||||
"2) $GW_TG_BIND \033[32m$TG_CHATID_info\033[0m" \
|
||||
"3) $GW_TG_MENUPUSH \033[32m$TG_menupush\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -240,16 +240,16 @@ set_bot_tg() {
|
||||
if [ -n "$TG_CHATID" ]; then
|
||||
set_bot_tg_service
|
||||
else
|
||||
msg_alert "\033[31m请先绑定TG-BOT!\033[0m"
|
||||
msg_alert "\033[31m$GW_TG_BIND_FIRST\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
if [ -n "$chat_ID" ] && [ -n "$push_TG" ] && [ "$push_TG" != 'publictoken' ]; then
|
||||
comp_box "检测到已经绑定了TG推送BOT" \
|
||||
"是否直接使用?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$GW_TG_BOUND_DETECTED" \
|
||||
"$GW_TG_USE_DIRECT"
|
||||
btm_box "1) $GW_YES" \
|
||||
"0) $GW_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
TOKEN="$push_TG"
|
||||
set_bot_tg_config
|
||||
@@ -259,14 +259,14 @@ set_bot_tg() {
|
||||
set_bot_tg_init
|
||||
;;
|
||||
3)
|
||||
if [ "$TG_menupush" = ON ];then
|
||||
if [ "$TG_menupush" = ON ]; then
|
||||
TG_menupush=OFF
|
||||
else
|
||||
TG_menupush=ON
|
||||
fi
|
||||
setconfig TG_menupush "$TG_menupush" "$GT_CFG_PATH"
|
||||
set_bot_tg
|
||||
;;
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
@@ -277,18 +277,18 @@ set_bot_tg() {
|
||||
# 自定义入站
|
||||
set_vmess() {
|
||||
while true; do
|
||||
comp_box "\033[31m注意:\033[0m" \
|
||||
"设置的端口会添加到公网访问防火墙并自动放行!" \
|
||||
"脚本只提供基础功能,更多需求请用自定义配置文件功能!" \
|
||||
"\033[31m切勿用于搭建违法翻墙节点,违者后果自负!\033[0m"
|
||||
content_line "1) \033[32m启用/关闭\033[0mVmess入站 \033[32m$vms_service\033[0m"
|
||||
content_line "2) 设置\033[36m监听端口\033[0m: \033[36m$vms_port\033[0m"
|
||||
content_line "3) 设置\033[33mWS-path(可选)\033[0m: \033[33m$vms_ws_path\033[0m"
|
||||
content_line "4) 设置\033[36m秘钥-uuid\033[0m: \033[36m$vms_uuid\033[0m"
|
||||
content_line "5) 一键生成\033[32m随机秘钥\033[0m"
|
||||
comp_box "\033[31m$GW_WARN\033[0m" \
|
||||
"$GW_INBOUND_WARN_PORT" \
|
||||
"$GW_INBOUND_WARN_BASIC" \
|
||||
"\033[31m$GW_INBOUND_WARN_ILLEGAL\033[0m"
|
||||
content_line "1) \033[32m$GW_VMS_TOGGLE\033[0m \033[32m$vms_service\033[0m"
|
||||
content_line "2) $GW_SET_LISTEN_PORT \033[36m$vms_port\033[0m"
|
||||
content_line "3) $GW_SET_WSPATH \033[33m$vms_ws_path\033[0m"
|
||||
content_line "4) $GW_SET_UUID \033[36m$vms_uuid\033[0m"
|
||||
content_line "5) $GW_GEN_RANDOM_KEY"
|
||||
gen_base64 1 >/dev/null 2>&1 &&
|
||||
content_line "6) 设置\033[36m混淆host(可选)\033[0m: \033[33m$vms_host\033[0m"
|
||||
btm_box "7) 一键生成\033[32m分享链接\033[0m" \
|
||||
content_line "6) $GW_SET_OBFS_HOST \033[33m$vms_host\033[0m"
|
||||
btm_box "7) $GW_GEN_SHARE_LINK" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -305,7 +305,7 @@ set_vmess() {
|
||||
vms_service=ON
|
||||
setconfig vms_service "$vms_service"
|
||||
else
|
||||
msg_alert "\033[31m请先完成必选设置!\033[0m"
|
||||
msg_alert "\033[31m$GW_FILL_REQUIRED\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
@@ -316,8 +316,13 @@ set_vmess() {
|
||||
vms_port=''
|
||||
setconfig vms_port "" "$GT_CFG_PATH"
|
||||
elif check_port "$text"; then
|
||||
vms_port="$text"
|
||||
setconfig vms_port "$text" "$GT_CFG_PATH"
|
||||
if echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep -q "|$text|"; then
|
||||
msg_alert "\033[31m$CHECK_PORT_DUP_ERR\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
vms_port="$text"
|
||||
setconfig vms_port "$text" "$GT_CFG_PATH"
|
||||
fi
|
||||
else
|
||||
sleep 1
|
||||
fi
|
||||
@@ -332,7 +337,7 @@ set_vmess() {
|
||||
vms_ws_path="$text"
|
||||
setconfig vms_ws_path "$text" "$GT_CFG_PATH"
|
||||
else
|
||||
msg_alert "\033[31m不是合法的path路径,必须以【/】开头!\033[0m"
|
||||
msg_alert "\033[31m$GW_ERR_WSPATH\033[0m"
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
@@ -345,7 +350,7 @@ set_vmess() {
|
||||
vms_uuid="$text"
|
||||
setconfig vms_uuid "$text" "$GT_CFG_PATH"
|
||||
else
|
||||
msg_alert "\033[31m不是合法的UUID格式,请重新输入或使用随机生成功能!\033[0m"
|
||||
msg_alert "\033[31m$GW_ERR_UUID\033[0m"
|
||||
fi
|
||||
;;
|
||||
5)
|
||||
@@ -355,7 +360,7 @@ set_vmess() {
|
||||
;;
|
||||
6)
|
||||
line_break
|
||||
read -r -p "请输入免流混淆host(输入0删除)> " text
|
||||
read -r -p "$GW_INPUT_OBFS_HOST> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
vms_host=''
|
||||
setconfig vms_host "" "$GT_CFG_PATH"
|
||||
@@ -366,7 +371,7 @@ set_vmess() {
|
||||
;;
|
||||
7)
|
||||
line_break
|
||||
read -r -p "请输入本机公网IP(4/6)或域名> " host_wan
|
||||
read -r -p "$GW_INPUT_HOST> " host_wan
|
||||
if [ -n "$host_wan" ] && [ -n "$vms_port" ] && [ -n "$vms_uuid" ]; then
|
||||
[ -n "$vms_ws_path" ] && vms_net=ws
|
||||
vms_json=$(
|
||||
@@ -387,10 +392,10 @@ EOF
|
||||
)
|
||||
vms_link="vmess://$(gen_base64 "$vms_json")"
|
||||
line_break
|
||||
echo -e "你的分享链接是(请勿随意分享给他人):\n\033[32m$vms_link\033[0m"
|
||||
echo -e "$GW_SHARE_LINK_HINT\n\033[32m$vms_link\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
msg_alert "\033[31m请先完成必选设置!\033[0m"
|
||||
msg_alert "\033[31m$GW_FILL_REQUIRED\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -402,16 +407,16 @@ EOF
|
||||
|
||||
set_shadowsocks() {
|
||||
while true; do
|
||||
comp_box "\033[31m注意:\033[0m" \
|
||||
"设置的端口会添加到公网访问防火墙并自动放行!" \
|
||||
"脚本只提供基础功能,更多需求请用自定义配置文件功能!" \
|
||||
"\033[31m切勿用于搭建违法翻墙节点,违者后果自负!\033[0m"
|
||||
content_line "1) \033[32m启用/关闭\033[0mShadowSocks入站 \033[32m$sss_service\033[0m"
|
||||
content_line "2) 设置\033[36m监听端口\033[0m: \033[36m$sss_port\033[0m"
|
||||
content_line "3) 选择\033[33m加密协议\033[0m: \033[33m$sss_cipher\033[0m"
|
||||
content_line "4) 设置\033[36mpassword\033[0m: \033[36m$sss_pwd\033[0m"
|
||||
comp_box "\033[31m$GW_WARN\033[0m" \
|
||||
"$GW_INBOUND_WARN_PORT" \
|
||||
"$GW_INBOUND_WARN_BASIC" \
|
||||
"\033[31m$GW_INBOUND_WARN_ILLEGAL\033[0m"
|
||||
content_line "1) \033[32m$GW_SS_TOGGLE\033[0m \033[32m$sss_service\033[0m"
|
||||
content_line "2) $GW_SET_LISTEN_PORT \033[36m$sss_port\033[0m"
|
||||
content_line "3) $GW_SS_SELECT_CIPHER \033[33m$sss_cipher\033[0m"
|
||||
content_line "4) $GW_SS_SET_PWD \033[36m$sss_pwd\033[0m"
|
||||
gen_base64 1 >/dev/null 2>&1 &&
|
||||
content_line "5) 一键生成分享链接"
|
||||
content_line "5) $GW_GEN_SHARE_LINK"
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -428,7 +433,7 @@ set_shadowsocks() {
|
||||
sss_service=ON
|
||||
setconfig sss_service "$sss_service"
|
||||
else
|
||||
msg_alert "\033[31m请先完成必选设置!\033[0m"
|
||||
msg_alert "\033[31m$GW_FILL_REQUIRED\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
@@ -439,22 +444,27 @@ set_shadowsocks() {
|
||||
sss_port=''
|
||||
setconfig sss_port "" "$GT_CFG_PATH"
|
||||
elif check_port "$text"; then
|
||||
sss_port="$text"
|
||||
setconfig sss_port "$text" "$GT_CFG_PATH"
|
||||
if echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep -q "|$text|"; then
|
||||
msg_alert "\033[31m$CHECK_PORT_DUP_ERR\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
sss_port="$text"
|
||||
setconfig sss_port "$text" "$GT_CFG_PATH"
|
||||
fi
|
||||
else
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
comp_box "请选择要使用的加密协议:"
|
||||
comp_box "$GW_SS_SELECT_CIPHER"
|
||||
content_line "1) \033[32mxchacha20-ietf-poly1305\033[0m"
|
||||
content_line "2) \033[32mchacha20-ietf-poly1305\033[0m"
|
||||
content_line "3) \033[32maes-128-gcm\033[0m"
|
||||
content_line "4) \033[32maes-256-gcm\033[0m"
|
||||
gen_random 1 >/dev/null && {
|
||||
content_line ""
|
||||
content_line " - - - - - - -\033[31m注意\033[0m- - - - - - -"
|
||||
content_line " 2022系列加密必须使用随机生成的password!"
|
||||
content_line "$GW_SS_2022_NOTE_HEADER"
|
||||
content_line "$GW_SS_2022_REQUIRE"
|
||||
content_line "5) \033[32m2022-blake3-chacha20-poly1305\033[0m"
|
||||
content_line "6) \033[32m2022-blake3-aes-128-gcm\033[0m"
|
||||
content_line "7) \033[32m2022-blake3-aes-256-gcm\033[0m"
|
||||
@@ -501,10 +511,10 @@ set_shadowsocks() {
|
||||
;;
|
||||
4)
|
||||
if echo "$sss_cipher" | grep -q '2022-blake3'; then
|
||||
msg_alert "\033[31m注意:\033[0m2022系列加密必须使用脚本随机生成的password!"
|
||||
msg_alert "\033[31m$GW_WARN\033[0m$GW_SS_2022_PASSWORD_ONLY"
|
||||
else
|
||||
line_break
|
||||
read -r -p "请输入秘钥(输入0删除)> " text
|
||||
read -r -p "$GW_INPUT_PWD_DEL0> " text
|
||||
[ "$text" = 0 ] && sss_pwd='' || sss_pwd="$text"
|
||||
setconfig sss_pwd "$text" "$GT_CFG_PATH"
|
||||
fi
|
||||
@@ -515,10 +525,10 @@ set_shadowsocks() {
|
||||
if [ -n "$text" ] && [ -n "$sss_port" ] && [ -n "$sss_cipher" ] && [ -n "$sss_pwd" ]; then
|
||||
ss_link="ss://$(gen_base64 "$sss_cipher":"$sss_pwd")@${text}:${sss_port}#ShellCrash_ss_in"
|
||||
line_break
|
||||
echo -e "你的分享链接是(请勿随意分享给他人):\n\033[32m$ss_link\033[0m"
|
||||
echo -e "$GW_SHARE_LINK_HINT\n\033[32m$ss_link\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
msg_alert "\033[31m请先完成必选设置!\033[0m"
|
||||
msg_alert "\033[31m$GW_FILL_REQUIRED\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -532,15 +542,15 @@ set_shadowsocks() {
|
||||
set_tailscale() {
|
||||
while true; do
|
||||
[ -n "$ts_auth_key" ] && ts_auth_key_info='*********'
|
||||
comp_box "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译Tailscale模块\n如需使用请先前往自定义内核更新完整版内核文件!" \
|
||||
"创建秘钥:\033[32;4mhttps://login.tailscale.com/admin/settings/keys\033[0m" \
|
||||
"访问非本机目标需允许通告:\033[32;4mhttps://login.tailscale.com\033[0m" \
|
||||
"访问非本机目标需在终端设置使用Subnet或EXIT-NODE模式"
|
||||
btm_box "1) \033[32m启用/关闭\033[0mTailscale服务 \033[32m$ts_service\033[0m" \
|
||||
"2) 设置\033[36m秘钥\033[0m(Auth Key) $ts_auth_key_info" \
|
||||
"3) 通告路由\033[33m内网地址\033[0m(Subnet) \033[36m$ts_subnet\033[0m" \
|
||||
"4) 通告路由\033[31m全部流量\033[0m(EXIT-NODE) \033[36m$ts_exit_node\033[0m" \
|
||||
"5) 设置\033[36m设备名称\033[0m(可选) $ts_hostname" \
|
||||
comp_box "\033[31m$GW_WARN\033[0m$GW_TS_WARN" \
|
||||
"$GW_TS_KEY_URL" \
|
||||
"$GW_TS_ALLOW_URL" \
|
||||
"$GW_TS_SUBNET_EXIT_HINT"
|
||||
btm_box "1) \033[32m$GW_TS_TOGGLE\033[0m \033[32m$ts_service\033[0m" \
|
||||
"2) $GW_TS_SET_AUTHKEY $ts_auth_key_info" \
|
||||
"3) $GW_TS_SUBNET \033[36m$ts_subnet\033[0m" \
|
||||
"4) $GW_TS_EXIT_NODE \033[36m$ts_exit_node\033[0m" \
|
||||
"5) $GW_TS_HOSTNAME $ts_hostname" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -553,12 +563,12 @@ set_tailscale() {
|
||||
[ "$ts_service" = ON ] && ts_service=OFF || ts_service=ON
|
||||
setconfig ts_service "$ts_service"
|
||||
else
|
||||
msg_alert "\033[31m请先设置秘钥!\033[0m"
|
||||
msg_alert "\033[31m$GW_TS_SET_KEY_FIRST\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
line_break
|
||||
read -r -p "请输入秘钥(输入0删除)> " text
|
||||
read -r -p "$GW_TS_INPUT_KEY> " text
|
||||
[ "$text" = 0 ] && unset ts_auth_key ts_auth_key_info || ts_auth_key="$text"
|
||||
setconfig ts_auth_key "$ts_auth_key" "$GT_CFG_PATH"
|
||||
;;
|
||||
@@ -571,14 +581,14 @@ set_tailscale() {
|
||||
ts_exit_node=false
|
||||
else
|
||||
ts_exit_node=true
|
||||
msg_alert -t 3 "\033[31m注意:\033[0m目前exitnode的官方DNS有bug,要么启用域名嗅探并禁用TailscaleDNS,\n要么必须在网页设置Globalname servers为分配的本设备子网IP且启用override"
|
||||
msg_alert -t 3 "\033[31m$GW_WARN\033[0m$GW_TS_EXITNODE_WARN"
|
||||
fi
|
||||
setconfig ts_exit_node "$ts_exit_node" "$GT_CFG_PATH"
|
||||
;;
|
||||
5)
|
||||
comp_box "\033[36m请直接输入希望在Tailscale显示的设备名称\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " ts_hostname
|
||||
comp_box "\033[36m$GW_TS_INPUT_NAME\033[0m" \
|
||||
"$GW_INPUT_0_BACK"
|
||||
read -r -p "$GW_INPUT_PLAIN> " ts_hostname
|
||||
if [ "$ts_hostname" != 0 ]; then
|
||||
setconfig ts_hostname "$ts_hostname" "$GT_CFG_PATH"
|
||||
fi
|
||||
@@ -610,17 +620,17 @@ set_wireguard() {
|
||||
else
|
||||
unset wgpsk_key_info
|
||||
fi
|
||||
comp_box "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译WireGuard模块\n如需使用请先前往自定义内核更新完整版内核文件!"
|
||||
btm_box "1) \033[32m启用/关闭\033[0mWireguard服务 \033[32m$wg_service\033[0m" \
|
||||
comp_box "\033[31m$GW_WARN\033[0m$GW_WG_WARN"
|
||||
btm_box "1) \033[32m$GW_WG_TOGGLE\033[0m \033[32m$wg_service\033[0m" \
|
||||
"" \
|
||||
"2) 设置\033[36mEndpoint地址\033[0m: \033[36m$wg_server\033[0m" \
|
||||
"3) 设置\033[36mEndpoint端口\033[0m: \033[36m$wg_port\033[0m" \
|
||||
"4) 设置\033[36m公钥-PublicKey\033[0m: \033[36m$wgp_key_info\033[0m" \
|
||||
"5) 设置\033[36m密钥-PresharedKey\033[0m: \033[36m$wgpsk_key_info\033[0m" \
|
||||
"2) $GW_WG_SET_ENDPOINT \033[36m$wg_server\033[0m" \
|
||||
"3) $GW_WG_SET_ENDPOINT_PORT \033[36m$wg_port\033[0m" \
|
||||
"4) $GW_WG_SET_PUBLIC \033[36m$wgp_key_info\033[0m" \
|
||||
"5) $GW_WG_SET_PRESHARED \033[36m$wgpsk_key_info\033[0m" \
|
||||
"" \
|
||||
"6) 设置\033[33m私钥-PrivateKey\033[0m: \033[33m$wgv_key_info\033[0m" \
|
||||
"7) 设置\033[33m组网IPV4地址\033[0m: \033[33m$wg_ipv4\033[0m" \
|
||||
"8) 可选\033[33m组网IPV6地址\033[0m: \033[33m$wg_ipv6\033[0m" \
|
||||
"6) $GW_WG_SET_PRIVATE \033[33m$wgv_key_info\033[0m" \
|
||||
"7) $GW_WG_SET_IPV4 \033[33m$wg_ipv4\033[0m" \
|
||||
"8) $GW_WG_SET_IPV6 \033[33m$wg_ipv6\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -633,12 +643,12 @@ set_wireguard() {
|
||||
[ "$wg_service" = ON ] && wg_service=OFF || wg_service=ON
|
||||
setconfig wg_service "$wg_service"
|
||||
else
|
||||
msg_alert "\033[31m请先完成必选设置!\033[0m"
|
||||
msg_alert "\033[31m$GW_FILL_REQUIRED\033[0m"
|
||||
fi
|
||||
;;
|
||||
[1-8])
|
||||
line_break
|
||||
read -r -p "请输入相应内容(回车或0删除)> " text
|
||||
read -r -p "$GW_INPUT_TEXT_DEL0> " text
|
||||
[ "$text" = 0 ] && text=''
|
||||
case "$num" in
|
||||
2)
|
||||
|
||||
@@ -17,13 +17,13 @@ ssh_tools() {
|
||||
while true; do
|
||||
[ -n "$(cat /etc/firewall.user 2>&1 | grep '启用外网访问SSH服务')" ] && ssh_ol=$TOOLS_SSH_DISABLE || ssh_ol=$TOOLS_SSH_ENABLE
|
||||
[ -z "$ssh_port" ] && ssh_port=10022
|
||||
comp_box "\033[33m此功能仅针对使用Openwrt系统的设备生效,且不依赖服务\033[0m" \
|
||||
"\033[31m本功能不支持红米AX6S等镜像化系统设备,请勿尝试!\033[0m"
|
||||
btm_box "1) \033[32m修改\033[0m外网访问端口:\033[36m$ssh_port\033[0m" \
|
||||
"2) \033[32m修改\033[0mSSH访问密码(请连续输入2次后回车)" \
|
||||
"3) \033[33m$ssh_ol\033[0m外网访问SSH" \
|
||||
comp_box "\033[33m$TOOLS_SSH_ONLY_OPENWRT\033[0m" \
|
||||
"\033[31m$TOOLS_SSH_UNSUPPORTED_SYSTEM\033[0m"
|
||||
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_PREFIX}\033[33m$ssh_ol\033[0m${TOOLS_SSH_TOGGLE_ITEM_SUFFIX}" \
|
||||
"" \
|
||||
"0) 返回上级菜单 \033[0m"
|
||||
"0) $COMMON_BACK \033[0m"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
@@ -31,7 +31,7 @@ ssh_tools() {
|
||||
;;
|
||||
1)
|
||||
line_break
|
||||
read -r -p "请输入端口号(1000-65535)> " num
|
||||
read -r -p "$TOOLS_PROMPT_PORT" num
|
||||
if [ -z "$num" ]; then
|
||||
errornum
|
||||
elif [ "$num" -gt 65535 ] || [ "$num" -le 999 ]; then
|
||||
@@ -52,7 +52,7 @@ ssh_tools() {
|
||||
sleep 1
|
||||
;;
|
||||
3)
|
||||
if [ "$ssh_ol" = "开启" ]; then
|
||||
if [ "$ssh_ol" = "$TOOLS_SSH_ENABLE" ]; then
|
||||
iptables -w -t nat -A PREROUTING -p tcp -m multiport --dports "$ssh_port" -j REDIRECT --to-ports 22
|
||||
[ -n "$(ckcmd ip6tables)" ] && ip6tables -w -t nat -A PREROUTING -p tcp -m multiport --dports "$ssh_port" -j REDIRECT --to-ports 22
|
||||
echo "iptables -w -t nat -A PREROUTING -p tcp -m multiport --dports $ssh_port -j REDIRECT --to-ports 22 #启用外网访问SSH服务" >>/etc/firewall.user
|
||||
@@ -81,16 +81,16 @@ tools() {
|
||||
[ -f "$CRASHDIR"/tools/tun.ko ] && mi_tunfix=32mON || mi_tunfix=31mOFF
|
||||
comp_box "\033[30;47m$TOOLS_TITLE\033[0m" \
|
||||
"" \
|
||||
"\033[33m本页工具可能无法兼容全部Linux设备,请酌情使用!\033[0m" \
|
||||
"磁盘占用/所在目录:" \
|
||||
"\033[33m$TOOLS_WARN_COMPAT\033[0m" \
|
||||
"$TOOLS_DISK_USAGE" \
|
||||
"$(du -sh "$CRASHDIR")"
|
||||
content_line "1) ShellCrash\033[33m测试菜单\033[0m"
|
||||
content_line "2) ShellCrash\033[32m新手引导\033[0m"
|
||||
content_line "3) \033[36m日志及推送工具\033[0m"
|
||||
[ -f /etc/firewall.user ] && content_line "4) \033[32m配置\033[0m外网访问SSH"
|
||||
[ -x /usr/sbin/otapredownload ] && content_line "5) \033[33m$mi_update\033[0m小米系统自动更新"
|
||||
[ "$systype" = "mi_snapshot" ] && content_line "6) 小米设备软固化SSH ———— \033[$mi_mi_autoSSH_type \033[0m"
|
||||
[ "$systype" = "mi_snapshot" ] && content_line "8) 小米设备Tun模块修复 ———— \033[$mi_tunfix \033[0m"
|
||||
content_line "$TOOLS_MENU_TEST_ITEM"
|
||||
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_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
|
||||
@@ -114,7 +114,7 @@ tools() {
|
||||
;;
|
||||
5)
|
||||
if [ -x /usr/sbin/otapredownload ]; then
|
||||
if [ "$mi_update" = "禁用" ]; then
|
||||
if [ "$mi_update" = "$TOOLS_DISABLE" ]; then
|
||||
grep -q "otapredownload" /etc/crontabs/root &&
|
||||
sed -i "/^[^\#]*otapredownload/ s/^/#/" /etc/crontabs/root ||
|
||||
echo "#15 3,4,5 * * * /usr/sbin/otapredownload >/dev/null 2>&1" >>/etc/crontabs/root
|
||||
@@ -123,27 +123,28 @@ 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[33m$mi_update\033[0m小米路由器的自动更新,如未生效,请在官方APP中同步设置!"
|
||||
[ "$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)
|
||||
if [ "$systype" = "mi_snapshot" ]; then
|
||||
mi_autoSSH
|
||||
else
|
||||
msg_alert "不支持的设备!"
|
||||
msg_alert "\033[31m$TOOLS_UNSUPPORTED_DEVICE"
|
||||
fi
|
||||
;;
|
||||
7)
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ ! -f "$CRASHDIR"/tools/ShellDDNS.sh ]; then
|
||||
content_line "正在获取在线脚本......"
|
||||
content_line "$TOOLS_FETCHING_SCRIPT"
|
||||
get_bin "$TMPDIR"/ShellDDNS.sh tools/ShellDDNS.sh
|
||||
if [ "$?" = "0" ]; then
|
||||
mv -f "$TMPDIR"/ShellDDNS.sh "$CRASHDIR"/tools/ShellDDNS.sh
|
||||
. "$CRASHDIR"/tools/ShellDDNS.sh
|
||||
else
|
||||
content_line "\033[31m文件下载失败!\033[0m"
|
||||
content_line "\033[31m$TOOLS_DOWNLOAD_FAIL\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
else
|
||||
@@ -153,38 +154,38 @@ tools() {
|
||||
;;
|
||||
8)
|
||||
if [ -f "$CRASHDIR"/tools/tun.ko ]; then
|
||||
comp_box "是否禁用此功能并移除相关补丁?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_DISABLE_FIX_CONFIRM"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
[ "$res" = 1 ] && {
|
||||
rm -rf "$CRASHDIR"/tools/tun.ko
|
||||
msg_alert "\033[33m补丁文件已移除,请立即重启设备以防止出错!\033[0m"
|
||||
msg_alert "\033[33m$TOOLS_PATCH_REMOVED\033[0m"
|
||||
}
|
||||
elif ckcmd modinfo && [ -z "$(modinfo tun)" ]; then
|
||||
comp_box "\033[33m本功能需要修改系统文件,不保证没有任何风险!\033[0m" \
|
||||
"\033[33m本功能采集的Tun模块并不一定适用于你的设备!\033[0m"
|
||||
btm_box "1) 我已知晓,出现问题会自行承担!" \
|
||||
comp_box "\033[33m$TOOLS_TUN_WARN1\033[0m" \
|
||||
"\033[33m$TOOLS_TUN_WARN2\033[0m"
|
||||
btm_box "$TOOLS_ACCEPT_RISK" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应标号> " res
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "正在连接服务器获取Tun模块补丁文件......"
|
||||
content_line "$TOOLS_TUN_CONNECTING"
|
||||
get_bin "$TMPDIR"/tun.ko bin/fix/tun.ko
|
||||
if [ "$?" = "0" ]; then
|
||||
mv -f "$TMPDIR"/tun.ko "$CRASHDIR"/tools/tun.ko &&
|
||||
/data/shellcrash_init.sh tunfix &&
|
||||
content_line "\033[32m设置成功!请重启服务!\033[0m"
|
||||
content_line "\033[32m$TOOLS_TUN_OK\033[0m"
|
||||
else
|
||||
content_line "\033[31m文件下载失败,请重试!\033[0m"
|
||||
content_line "\033[31m$TOOLS_TUN_FAIL\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m当前设备无需设置,请勿尝试!\033[0m"
|
||||
msg_alert "\033[31m$TOOLS_DEVICE_NOT_NEED\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -195,11 +196,11 @@ tools() {
|
||||
}
|
||||
|
||||
mi_autoSSH() {
|
||||
comp_box "\033[33m本功能使用软件命令进行固化不保证100%成功!\033[0m" \
|
||||
"\033[33m如有问题请加群反馈:\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
btm_box "请输入需要还原的SSH密码(不影响当前密码)" \
|
||||
"(回车可跳过)"
|
||||
read -r -p "请输入> " mi_mi_autoSSH_pwd
|
||||
comp_box "\033[33m$TOOLS_AUTO_SSH_WARN1\033[0m" \
|
||||
"\033[33m$TOOLS_AUTO_SSH_WARN2\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
btm_box "$TOOLS_AUTO_SSH_PWD_HINT1" \
|
||||
"$TOOLS_AUTO_SSH_PWD_HINT2"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" mi_mi_autoSSH_pwd
|
||||
mi_mi_autoSSH=$TOOLS_CONFIGURED
|
||||
cp -f /etc/dropbear/dropbear_rsa_host_key "$CRASHDIR"/configs/dropbear_rsa_host_key 2>/dev/null
|
||||
cp -f /etc/dropbear/authorized_keys "$CRASHDIR"/configs/authorized_keys 2>/dev/null
|
||||
@@ -226,19 +227,19 @@ log_pusher() {
|
||||
[ -n "$push_SynoChat" ] && stat_SynoChat=32mON || stat_SynoChat=33mOFF
|
||||
[ -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未设置
|
||||
comp_box "1) Telegram推送 ——\033[$stat_TG\033[0m" \
|
||||
"2) PushDeer推送 ——\033[$stat_Deer\033[0m" \
|
||||
"3) Bark推送-IOS ——\033[$stat_bark\033[0m" \
|
||||
"4) Passover推送 ——\033[$stat_Po\033[0m" \
|
||||
"5) PushPlus推送 ——\033[$stat_PP\033[0m" \
|
||||
"6) SynoChat推送 ——\033[$stat_SynoChat\033[0m" \
|
||||
"7) Gotify推送 ——\033[$stat_Gotify\033[0m" \
|
||||
[ -n "$device_name" ] && device_s=32m$device_name || device_s=33m$COMMON_UNSET
|
||||
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}" \
|
||||
"" \
|
||||
"a) 查看\033[36m运行日志\033[0m" \
|
||||
"b) 推送任务日志 ——\033[$stat_task\033[0m" \
|
||||
"c) 设置设备名称 ——\033[$device_s\033[0m" \
|
||||
"d) 清空日志文件" \
|
||||
"$TOOLS_LOG_VIEW" \
|
||||
"${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"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -248,10 +249,10 @@ log_pusher() {
|
||||
;;
|
||||
1)
|
||||
if [ -n "$push_TG" ]; then
|
||||
comp_box "是否确认关闭TG日志推送?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_CONFIRM_CLOSE_TG"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
push_TG=
|
||||
chat_ID=
|
||||
@@ -264,8 +265,8 @@ log_pusher() {
|
||||
# echo -e "\033[33m详细设置指南请参考 https://juewuy.github.io/ \033[0m"
|
||||
. "$CRASHDIR"/menus/bot_tg_bind.sh
|
||||
chose_bot() {
|
||||
comp_box "1) 使用公共机器人 ——不依赖内核服务" \
|
||||
"2) 使用私人机器人 ——需要额外申请" \
|
||||
comp_box "$TOOLS_BOT_PUBLIC" \
|
||||
"$TOOLS_BOT_PRIVATE" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -291,42 +292,78 @@ log_pusher() {
|
||||
;;
|
||||
2)
|
||||
if [ -n "$push_Deer" ]; then
|
||||
comp_box "是否确认关闭PushDeer日志推送?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_CONFIRM_CLOSE_DEER"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
push_Deer=
|
||||
push_Deer_url=
|
||||
setconfig push_Deer
|
||||
setconfig push_Deer_url
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
# echo -e "\033[33m详细设置指南请参考 https://juewuy.github.io/ \033[0m"
|
||||
comp_box "1. 请先前往 \033[32;4mhttp://www.pushdeer.com/official.html\033[0m 扫码安装快应用或下载APP" \
|
||||
"2. 打开快应用/APP,并完成登陆" \
|
||||
"3. \033[33m切换到「设备」标签页,点击右上角的加号,注册当前设备\033[0m" \
|
||||
"4. \033[36m切换到「秘钥」标签页,点击右上角的加号,创建一个秘钥,并复制\033[0m"
|
||||
btm_box "\033[36m请直接输入你复制的秘钥\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " url
|
||||
comp_box "$TOOLS_PUSHDEER_SELECT_SERVER" \
|
||||
"$TOOLS_PUSHDEER_OFFICIAL" \
|
||||
"$TOOLS_PUSHDEER_CUSTOM" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" num
|
||||
case "$num" in
|
||||
0)
|
||||
continue
|
||||
;;
|
||||
2)
|
||||
comp_box "$TOOLS_PUSHDEER_CUSTOM_URL_HINT" \
|
||||
"$TOOLS_PUSHDEER_CUSTOM_URL_EXAMPLE"
|
||||
btm_box "\033[36m$TOOLS_PUSHDEER_CUSTOM_URL_INPUT\033[0m" \
|
||||
"$TOOLS_OR_BACK"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" url
|
||||
if [ "$url" = 0 ]; then
|
||||
continue
|
||||
elif [ -z "$url" ]; then
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
continue
|
||||
fi
|
||||
push_Deer_url=${url%/}
|
||||
setconfig push_Deer_url "${url%/}"
|
||||
;;
|
||||
1)
|
||||
push_Deer_url=
|
||||
setconfig push_Deer_url
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
comp_box "$TOOLS_PUSHDEER_INSTALL1" \
|
||||
"$TOOLS_PUSHDEER_INSTALL2" \
|
||||
"$TOOLS_PUSHDEER_INSTALL3" \
|
||||
"$TOOLS_PUSHDEER_INSTALL4"
|
||||
btm_box "\033[36m$TOOLS_PUSHDEER_SECRET_HINT\033[0m" \
|
||||
"$TOOLS_OR_BACK"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" url
|
||||
if [ "$url" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$url" ]; then
|
||||
push_Deer=$url
|
||||
setconfig push_Deer "$url"
|
||||
logger "已完成PushDeer日志推送设置!" 32
|
||||
logger "$TOOLS_PUSHDEER_OK" 32
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
if [ -n "$push_bark" ]; then
|
||||
comp_box "是否确认关闭Bark日志推送?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_CONFIRM_CLOSE_BARK"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
push_bark=
|
||||
bark_param=
|
||||
@@ -337,28 +374,28 @@ log_pusher() {
|
||||
fi
|
||||
else
|
||||
# echo -e "\033[33m详细设置指南请参考 https://juewuy.github.io/ \033[0m"
|
||||
comp_box "\033[33mBark推送仅支持IOS系统,其他平台请使用其他推送方式!\033[0m" \
|
||||
"\033[32m请安装Bark-IOS客户端,并在客户端中找到专属推送链接\033[0m"
|
||||
btm_box "\033[36m请直接输入你的Bark推送链接\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " url
|
||||
comp_box "\033[33m$TOOLS_BARK_WARN\033[0m" \
|
||||
"\033[32m$TOOLS_BARK_INSTALL\033[0m"
|
||||
btm_box "\033[36m$TOOLS_BARK_URL_HINT\033[0m" \
|
||||
"$TOOLS_OR_BACK"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" url
|
||||
if [ "$url" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$url" ]; then
|
||||
push_bark=$url
|
||||
setconfig push_bark "$url"
|
||||
logger "已完成Bark日志推送设置!" 32
|
||||
logger "$TOOLS_BARK_OK" 32
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
if [ -n "$push_Po" ]; then
|
||||
comp_box "是否确认关闭Pushover日志推送?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_CONFIRM_CLOSE_PO"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
push_Po=
|
||||
push_Po_key=
|
||||
@@ -369,44 +406,44 @@ log_pusher() {
|
||||
fi
|
||||
else
|
||||
# echo -e "\033[33m详细设置指南请参考 https://juewuy.github.io/ \033[0m"
|
||||
comp_box "请先通过 \033[32;4mhttps://pushover.net/\033[0m 注册账号并获取\033[36mUser Key\033[0m" \
|
||||
comp_box "$TOOLS_PUSHOVER_REG" \
|
||||
"" \
|
||||
"\033[36m请直接请输入你的User Key\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " key
|
||||
"\033[36m$TOOLS_PUSHOVER_USERKEY_HINT\033[0m" \
|
||||
"$TOOLS_OR_BACK"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" key
|
||||
if [ "$key" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$key" ]; then
|
||||
comp_box "\033[33m请检查注册邮箱,完成账户验证\033[0m"
|
||||
btm_box "1) 我已经验证完成" \
|
||||
comp_box "\033[33m$TOOLS_PUSHOVER_VERIFY\033[0m"
|
||||
btm_box "$TOOLS_PUSHOVER_VERIFIED" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "我已经验证完成(1/0)> " res
|
||||
read -r -p "$TOOLS_PUSHOVER_VERIFY_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
comp_box "请通过 \033[32;4mhttps://pushover.net/apps/build\033[0m 生成\033[36mAPI Token\033[0m"
|
||||
read -r -p "请输入你的API Token> " Token
|
||||
comp_box "$TOOLS_PUSHOVER_TOKEN_BUILD"
|
||||
read -r -p "$TOOLS_PUSHOVER_TOKEN_HINT> " Token
|
||||
if [ -n "$Token" ]; then
|
||||
push_Po=$Token
|
||||
push_Po_key=$key
|
||||
setconfig push_Po "$Token"
|
||||
setconfig push_Po_key "$key"
|
||||
logger "已完成Passover日志推送设置!" 32
|
||||
logger "$TOOLS_PUSHOVER_OK" 32
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
fi
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
5)
|
||||
if [ -n "$push_PP" ]; then
|
||||
comp_box "是否确认关闭PushPlus日志推送?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_CONFIRM_CLOSE_PP"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
push_PP=
|
||||
setconfig push_PP
|
||||
@@ -415,27 +452,27 @@ log_pusher() {
|
||||
fi
|
||||
else
|
||||
# echo -e "\033[33m详细设置指南请参考 https://juewuy.github.io/ \033[0m"
|
||||
comp_box "请先通过 \033[32;4mhttps://www.pushplus.plus/push1.html\033[0m 注册账号并获取\033[36mtoken\033[0m"
|
||||
btm_box "\033[36m请直接输入你的token\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " Token
|
||||
comp_box "$TOOLS_PUSHPLUS_REG"
|
||||
btm_box "\033[36m$TOOLS_PUSHPLUS_TOKEN_HINT\033[0m" \
|
||||
"$TOOLS_OR_BACK"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" Token
|
||||
if [ "$Token" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$Token" ]; then
|
||||
push_PP=$Token
|
||||
setconfig push_PP "$Token"
|
||||
logger "已完成PushPlus日志推送设置!" 32
|
||||
logger "$TOOLS_PUSHPLUS_OK" 32
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
6)
|
||||
if [ -n "$push_SynoChat" ]; then
|
||||
comp_box "是否确认关闭SynoChat日志推送?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_CONFIRM_CLOSE_SYNO"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
push_SynoChat=
|
||||
setconfig push_SynoChat
|
||||
@@ -444,17 +481,17 @@ log_pusher() {
|
||||
fi
|
||||
else
|
||||
line_break
|
||||
read -r -p "请输入你的Synology DSM主页地址> " URL
|
||||
read -r -p "请输入你的Synology Chat Token> " TOKEN
|
||||
comp_box '请通过"你的群晖地址/webapi/entry.cgi?api=SYNO.Chat.External&method=user_list&version=2&token=你的TOKEN"获取user_id'
|
||||
read -r -p "请输入你的user_id> " USERID
|
||||
read -r -p "$TOOLS_SYNOCHAT_URL_HINT> " URL
|
||||
read -r -p "$TOOLS_SYNOCHAT_TOKEN_HINT> " TOKEN
|
||||
comp_box "$TOOLS_SYNOCHAT_USERID_HINT"
|
||||
read -r -p "$TOOLS_SYNOCHAT_USERID_INPUT" USERID
|
||||
if [ -n "$URL" ]; then
|
||||
push_SynoChat=$USERID
|
||||
setconfig push_SynoChat "$USERID"
|
||||
setconfig push_ChatURL "$URL"
|
||||
setconfig push_ChatTOKEN "$TOKEN"
|
||||
setconfig push_ChatUSERID "$USERID"
|
||||
logger "已完成SynoChat日志推送设置!" 32
|
||||
logger "$TOOLS_SYNOCHAT_OK" 32
|
||||
else
|
||||
setconfig push_ChatURL
|
||||
setconfig push_ChatTOKEN
|
||||
@@ -462,17 +499,17 @@ log_pusher() {
|
||||
push_SynoChat=
|
||||
setconfig push_SynoChat
|
||||
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
# 在menu.sh的case $num in代码块中添加
|
||||
7)
|
||||
if [ -n "$push_Gotify" ]; then
|
||||
comp_box "是否确认关闭Gotify日志推送?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "$TOOLS_CONFIRM_CLOSE_GOTIFY"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO_BACK"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
push_Gotify=
|
||||
setconfig push_Gotify
|
||||
@@ -480,19 +517,19 @@ log_pusher() {
|
||||
continue
|
||||
fi
|
||||
else
|
||||
comp_box "请先通过Gotify服务器获取推送URL" \
|
||||
"格式示例: https://gotify.example.com/message?token=你的应用令牌"
|
||||
btm_box "\033[36m请直接你的Gotify推送URL\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " url
|
||||
comp_box "$TOOLS_GOTIFY_REG" \
|
||||
"$TOOLS_GOTIFY_FORMAT"
|
||||
btm_box "\033[36m$TOOLS_GOTIFY_URL_HINT\033[0m" \
|
||||
"$TOOLS_OR_BACK"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" url
|
||||
if [ "$url" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$url" ]; then
|
||||
push_Gotify=$url
|
||||
setconfig push_Gotify "$url"
|
||||
logger "已完成Gotify日志推送设置!" 32
|
||||
logger "$TOOLS_GOTIFY_OK" 32
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
@@ -504,7 +541,7 @@ log_pusher() {
|
||||
echo "==========================================================="
|
||||
exit
|
||||
else
|
||||
msg_alert "\033[31m未找到相关日志!\033[0m"
|
||||
msg_alert "\033[31m$TOOLS_LOG_NOT_FOUND\033[0m"
|
||||
fi
|
||||
;;
|
||||
b)
|
||||
@@ -513,16 +550,16 @@ log_pusher() {
|
||||
sleep 1
|
||||
;;
|
||||
c)
|
||||
comp_box "请直接输入本设备自定义推送名称" \
|
||||
"或直接回车确认返回上级菜单"
|
||||
read -r -p "请输入> " device_name
|
||||
comp_box "$TOOLS_DEVICE_NAME_HINT" \
|
||||
"$TOOLS_DEVICE_NAME_BACK"
|
||||
read -r -p "$TOOLS_AUTO_SSH_INPUT" device_name
|
||||
if [ -n "$device_name" ]; then
|
||||
setconfig device_name "$device_name"
|
||||
fi
|
||||
;;
|
||||
d)
|
||||
rm -rf "$TMPDIR"/ShellCrash.log
|
||||
msg_alert "\033[33m运行日志及任务日志均已清空!\033[0m"
|
||||
msg_alert "\033[33m$TOOLS_LOG_CLEARED\033[0m"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
@@ -534,14 +571,14 @@ log_pusher() {
|
||||
# 测试菜单
|
||||
testcommand() {
|
||||
while true; do
|
||||
comp_box "\033[30;47m这里是测试命令菜单\033[0m" \
|
||||
"\033[33m如遇问题尽量运行相应命令后截图提交issue或TG讨论组\033[0m"
|
||||
btm_box "1) Debug模式运行内核" \
|
||||
"2) 查看系统DNS端口(:53)占用 " \
|
||||
"3) 测试ssl加密(aes-128-gcm)跑分" \
|
||||
"4) 查看ShellCrash相关路由规则" \
|
||||
"5) 查看内核配置文件前40行" \
|
||||
"6) 测试代理服务器连通性(google.tw)" \
|
||||
comp_box "\033[30;47m$TOOLS_TEST_MENU_TITLE\033[0m" \
|
||||
"\033[33m$TOOLS_TEST_MENU_HINT\033[0m"
|
||||
btm_box "$TOOLS_TEST_ITEM_1" \
|
||||
"$TOOLS_TEST_ITEM_2" \
|
||||
"$TOOLS_TEST_ITEM_3" \
|
||||
"$TOOLS_TEST_ITEM_4" \
|
||||
"$TOOLS_TEST_ITEM_5" \
|
||||
"$TOOLS_TEST_ITEM_6" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -557,7 +594,7 @@ testcommand() {
|
||||
echo "==========================================================="
|
||||
netstat -ntulp | grep 53
|
||||
echo
|
||||
echo -e "可以使用\033[44m netstat -ntulp |grep xxx \033[0m来查询任意(xxx)端口"
|
||||
echo -e "$TOOLS_NETSTAT_HINT"
|
||||
echo "==========================================================="
|
||||
;;
|
||||
3)
|
||||
@@ -611,7 +648,7 @@ testcommand() {
|
||||
iptables -t nat -L shellcrash_vm --line-numbers
|
||||
iptables -t nat -L shellcrash_vm_dns --line-numbers
|
||||
}
|
||||
echo "----------------本机防火墙---------------------"
|
||||
echo "$TOOLS_FW_TITLE"
|
||||
iptables -L INPUT --line-numbers
|
||||
fi
|
||||
;;
|
||||
@@ -621,7 +658,7 @@ testcommand() {
|
||||
sed -n '1,40p' "$config_path"
|
||||
;;
|
||||
6)
|
||||
comp_box "\033[33m注意:依赖curl(不支持wget),且测试结果不保证一定准确!\033[0m"
|
||||
comp_box "\033[33m$TOOLS_PROXY_NOTE\033[0m"
|
||||
delay=$(
|
||||
curl -kx ${authentication}@127.0.0.1:$mix_port -o /dev/null -s -w '%{time_starttransfer}' 'https://google.tw' &
|
||||
{
|
||||
@@ -633,9 +670,9 @@ testcommand() {
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ $(echo ${#delay}) -gt 1 ]; then
|
||||
content_line "\033[32m连接成功!响应时间为:"$delay" ms\033[0m"
|
||||
content_line "\033[32m$TOOLS_PROXY_OK$delay ms\033[0m"
|
||||
else
|
||||
content_line "\033[31m连接超时!请重试或检查节点配置!\033[0m"
|
||||
content_line "\033[31m$TOOLS_PROXY_TIMEOUT\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
;;
|
||||
@@ -648,19 +685,19 @@ testcommand() {
|
||||
|
||||
debug() {
|
||||
echo "$crashcore" | grep -q 'singbox' && config_tmp="$TMPDIR"/jsons || config_tmp="$TMPDIR"/config.yaml
|
||||
comp_box "\033[36m注意:Debug运行均会停止原本的内核服务\033[0m" \
|
||||
"后台运行日志地址:\033[32m$TMPDIR/debug.log\033[0m" \
|
||||
"如长时间运行后台监测,日志等级推荐error!防止文件过大!" \
|
||||
"你亦可通过:\033[33mcrash -s debug 'warning'\033[0m命令使用其他日志等级"
|
||||
content_line "1) 仅测试\033[32m$config_tmp\033[0m配置文件可用性"
|
||||
content_line "2) 前台运行\033[32m$config_tmp\033[0m配置文件,不配置防火墙劫持(\033[33m使用Ctrl+C手动停止\033[0m)"
|
||||
content_line "3) 后台运行完整启动流程并配置防火墙劫持,日志等级:\033[31merror\033[0m"
|
||||
content_line "4) 后台运行完整启动流程并配置防火墙劫持,日志等级:\033[32minfo\033[0m"
|
||||
content_line "5) 后台运行完整启动流程并配置防火墙劫持,日志等级:\033[33mdebug\033[0m"
|
||||
content_line "6) 后台运行完整启动流程并配置防火墙劫持,且将错误日志打印到闪存:\033[32m$CRASHDIR/debug.log\033[0m"
|
||||
comp_box "\033[36m$TOOLS_DEBUG_WARN1\033[0m" \
|
||||
"${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_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_PREFIX}\033[32m$CRASHDIR/debug.log\033[0m${TOOLS_DEBUG_ITEM_6_SUFFIX}"
|
||||
content_line ""
|
||||
content_line "8) 后台运行完整启动流程,输出执行错误并查找上下文,之后关闭进程"
|
||||
[ -s "$TMPDIR"/jsons/inbounds.json ] && content_line "9) 将\033[32m$config_tmp\033[0m下json文件合并为$TMPDIR/debug.json"
|
||||
content_line "$TOOLS_DEBUG_ITEM_8"
|
||||
[ -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
|
||||
@@ -704,11 +741,11 @@ debug() {
|
||||
main_menu
|
||||
;;
|
||||
6)
|
||||
comp_box "频繁写入闪存会导致闪存寿命降低,如非遇到会导致设备死机或重启的bug,请勿使用此功能!" \
|
||||
"是否确认启用此功能?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "请输入对应标号> " res
|
||||
comp_box "\033[33m$TOOLS_FLASH_WARN\033[0m" \
|
||||
"$TOOLS_FLASH_CONFIRM"
|
||||
btm_box "$TOOLS_YES" \
|
||||
"$TOOLS_NO"
|
||||
read -r -p "$TOOLS_SELECT_PROMPT" res
|
||||
if [ "$res" = 1 ]; then
|
||||
"$CRASHDIR"/start.sh debug debug flash
|
||||
fi
|
||||
@@ -719,10 +756,10 @@ debug() {
|
||||
main_menu
|
||||
;;
|
||||
9)
|
||||
. "$CRASHDIR"/libs/core_webget.sh && core_find && "$TMPDIR"/CrashCore merge "$TMPDIR"/debug.json -C "$TMPDIR"/jsons && line_break
|
||||
comp_box "\033[32m合并成功!\033[0m"
|
||||
. "$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
|
||||
|
||||
@@ -73,28 +73,28 @@ upgrade() {
|
||||
;;
|
||||
9)
|
||||
comp_box "$UPG_THANKS_TITLE"
|
||||
btm_box "\033[32mClash \033[0m开发:\033[36mDreamacro\033[0m" \
|
||||
btm_box "\033[32m$UPG_THANKS_ITEM_CLASH\033[0m" \
|
||||
"" \
|
||||
"\033[32msing-box \033[0m开发:\033[36mSagerNet\033[0m" \
|
||||
"项目地址:\033[32mhttps://github.com/SagerNet/sing-box\033[0m" \
|
||||
"\033[32m$UPG_THANKS_ITEM_SINGBOX\033[0m" \
|
||||
"$UPG_THANKS_ITEM_SINGBOX_URL" \
|
||||
"" \
|
||||
"\033[32mMetaCubeX \033[0m开发:\033[36mMetaCubeX\033[0m" \
|
||||
"项目地址:\033[32mhttps://github.com/MetaCubeX\033[0m" \
|
||||
"\033[32m$UPG_THANKS_ITEM_METACUBE\033[0m" \
|
||||
"$UPG_THANKS_ITEM_METACUBE_URL" \
|
||||
"" \
|
||||
"\033[32mYACD面板 \033[0m开发:\033[36mhaishanh\033[0m" \
|
||||
"项目地址:\033[32mhttps://github.com/haishanh/yacd\033[0m" \
|
||||
"\033[32m$UPG_THANKS_ITEM_YACD\033[0m" \
|
||||
"$UPG_THANKS_ITEM_YACD_URL" \
|
||||
"" \
|
||||
"\033[32mZashboard \033[0m开发:\033[36mZephyruso\033[0m" \
|
||||
"项目地址:\033[32mhttps://github.com/Zephyruso/zashboard\033[0m" \
|
||||
"\033[32m$UPG_THANKS_ITEM_ZASH\033[0m" \
|
||||
"$UPG_THANKS_ITEM_ZASH_URL" \
|
||||
"" \
|
||||
"\033[32mSubconverter \033[0m开发:\033[36mtindy2013\033[0m" \
|
||||
"项目地址:\033[32mhttps://github.com/tindy2013/subconverter\033[0m" \
|
||||
"\033[32m$UPG_THANKS_ITEM_SUB\033[0m" \
|
||||
"$UPG_THANKS_ITEM_SUB_URL" \
|
||||
"" \
|
||||
"\033[32msing-box-reF1nd \033[0m开发:\033[36mreF1nd\033[0m" \
|
||||
"项目地址:\033[32mhttps://github.com/reF1nd/sing-box\033[0m" \
|
||||
"\033[32m$UPG_THANKS_ITEM_REF1ND\033[0m" \
|
||||
"$UPG_THANKS_ITEM_REF1ND_URL" \
|
||||
"" \
|
||||
"\033[32mDustinWin \033[0m开发:\033[36mDustinWin\033[0m" \
|
||||
"开发者地址:\033[32mhttps://github.com/DustinWin\033[0m" \
|
||||
"\033[32m$UPG_THANKS_ITEM_DUSTIN\033[0m" \
|
||||
"$UPG_THANKS_ITEM_DUSTIN_URL" \
|
||||
""
|
||||
btm_box "$UPG_THANKS_SPECIAL"
|
||||
sleep 2
|
||||
@@ -300,23 +300,23 @@ getcore() {
|
||||
# 获取在线内核文件
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "正在在线获取$crashcore核心文件......"
|
||||
content_line "${UPG_GETTING_CORE_TEXT_PREFIX}${crashcore}${UPG_GETTING_CORE_TEXT_SUFFIX}"
|
||||
core_webget
|
||||
case "$?" in
|
||||
0)
|
||||
content_line "\033[32m$crashcore核心下载成功!\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
|
||||
;;
|
||||
1)
|
||||
content_line "\033[31m核心文件下载失败!\033[0m"
|
||||
content_line "\033[31m$UPG_CORE_DOWNLOAD_FAIL_TEXT\033[0m"
|
||||
separator_line "="
|
||||
[ -z "$custcorelink" ] && error_down
|
||||
;;
|
||||
*)
|
||||
content_line "\033[31m核心文件下载成功但校验失败\033[0m"
|
||||
content_line "\033[31m请尝试手动指定CPU版本\033[0m"
|
||||
content_line "\033[31m$UPG_CORE_DOWNLOAD_VERIFY_FAIL_TEXT\033[0m"
|
||||
content_line "\033[31m$UPG_CORE_DOWNLOAD_VERIFY_HINT_TEXT\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
rm -rf "${TMPDIR}"/core_new
|
||||
@@ -331,23 +331,23 @@ checkcustcore() {
|
||||
# 通过githubapi获取内核信息
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m正在获取内核文件链接......\033[0m"
|
||||
content_line "\033[32m$UPG_CORE_GET_LINK_TITLE\033[0m"
|
||||
webget "$TMPDIR"/github_api https://api.github.com/repos/"${project}"/releases/"${api_url}"
|
||||
if [ "$?" = 0 ]; then
|
||||
release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}')
|
||||
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
|
||||
separator_line "="
|
||||
|
||||
comp_box "内核版本:\033[36m$release_tag\033[0m" \
|
||||
"发布时间:\033[33m$release_date\033[0m" \
|
||||
"更新时间:\033[32m$update_date\033[0m"
|
||||
content_line "\033[33m请确认内核信息并选择:\033[0m"
|
||||
comp_box "$UPG_CORE_INFO_TITLE\033[36m$release_tag\033[0m" \
|
||||
"$UPG_CORE_INFO_TIME1\033[33m$release_date\033[0m" \
|
||||
"$UPG_CORE_INFO_TIME2\033[32m$update_date\033[0m"
|
||||
content_line "\033[33m$UPG_CORE_INFO_SELECT\033[0m"
|
||||
separator_line "-"
|
||||
grep -oE "$release_tag.*" "$TMPDIR/core.list" |
|
||||
sed 's|.*/||' |
|
||||
@@ -375,12 +375,12 @@ checkcustcore() {
|
||||
;;
|
||||
esac
|
||||
else
|
||||
content_line "\033[31m找不到可用内核,可能是开发者没有编译相关CPU架构版本的内核文件!\033[0m"
|
||||
content_line "\033[31m$UPG_CORE_NOT_FOUND\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
else
|
||||
content_line "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m"
|
||||
content_line "\033[31m$UPG_CORE_CHECK_FAIL_HINT\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
@@ -391,23 +391,25 @@ 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此处内核通常源自互联网采集,此处致谢各位开发者!\033[0m"
|
||||
content_line "\033[33m自定义内核未经过完整适配,使用出现问题请自行解决!\033[0m"
|
||||
content_line "\033[31m自定义内核已适配定时任务,但不支持小闪存模式!\033[0m"
|
||||
content_line "\033[32m如遇到网络错误请先启动ShellCrash服务!\033[0m"
|
||||
content_line "\033[36m$UPG_CUSTOM_CORE_SOURCE\033[0m"
|
||||
content_line "\033[33m$UPG_CUSTOM_CORE_WARN\033[0m"
|
||||
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 "当前内核为:\033[36m$custcore\033[0m"
|
||||
content_line "$UPG_CUSTOM_CORE_CURRENT\033[36m$custcore\033[0m"
|
||||
}
|
||||
separator_line "="
|
||||
content_line "请选择需要使用的核心:"
|
||||
content_line "$UPG_CUSTOM_CORE_SELECT"
|
||||
separator_line "-"
|
||||
btm_box "1) \033[36mMetaCubeX/mihomo\033[32m@release\033[0m版本官方内核" \
|
||||
"2) \033[36mvernesong/mihomo\033[32m@alpha\033[0m版本内核(支持Smart策略)" \
|
||||
"3) \033[36mSagerNet/sing-box\033[32m@release\033[0m版本官方内核" \
|
||||
"4) Premium-2023.08.17内核(已停止维护)" \
|
||||
"9) \033[33m自定义内核链接 \033[0m" \
|
||||
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" \
|
||||
"$UPG_CORE_MENU_9" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -434,17 +436,23 @@ 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)
|
||||
comp_box "请输入自定义内核的链接地址" \
|
||||
"(必须是以.tar.gz、.upx或.gz结尾的压缩文件)" \
|
||||
comp_box "$UPG_CUSTOM_CORE_LINK_HINT" \
|
||||
"$UPG_CUSTOM_CORE_LINK_HINT2" \
|
||||
"" \
|
||||
"或者输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " link
|
||||
"$UPG_CUSTOM_CORE_LINK_HINT3"
|
||||
read -r -p "$UPG_SOURCE_CUSTOM_INPUT" link
|
||||
if [ "$link" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$link" ]; then
|
||||
@@ -461,14 +469,14 @@ setcustcore() {
|
||||
}
|
||||
|
||||
setziptype() {
|
||||
comp_box "请选择内核内核分支及压缩方式:\033[0m"
|
||||
content_line "1) \033[36m最简编译release版本,upx压缩\033[0m"
|
||||
sub_content_line "不支持Gvisor、Tailscale、Wireguard、NaiveProxy"
|
||||
content_line "2) \033[32m标准编译release版本,tar.gz压缩\033[0m"
|
||||
sub_content_line "完整支持脚本全部内置功能"
|
||||
content_line "3) \033[33m完整编译alpha版本,gz压缩\033[0m"
|
||||
sub_content_line "占用可能略高,稳定性自测"
|
||||
content_line "0) 返回上级菜单"
|
||||
comp_box "\033[0m$UPG_ZIPTYPE_TITLE"
|
||||
content_line "$UPG_ZIPTYPE_1"
|
||||
sub_content_line "$UPG_CUSTOM_CORE_NOTE1"
|
||||
content_line "$UPG_ZIPTYPE_2"
|
||||
sub_content_line "$UPG_ZIPTYPE_2_HINT"
|
||||
content_line "$UPG_ZIPTYPE_3"
|
||||
sub_content_line "$UPG_ZIPTYPE_3_HINT"
|
||||
content_line "0) $COMMON_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
@@ -496,34 +504,33 @@ 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
|
||||
|
||||
comp_box "当前内核:\033[42;30m$crashcore\033[47;30m $core_v\033[0m" \
|
||||
"当前系统处理器架构:\033[32m$cpucore\033[0m" \
|
||||
"\033[36m如需本地上传,请将.upx .gz .tar.gz文件上传至 /tmp 目录后重新运行crash命令\033[0m" \
|
||||
comp_box "$UPG_CORE_MENU_CURRENT\033[42;30m$crashcore\033[47;30m $core_v\033[0m" \
|
||||
"$UPG_CORE_MENU_SYS\033[32m$cpucore\033[0m" \
|
||||
"\033[36m$UPG_CORE_MENU_LOCAL_HINT\033[0m" \
|
||||
"" \
|
||||
"\033[33m请选择需要使用的核心版本:\033[0m"
|
||||
"\033[33m$UPG_CORE_MENU_SELECT\033[0m"
|
||||
|
||||
content_line "1) \033[43;30mMihomo\033[0m:\033[32m$meta_v \033[32m(原meta内核)支持全面\033[0m \033[33m占用略高\033[0m"
|
||||
sub_content_line "说明文档:\033[36;4mhttps://wiki.metacubex.one\033[0m"
|
||||
content_line "${UPG_CORE_V1_PREFIX}${meta_v}${UPG_CORE_V1_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V1_DOC"
|
||||
|
||||
content_line "2) \033[43;30mSingBoxR\033[0m:\033[32m$singboxr_v \033[32m支持全面\033[0m \033[33m使用reF1nd增强分支\033[0m"
|
||||
sub_content_line "说明文档:\033[36;4mhttps://sing-boxr.dustinwin.us.kg\033[0m"
|
||||
content_line "${UPG_CORE_V2_PREFIX}${singboxr_v}${UPG_CORE_V2_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V2_DOC"
|
||||
|
||||
[ "$zip_type" = 'upx' ] && {
|
||||
content_line "3) \033[43;30mSingBox\033[0m:\033[32m$singbox_v \033[32m占用较低\033[0m \033[33m不支持providers\033[0m"
|
||||
sub_content_line "说明文档:\033[36;4mhttps://sing-box.sagernet.org\033[0m"
|
||||
content_line "${UPG_CORE_V3_PREFIX}${singbox_v}${UPG_CORE_V3_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V3_DOC"
|
||||
}
|
||||
[ "$zip_type" = 'upx' ] && {
|
||||
content_line "4) \033[43;30mClash\033[0m:\033[32m$clash_v \033[32m占用低\033[0m \033[33m不安全,已停止维护\033[0m"
|
||||
sub_content_line "说明文档:\033[36;4mhttps://lancellc.gitbook.io\033[0m"
|
||||
content_line "${UPG_CORE_V4_PREFIX}${clash_v}${UPG_CORE_V4_SUFFIX}"
|
||||
sub_content_line "$UPG_CORE_V4_DOC"
|
||||
}
|
||||
btm_box "5) 切换版本分支及压缩方式:\033[32m$zip_type\033[0m" \
|
||||
"6) \033[36m使用自定义内核\033[0m $custcore" \
|
||||
"7) \033[32m更新当前内核\033[0m" \
|
||||
"9) 手动指定处理器架构" \
|
||||
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" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -533,7 +540,7 @@ setcore() {
|
||||
;;
|
||||
1)
|
||||
[ -d "/jffs" ] && {
|
||||
msg_alert -t 2 "\033[31mMeta内核使用的GeoSite.dat数据库在华硕设备存在被系统误删的问题,可能无法使用!\033[0m"
|
||||
msg_alert -t 2 "\033[31m$UPG_CORE_ASUS_WARN\033[0m"
|
||||
}
|
||||
crashcore=meta
|
||||
custcorelink=''
|
||||
@@ -585,10 +592,10 @@ getgeo() {
|
||||
# 生成链接
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "正在从服务器获取数据库文件......"
|
||||
content_line "$UPG_GEO_GETTING"
|
||||
get_bin "$TMPDIR"/"${geoname}" bin/geodata/"$geotype"
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m文件下载失败!\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 "文件解压失败!"
|
||||
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$geotype数据库文件下载成功!\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
|
||||
@@ -619,10 +626,10 @@ getgeo() {
|
||||
getcustgeo() {
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "正在获取数据库文件......"
|
||||
content_line "$UPG_GEO_LINKING"
|
||||
webget "$TMPDIR"/"$geoname" "$custgeolink"
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m文件下载失败!\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$geotype数据库文件下载成功!\033[0m"
|
||||
content_line "\033[32m${UPG_GEO_OK_PREFIX}${geotype}${UPG_GEO_OK_SUFFIX}\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
sleep 1
|
||||
@@ -640,20 +647,20 @@ checkcustgeo() {
|
||||
while true; do
|
||||
[ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag"
|
||||
[ ! -s "$TMPDIR"/geo.list ] && {
|
||||
comp_box "\033[32m正在查找可更新的数据库文件......\033[0m"
|
||||
comp_box "\033[32m$UPG_GEO_FIND_TITLE\033[0m"
|
||||
webget "$TMPDIR"/github_api https://api.github.com/repos/${project}/releases/${api_url}
|
||||
release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}')
|
||||
cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE 'releases/download.*' | grep -oiE 'geosite.*\.dat"$|country.*\.mmdb"$|.*.mrs|.*.srs' | sed 's|.*/||' | sed 's/"//' >"$TMPDIR"/geo.list
|
||||
rm -rf "$TMPDIR"/github_api
|
||||
}
|
||||
if [ -s "$TMPDIR"/geo.list ]; then
|
||||
comp_box "请选择需要更新的数据库文件:"
|
||||
comp_box "$UPG_GEO_SELECT"
|
||||
awk '{print NR") "$1}' "$TMPDIR/geo.list" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
content_line "0) $COMMON_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
@@ -678,7 +685,7 @@ checkcustgeo() {
|
||||
;;
|
||||
esac
|
||||
else
|
||||
msg_alert "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m"
|
||||
msg_alert "\033[31m$UPG_CORE_CHECK_FAIL_HINT\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
@@ -687,31 +694,31 @@ checkcustgeo() {
|
||||
setcustgeo() {
|
||||
while true; do
|
||||
rm -rf "$TMPDIR"/geo.list
|
||||
comp_box "\033[36m此处数据库均源自互联网采集,此处致谢各位开发者!\033[0m" \
|
||||
"\033[32m请点击或复制链接前往项目页面查看具体说明!\033[0m" \
|
||||
"\033[31m自定义数据库不支持定时任务及小闪存模式!\033[0m" \
|
||||
"\033[33m如遇到网络错误请先启动ShellCrash服务!\033[0m"
|
||||
comp_box "\033[36m$UPG_GEO_CUSTOM_HINT\033[0m" \
|
||||
"\033[32m$UPG_GEO_CUSTOM_HINT2\033[0m" \
|
||||
"\033[31m$UPG_GEO_CUSTOM_HINT3\033[0m" \
|
||||
"\033[33m$UPG_GEO_CUSTOM_HINT4\033[0m"
|
||||
|
||||
content_line "\033[0m请选择需要更新的数据库项目来源:\033[0m"
|
||||
content_line "\033[0m$UPG_GEO_SOURCE_TITLE\033[0m"
|
||||
separator_line "-"
|
||||
content_line "1) \033[36;4mhttps://github.com/MetaCubeX/meta-rules-dat\033[0m"
|
||||
sub_content_line "(仅限Clash/Mihomo)"
|
||||
sub_content_line "$UPG_GEO_LOCAL_ONLY1"
|
||||
|
||||
content_line "2) \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m"
|
||||
sub_content_line "(仅限Clash/Mihomo)"
|
||||
sub_content_line "$UPG_GEO_LOCAL_ONLY1"
|
||||
|
||||
content_line "3) \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m"
|
||||
sub_content_line "(仅限SingBox-srs)"
|
||||
sub_content_line "$UPG_GEO_LOCAL_ONLY2"
|
||||
|
||||
content_line "4) \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m"
|
||||
sub_content_line "(仅限Mihomo-mrs)"
|
||||
sub_content_line "$UPG_GEO_LOCAL_ONLY3"
|
||||
|
||||
content_line "5) \033[36;4mhttps://github.com/Loyalsoldier/geoip\033[0m"
|
||||
sub_content_line "(仅限Clash-GeoIP)"
|
||||
sub_content_line "$UPG_GEO_LOCAL_ONLY4"
|
||||
|
||||
content_line "9) \033[33m自定义数据库链接 \033[0m"
|
||||
content_line "$UPG_GEO_CUSTOM_LINK"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
content_line "0) $COMMON_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
@@ -745,7 +752,7 @@ setcustgeo() {
|
||||
;;
|
||||
9)
|
||||
line_break
|
||||
read -r -p "请输入自定义数据库的链接地址> " link
|
||||
read -r -p "$UPG_GEO_LINK_HINT" link
|
||||
[ -n "$link" ] && custgeolink="$link"
|
||||
getgeo
|
||||
;;
|
||||
@@ -759,23 +766,23 @@ setcustgeo() {
|
||||
setgeo() {
|
||||
while true; do
|
||||
. $CFG_PATH >/dev/null
|
||||
[ -n "$cn_mini_v" ] && geo_type_des=精简版 || geo_type_des=全球版
|
||||
comp_box "\033[33m注意:Mihomo内核和SingBox内核的数据库文件不通用\033[0m" \
|
||||
"在线数据库最新版本(每日同步上游):\033[32m$GeoIP_v\033[0m" \
|
||||
[ -n "$cn_mini_v" ] && geo_type_des=$UPG_GEO_TYPE_LITE || geo_type_des=$UPG_GEO_TYPE_FULL
|
||||
comp_box "\033[33m$UPG_GEO_CHOOSE_HINT\033[0m" \
|
||||
"$UPG_GEO_LATEST\033[32m$GeoIP_v\033[0m" \
|
||||
"" \
|
||||
"请选择需要更新的Geo数据库文件:"
|
||||
"$UPG_GEO_CHOOSE"
|
||||
|
||||
btm_box "1) CN-IP绕过文件(约0.1mb) \033[33m$china_ip_list_v\033[0m" \
|
||||
"2) CN-IPV6绕过文件(约30kb) \033[33m$china_ipv6_list_v\033[0m" \
|
||||
btm_box "$UPG_GEO_ITEM1 \033[33m$china_ip_list_v\033[0m" \
|
||||
"$UPG_GEO_ITEM2 \033[33m$china_ipv6_list_v\033[0m" \
|
||||
"" \
|
||||
"3) Mihomo精简版GeoIP_cn数据库(约0.1mb) \033[33m$cn_mini_v\033[0m" \
|
||||
"4) Mihomo完整版GeoSite数据库(约5mb) \033[33m$geosite_v\033[0m" \
|
||||
"$UPG_GEO_ITEM3 \033[33m$cn_mini_v\033[0m" \
|
||||
"$UPG_GEO_ITEM4 \033[33m$geosite_v\033[0m" \
|
||||
"" \
|
||||
"5) Mihomo-mrs数据库常用包(约1mb,非必要勿用)" \
|
||||
"6) Singbox-srs数据库常用包(约0.8mb,非必要勿用)" \
|
||||
"$UPG_GEO_ITEM5" \
|
||||
"$UPG_GEO_ITEM6" \
|
||||
"" \
|
||||
"8) \033[36m自定义数据库文件\033[0m" \
|
||||
"9) \033[31m清理数据库文件\033[0m" \
|
||||
"$UPG_GEO_ITEM8" \
|
||||
"$UPG_GEO_ITEM9" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -818,9 +825,9 @@ setgeo() {
|
||||
;;
|
||||
9)
|
||||
while true; do
|
||||
comp_box "\033[33m这将清理$CRASHDIR目录及/ruleset目录下所有数据库文件!\033[0m" \
|
||||
"清理后启动服务即可自动下载所需文件"
|
||||
btm_box "1) 确认清理" \
|
||||
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"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -835,7 +842,7 @@ setgeo() {
|
||||
setconfig $var
|
||||
done
|
||||
rm -rf "$CRASHDIR"/ruleset/*
|
||||
msg_alert "\033[33m所有数据库文件均已清理!\033[0m"
|
||||
msg_alert "\033[33m$UPG_GEO_CLEAN_OK\033[0m"
|
||||
break
|
||||
;;
|
||||
*)
|
||||
@@ -856,18 +863,18 @@ getdb() {
|
||||
dblink="${update_url}/"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "正在连接服务器获取安装文件......"
|
||||
content_line "$UPG_DB_GETTING"
|
||||
get_bin "$TMPDIR"/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m文件下载失败!\033[0m"
|
||||
content_line "\033[31m$UPG_DOWNLOAD_FAIL\033[0m"
|
||||
error_down
|
||||
return 1
|
||||
else
|
||||
content_line "\033[33m下载成功,正在解压文件......\033[0m"
|
||||
content_line "\033[33m$UPG_DB_DOWNLOAD_OK\033[0m"
|
||||
mkdir -p "$dbdir" >/dev/null
|
||||
tar -zxf "$TMPDIR/clashdb.tar.gz" ${tar_para} -C "$dbdir" >/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
content_line "文件解压失败!"
|
||||
content_line "$UPG_EXTRACT_FAIL"
|
||||
separator_line "="
|
||||
line_break
|
||||
sleep 1
|
||||
@@ -886,8 +893,8 @@ getdb() {
|
||||
fi
|
||||
#写入配置文件
|
||||
setconfig hostdir "'$hostdir'"
|
||||
content_line "\033[32m面板安装成功!\033[0m"
|
||||
content_line "\033[36m如未生效,请使用【Ctrl+F5】强制刷新浏览器!\033[0m"
|
||||
content_line "\033[32m$UPG_DB_OK\033[0m"
|
||||
content_line "\033[36m$UPG_DB_REFRESH_HINT\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
rm -rf "$TMPDIR"/clashdb.tar.gz
|
||||
@@ -897,8 +904,8 @@ getdb() {
|
||||
|
||||
dbdir() {
|
||||
if [ -f /www/clash/CNAME ] || [ -f "$CRASHDIR"/ui/CNAME ]; then
|
||||
comp_box "\033[33m检测到已经安装过本地面板\033[0m"
|
||||
btm_box "1) 升级/覆盖安装" \
|
||||
comp_box "\033[33m$UPG_DB_INSTALLED\033[0m"
|
||||
btm_box "$UPG_DB_UPGRADE" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
@@ -907,13 +914,13 @@ dbdir() {
|
||||
[ -f "$CRASHDIR"/ui/CNAME ] && rm -rf "$CRASHDIR"/ui && dbdir="$CRASHDIR"/ui
|
||||
getdb
|
||||
else
|
||||
msg_alert "\033[33m安装已取消\033[0m"
|
||||
msg_alert "\033[33m$UPG_DB_CANCEL\033[0m"
|
||||
return 1
|
||||
fi
|
||||
elif [ -w /www ] && [ -n "$(pidof nginx)" ]; then
|
||||
comp_box "请选择面板\033[33m安装目录:\033[0m"
|
||||
btm_box "1) 在${CRASHDIR}/ui目录安装" \
|
||||
"2) 在/www/clash目录安装" \
|
||||
comp_box "$UPG_DB_DIR_SELECT"
|
||||
btm_box "${UPG_DB_DIR_1_PREFIX}${CRASHDIR}${UPG_DB_DIR_1_SUFFIX}" \
|
||||
"$UPG_DB_DIR_2" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -945,19 +952,19 @@ dbdir() {
|
||||
|
||||
setdb() {
|
||||
while true; do
|
||||
comp_box "\033[36m安装 dashboard 管理面板到本地\033[0m" \
|
||||
"\033[32m打开管理面板的速度更快且更稳定\033[0m" \
|
||||
comp_box "\033[36m$UPG_DB_TITLE\033[0m" \
|
||||
"\033[32m$UPG_DB_TITLE2\033[0m" \
|
||||
"" \
|
||||
"请选择面板安装类型:"
|
||||
btm_box " - - - - - - -维护中- - - - - - -" \
|
||||
"1) 安装\033[32mzashboard面板\033[0m(约2.2mb)" \
|
||||
"2) 安装\033[32mMetaXD面板\033[0m(约1.5mb)" \
|
||||
"3) 安装\033[32mYacd-Meta魔改面板\033[0m(约1.7mb)" \
|
||||
" - - - - - -已停止维护- - - - - -" \
|
||||
"4) 安装\033[32m基础面板\033[0m(约500kb)" \
|
||||
"5) 安装\033[32mMeta基础面板\033[0m(约800kb)" \
|
||||
"6) 安装\033[32mYacd面板\033[0m(约1.1mb)" \
|
||||
"9) \033[31m卸载本地面板\033[0m" \
|
||||
"$UPG_DB_SELECT"
|
||||
btm_box "$UPG_DB_WIP" \
|
||||
"$UPG_DB_INSTALL_1" \
|
||||
"$UPG_DB_INSTALL_2" \
|
||||
"$UPG_DB_INSTALL_3" \
|
||||
"$UPG_DB_OLD" \
|
||||
"$UPG_DB_INSTALL_4" \
|
||||
"$UPG_DB_INSTALL_5" \
|
||||
"$UPG_DB_INSTALL_6" \
|
||||
"$UPG_DB_UNINSTALL" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -993,8 +1000,8 @@ setdb() {
|
||||
;;
|
||||
9)
|
||||
while true; do
|
||||
comp_box "是否卸载本地面板?"
|
||||
btm_box "1) 确认卸载" \
|
||||
comp_box "$UPG_DB_UNINSTALL_CONFIRM"
|
||||
btm_box "$UPG_DB_UNINSTALL_YES" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -1005,7 +1012,7 @@ setdb() {
|
||||
rm -rf /www/clash
|
||||
rm -rf "$CRASHDIR"/ui
|
||||
rm -rf "$BINDIR"/ui
|
||||
msg_alert "\033[31m面板已经卸载!\033[0m"
|
||||
msg_alert "\033[31m$UPG_DB_UNINSTALL_OK\033[0m"
|
||||
break
|
||||
;;
|
||||
*)
|
||||
@@ -1025,10 +1032,10 @@ setdb() {
|
||||
getcrt() {
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "正在连接服务器获取安装文件......"
|
||||
content_line "$UPG_DB_GETTING"
|
||||
get_bin "$TMPDIR"/ca-certificates.crt bin/fix/ca-certificates.crt echooff
|
||||
if [ "$?" = "1" ]; then
|
||||
content_line "\033[31m文件下载失败!\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 #镜像化设备特殊处理
|
||||
@@ -1040,7 +1047,7 @@ getcrt() {
|
||||
export CURL_CA_BUNDLE="$crtdir"
|
||||
echo "export CURL_CA_BUNDLE=$crtdir" >>/etc/profile
|
||||
fi
|
||||
content_line "\033[32m证书安装成功!\033[0m"
|
||||
content_line "\033[32m$UPG_CRT_DB_OK\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
@@ -1058,22 +1065,22 @@ setcrt() {
|
||||
if [ -n "$openssldir" ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "安装/更新本地根证书文件(ca-certificates.crt)"
|
||||
content_line "\033[33m用于解决证书校验错误,x509报错等问题\033[0m"
|
||||
content_line "\033[31m无上述问题的设备请勿使用!\033[0m"
|
||||
content_line "$UPG_CRT_TITLE1"
|
||||
content_line "\033[33m$UPG_CRT_TITLE2\033[0m"
|
||||
content_line "\033[31m$UPG_CRT_TITLE3\033[0m"
|
||||
if [ -f "$crtdir" ]; then
|
||||
content_line ""
|
||||
content_line "\033[33m检测到系统已经存在根证书文件:\033[0m"
|
||||
content_line "\033[33m$UPG_CRT_EXISTS\033[0m"
|
||||
content_line "\033[33m($crtdir)\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
|
||||
if [ -f "$crtdir" ]; then
|
||||
content_line "1) 覆盖更新"
|
||||
content_line "$UPG_CRT_UPDATE"
|
||||
else
|
||||
content_line "1) 立即安装"
|
||||
content_line "$UPG_CRT_INSTALL"
|
||||
fi
|
||||
content_line "0) 返回上级菜单"
|
||||
content_line "0) $COMMON_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -1091,7 +1098,7 @@ setcrt() {
|
||||
esac
|
||||
|
||||
else
|
||||
msg_alert "\033[33m设备可能尚未安装openssl,无法安装证书文件!\033[0m"
|
||||
msg_alert "\033[33m$UPG_CRT_WARN\033[0m"
|
||||
break
|
||||
fi
|
||||
|
||||
@@ -1104,38 +1111,39 @@ saveserver() {
|
||||
setconfig url_id "$url_id"
|
||||
setconfig release_type "$release_type"
|
||||
version_new=''
|
||||
msg_alert -t 0 "\033[32m源地址切换成功!\033[0m"
|
||||
msg_alert -t 0 "\033[32m$UPG_SOURCE_SWITCH_OK\033[0m"
|
||||
}
|
||||
|
||||
# 安装源
|
||||
setserver() {
|
||||
while true; do
|
||||
line_break
|
||||
[ -z "$release_type" ] && release_name=未指定
|
||||
[ -n "$release_type" ] && release_name="$release_type(回退)"
|
||||
[ "$release_type" = stable ] && release_name=稳定版
|
||||
[ "$release_type" = master ] && release_name=公测版
|
||||
[ "$release_type" = dev ] && release_name=开发版
|
||||
[ -n "$url_id" ] && url_name=$(grep "$url_id" "$CRASHDIR"/configs/servers.list 2>/dev/null | awk '{print $2}') || url_name="$update_url"
|
||||
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" "$LISTFILE" 2>/dev/null | awk '{print $2}') || url_name="$update_url"
|
||||
|
||||
comp_box "\033[30;47m切换ShellCrash版本及更新源地址\033[0m" \
|
||||
comp_box "\033[30;47m$UPG_SOURCE_TITLE\033[0m" \
|
||||
"" \
|
||||
"当前版本:\033[4;33m$release_name\033[0m" \
|
||||
"当前源:\n\033[4;32m$url_name\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"
|
||||
done
|
||||
|
||||
btm_box "" \
|
||||
"a) 切换至\033[32m稳定版-stable\033[0m" \
|
||||
"b) 切换至\033[36m公测版-master\033[0m" \
|
||||
"c) 切换至\033[33m开发版-dev\033[0m" \
|
||||
"$UPG_SOURCE_SWITCH_STABLE" \
|
||||
"$UPG_SOURCE_SWITCH_MASTER" \
|
||||
"$UPG_SOURCE_SWITCH_DEV" \
|
||||
"" \
|
||||
"d) 自定义源地址(用于本地源或自建源)" \
|
||||
"e) \033[31m版本回退\033[0m" \
|
||||
"$UPG_SOURCE_CUSTOM" \
|
||||
"$UPG_SOURCE_ROLLBACK" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
@@ -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
|
||||
@@ -1174,12 +1182,12 @@ setserver() {
|
||||
;;
|
||||
c)
|
||||
while true; do
|
||||
comp_box "\033[33m开发版未经过妥善测试,可能依然存在大量bug!!!\033[0m" \
|
||||
"\033[33m如果你没有足够的耐心或者测试经验,切勿使用此版本!\033[0m" \
|
||||
"请务必加入我们的讨论组:\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
content_line "是否依然切换到开发版?"
|
||||
comp_box "\033[33m$UPG_SOURCE_DEV_WARN1\033[0m" \
|
||||
"\033[33m$UPG_SOURCE_DEV_WARN2\033[0m" \
|
||||
"$UPG_SOURCE_DEV_WARN3"
|
||||
content_line "$UPG_SOURCE_DEV_CONFIRM"
|
||||
separator_line "-"
|
||||
btm_box "1) 确认切换" \
|
||||
btm_box "$UPG_SOURCE_DEV_YES" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -1199,9 +1207,9 @@ setserver() {
|
||||
done
|
||||
;;
|
||||
d)
|
||||
comp_box "\033[36m请直接输入个人源路径\033[0m" \
|
||||
"或者输入 0 返回上级菜单"
|
||||
read -r -p "请输入个人源路径> " update_url
|
||||
comp_box "\033[36m$UPG_SOURCE_CUSTOM_HINT\033[0m" \
|
||||
"$UPG_CUSTOM_CORE_LINK_HINT3"
|
||||
read -r -p "$UPG_SOURCE_CUSTOM_INPUT" update_url
|
||||
if [ "$update_url" = 0 ]; then
|
||||
continue
|
||||
elif [ ! -z "$update_url" ]; then
|
||||
@@ -1214,16 +1222,16 @@ setserver() {
|
||||
if [ -n "$url_id" ] && [ "$url_id" -lt 200 ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m正在获取版本信息......\033[0m"
|
||||
content_line "\033[32m$UPG_SOURCE_VER_GETTING\033[0m"
|
||||
. "$CRASHDIR"/libs/web_get_lite.sh
|
||||
list=$(web_get_lite https://api.github.com/repos/juewuy/ShellCrash/tags | grep -E '"name": "[0-9]' | cut -d '"' -f4)
|
||||
if [ "$?" = "0" ]; then
|
||||
content_line "\033[32m获取版本信息成功\033[0m"
|
||||
content_line "\033[32m$UPG_SOURCE_VER_OK\033[0m"
|
||||
separator_line "="
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请选择想要回退至的具体版本:\033[0m"
|
||||
content_line "\033[31m$UPG_SOURCE_ROLLBACK_SELECT\033[0m"
|
||||
list_box "$list"
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -1239,15 +1247,15 @@ setserver() {
|
||||
continue
|
||||
fi
|
||||
else
|
||||
content_line "\033[31m版本回退信息获取失败,请尝试更换其他安装源!\033[0m"
|
||||
content_line "\033[31m$UPG_SOURCE_ROLLBACK_FAIL\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
continue
|
||||
fi
|
||||
rm -rf "$TMPDIR"/tags
|
||||
else
|
||||
msg_alert "\033[31m当前源不支持版本回退\033[0m" \
|
||||
"\033[31m请尝试更换其他安装源!\033[0m"
|
||||
msg_alert "\033[31m$UPG_SOURCE_ROLLBACK_NOTSUP\033[0m" \
|
||||
"\033[31m$UPG_SOURCE_ROLLBACK_HINT\033[0m"
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -3,17 +3,47 @@
|
||||
|
||||
load_lang check_port
|
||||
|
||||
_get_netstat_cmd() {
|
||||
case "$1" in
|
||||
tcp) echo "netstat -ntl" ;;
|
||||
udp) echo "netstat -nul" ;;
|
||||
*) echo "netstat -ntul" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
check_port() {
|
||||
if [ "$1" -gt 65535 ] || [ "$1" -le 1 ]; then
|
||||
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
|
||||
elif echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep -q "|$1|"; then
|
||||
msg_alert "\033[31m$CHECK_PORT_DUP_ERR\033[0m"
|
||||
return 1
|
||||
elif netstat -ntul | grep -q ":$1[[:space:]]"; then
|
||||
fi
|
||||
|
||||
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
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
check_port_with_info() {
|
||||
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)
|
||||
|
||||
if [ -n "$conflict_line" ]; then
|
||||
echo "$conflict_line"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
[ -n "$__IS_MODULE_FW_FILTER_LOADED" ] && return
|
||||
__IS_MODULE_FW_FILTER_LOADED=1
|
||||
load_lang fw_filter
|
||||
|
||||
# 流量过滤
|
||||
set_fw_filter() {
|
||||
@@ -11,15 +12,15 @@ 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 "1) 过滤非常用端口: \033[36m$common_ports\033[0m ———用于过滤P2P流量" \
|
||||
"2) 过滤局域网设备: \033[36m$mac_return\033[0m ———使用黑/白名单进行过滤" \
|
||||
"3) 过滤QUIC协议: \033[36m$quic_rj\033[0m ———优化视频性能" \
|
||||
"4) 过滤CN_IP(4&6)列表:\033[36m$cn_ip_route\033[0m ———优化性能" \
|
||||
"5) 自定义透明路由ipv4网段:适合vlan等复杂网络环境" \
|
||||
"6) 自定义保留地址ipv4网段:需要以保留地址为访问目标的环境" \
|
||||
[ -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" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
"$FWF_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
@@ -27,9 +28,9 @@ set_fw_filter() {
|
||||
;;
|
||||
1)
|
||||
if [ -n "$(pidof CrashCore)" ] && [ "$firewall_mod" = 'iptables' ]; then
|
||||
comp_box "切换时将停止服务,是否继续:"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
comp_box "$FWF_SWITCH_STOP"
|
||||
btm_box "$FWF_YES" \
|
||||
"$FWF_NO_BACK"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && "$CRASHDIR"/start.sh stop && set_common_ports
|
||||
else
|
||||
@@ -47,10 +48,10 @@ set_fw_filter() {
|
||||
3)
|
||||
if [ "$quic_rj" = "OFF" ]; then
|
||||
quic_rj=ON
|
||||
msg_alert "\033[33m已禁止QUIC流量通过ShellCrash内核!\033[0m"
|
||||
msg_alert "\033[33m$FWF_QUIC_OFF\033[0m"
|
||||
else
|
||||
quic_rj=OFF
|
||||
msg_alert "\033[33m已取消禁止QUIC协议流量!\033[0m"
|
||||
msg_alert "\033[33m$FWF_QUIC_ON\033[0m"
|
||||
fi
|
||||
setconfig quic_rj $quic_rj
|
||||
;;
|
||||
@@ -58,15 +59,15 @@ set_fw_filter() {
|
||||
if [ -n "$(ipset -v 2>/dev/null)" ] || [ "$firewall_mod" = 'nftables' ]; then
|
||||
if [ "$cn_ip_route" = "OFF" ]; then
|
||||
cn_ip_route=ON
|
||||
msg_alert -t 2 "\033[32m已开启CN_IP绕过内核功能!\033[0m" \
|
||||
"\033[31m注意:此功能会导致全局模式及一切CN相关规则失效!\033[0m"
|
||||
msg_alert -t 2 "\033[32m$FWF_CNIP_ON\033[0m" \
|
||||
"\033[31m$FWF_CNIP_WARN\033[0m"
|
||||
else
|
||||
cn_ip_route=OFF
|
||||
msg_alert "\033[33m已禁用CN_IP绕过内核功能!\033[0m"
|
||||
msg_alert "\033[33m$FWF_CNIP_OFF\033[0m"
|
||||
fi
|
||||
setconfig cn_ip_route $cn_ip_route
|
||||
else
|
||||
msg_alert "\033[31m当前设备缺少ipset模块或未使用nftables模式,无法启用绕过功能!\033[0m"
|
||||
msg_alert "\033[31m$FWF_NO_IPSET\033[0m"
|
||||
fi
|
||||
;;
|
||||
5)
|
||||
@@ -87,19 +88,19 @@ set_common_ports() {
|
||||
[ -z "$multiport" ] && multiport='22,80,443,8080,8443'
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\n\033[0mMIX模式下,所有fake-ip来源的非常用端口流量不会被过滤"
|
||||
content_line "\033[31m$FWF_COMMON_NOTE\033[0m$FWF_MIX_NOTE"
|
||||
if [ -n "$common_ports" ]; then
|
||||
content_line ""
|
||||
content_line "当前已放行端口:\033[36m$multiport\033[0m"
|
||||
content_line "$FWF_ALLOWED_PORTS\033[36m$multiport\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
btm_box "1) 启用/关闭端口过滤: \033[36m$common_ports\033[0m" \
|
||||
"2) 添加放行端口" \
|
||||
"3) 移除指定放行端口" \
|
||||
"4) 重置默认放行端口" \
|
||||
"5) 重置为旧版放行端口" \
|
||||
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" \
|
||||
"$FWF_PORT_MENU_5" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
"$FWF_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
@@ -122,18 +123,18 @@ set_common_ports() {
|
||||
while true; do
|
||||
port_count=$(echo "$multiport" | awk -F',' '{print NF}')
|
||||
if [ "$port_count" -ge 15 ]; then
|
||||
comp_box "\033[31m最多支持设置放行15个端口,请先减少一些!\033[0m"
|
||||
comp_box "\033[31m$FWF_MAX_PORT\033[0m"
|
||||
else
|
||||
comp_box "当前已放行端口:\033[36m$multiport\033[0m"
|
||||
btm_box "\033[36m请直接输入要放行的端口号\033[0m\n(每次只能输入一个端口号,切勿一次添加多个端口号)" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " port
|
||||
comp_box "$FWF_ALLOWED_PORTS\033[36m$multiport\033[0m"
|
||||
btm_box "\033[36m$FWF_INPUT_ADD_HINT\033[0m\n$FWF_INPUT_ADD_HINT2" \
|
||||
"$FWF_OR_BACK"
|
||||
read -r -p "$FWF_INPUT_PORT" port
|
||||
if [ "$port" = 0 ]; then
|
||||
break
|
||||
elif echo ",$multiport," | grep -q ",$port,"; then
|
||||
msg_alert "\033[31m输入错误!请勿重复添加!\033[0m"
|
||||
msg_alert "\033[31m$FWF_ERR_DUP\033[0m"
|
||||
elif [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
msg_alert "\033[31m输入错误!请输入正确的数值(1~65535)!\033[0m"
|
||||
msg_alert "\033[31m$FWF_ERR_RANGE\033[0m"
|
||||
else
|
||||
multiport=$(echo "$multiport,$port" | sed "s/^,//")
|
||||
|
||||
@@ -148,15 +149,15 @@ set_common_ports() {
|
||||
;;
|
||||
3)
|
||||
while true; do
|
||||
comp_box "当前已放行端口:\033[36m$multiport\033[0m"
|
||||
btm_box "\033[36m请直接输入要移除的端口号\033[0m\n(每次只能输入一个端口号,切勿一次添加多个端口号)" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " port
|
||||
comp_box "$FWF_ALLOWED_PORTS\033[36m$multiport\033[0m"
|
||||
btm_box "\033[36m$FWF_INPUT_REMOVE_HINT\033[0m\n$FWF_INPUT_ADD_HINT2" \
|
||||
"$FWF_OR_BACK"
|
||||
read -r -p "$FWF_INPUT_PORT" port
|
||||
if [ "$port" = 0 ]; then
|
||||
break
|
||||
elif echo ",$multiport," | grep -q ",$port,"; then
|
||||
if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
msg_alert "\033[31m输入错误!请输入正确的数值(1~65535)!\033[0m"
|
||||
msg_alert "\033[31m$FWF_ERR_RANGE\033[0m"
|
||||
else
|
||||
multiport=$(echo ",$multiport," | sed "s/,$port//; s/^,//; s/,$//")
|
||||
if setconfig multiport "$multiport"; then
|
||||
@@ -166,7 +167,7 @@ set_common_ports() {
|
||||
fi
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入错误!请输入已添加过的端口!\033[0m"
|
||||
msg_alert "\033[31m$FWF_ERR_DUP\033[0m"
|
||||
fi
|
||||
done
|
||||
;;
|
||||
@@ -198,13 +199,13 @@ set_cust_host_ipv4() {
|
||||
while true; do
|
||||
[ -z "$replace_default_host_ipv4" ] && replace_default_host_ipv4="OFF"
|
||||
. "$CRASHDIR"/starts/fw_getlanip.sh && getlanip
|
||||
comp_box "当前默认透明路由的网段为:\033[32m$host_ipv4\033[0m" \
|
||||
"当前已添加的自定义网段为:\033[36m$cust_host_ipv4\033[0m"
|
||||
btm_box "1) 移除所有自定义网段" \
|
||||
"2) 使用自定义网段覆盖默认网段 \033[36m$replace_default_host_ipv4\033[0m" \
|
||||
comp_box "$FWF_CUST_HOST_TITLE\033[32m$host_ipv4\033[0m" \
|
||||
"$FWF_CUST_HOST_TITLE2\033[36m$cust_host_ipv4\033[0m"
|
||||
btm_box "$FWF_CUST_HOST_MENU_1" \
|
||||
"$FWF_CUST_HOST_MENU_2 \033[36m$replace_default_host_ipv4\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应的序号或需要额外添加的网段> " text
|
||||
"$FWF_BACK"
|
||||
read -r -p "$FWF_CUST_HOST_HINT" text
|
||||
case "$text" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -239,7 +240,7 @@ set_cust_host_ipv4() {
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m请输入正确的网段地址!\033[0m"
|
||||
msg_alert "\033[31m$FWF_NET_ERR\033[0m"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
@@ -249,14 +250,14 @@ set_cust_host_ipv4() {
|
||||
set_reserve_ipv4() {
|
||||
while true; do
|
||||
[ -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"
|
||||
comp_box "\033[33m注意:地址必须是空格分隔,错误的设置可能导致网络回环或启动报错,请务必谨慎!\033[0m" \
|
||||
comp_box "\033[33m$FWF_RESERVE_NOTE\033[0m" \
|
||||
"" \
|
||||
"当前网段:" \
|
||||
"$FWF_RESERVE_NOW" \
|
||||
"\033[36m$reserve_ipv4\033[0m"
|
||||
btm_box "\033[36m请直接输入自定义保留地址ipv4网段\033[0m" \
|
||||
"或输入 1 重置默认网段" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " text
|
||||
btm_box "\033[36m$FWF_RESERVE_INPUT_HINT\033[0m" \
|
||||
"$FWF_RESERVE_INPUT_HINT2" \
|
||||
"$FWF_RESERVE_INPUT_HINT3"
|
||||
read -r -p "$FWF_RESERVE_PROMPT" text
|
||||
case "$text" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -273,12 +274,12 @@ set_reserve_ipv4() {
|
||||
if echo "$text" | grep -Eq "(((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])/(3[0-2]|[1-2]?[0-9]))( +|$)+"; then
|
||||
reserve_ipv4="$text"
|
||||
if setconfig reserve_ipv4 "'$reserve_ipv4'"; then
|
||||
msg_alert "已将保留地址网段设为:\033[32m$reserve_ipv4\033[0m"
|
||||
msg_alert "\033[32m$FWF_RESERVE_SET$reserve_ipv4\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$FWF_RESERVE_ERR\033[0m"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
@@ -290,33 +291,33 @@ fw_filter_lan() {
|
||||
get_devinfo() {
|
||||
dev_ip=$(cat "$dhcpdir" | grep " $dev " | awk '{print $3}') && [ -z "$dev_ip" ] && dev_ip=$dev
|
||||
dev_mac=$(cat "$dhcpdir" | grep " $dev " | awk '{print $2}') && [ -z "$dev_mac" ] && dev_mac=$dev
|
||||
dev_name=$(cat "$dhcpdir" | grep " $dev " | awk '{print $4}') && [ -z "$dev_name" ] && dev_name='未知设备'
|
||||
dev_name=$(cat "$dhcpdir" | grep " $dev " | awk '{print $4}') && [ -z "$dev_name" ] && dev_name="$FWF_LAN_NO_DEVICE"
|
||||
}
|
||||
add_mac() {
|
||||
while true; do
|
||||
comp_box "手动输入mac地址时仅支持\033[32mxx:xx:xx:xx:xx:xx\033[0m的形式"
|
||||
content_line "已添加的mac地址:"
|
||||
comp_box "$FWF_MAC_HINT"
|
||||
content_line "$FWF_MAC_EXISTED"
|
||||
content_line ""
|
||||
if [ -s "$CRASHDIR/configs/mac" ]; then
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done <"$CRASHDIR/configs/mac"
|
||||
else
|
||||
content_line "暫未添加任何mac地址"
|
||||
content_line "$FWF_NONE_MAC"
|
||||
fi
|
||||
separator_line "="
|
||||
content_line "序号 \033[33m设备IP 设备mac地址 设备名称\033[0m"
|
||||
content_line "$FWF_MAC_HEADER"
|
||||
if [ -s "$dhcpdir" ]; then
|
||||
awk '{print NR") "$3,$2,$4}' "$dhcpdir" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
else
|
||||
content_line "无纪录"
|
||||
content_line "$FWF_MAC_NONE"
|
||||
fi
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应序号或直接输入mac地址> " num
|
||||
"$FWF_BACK"
|
||||
read -r -p "$FWF_MAC_INPUT_HINT" num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
break
|
||||
@@ -324,48 +325,48 @@ fw_filter_lan() {
|
||||
if [ -z "$(cat "$CRASHDIR"/configs/mac | grep -E "$num")" ]; then
|
||||
echo "$num" | grep -oE '^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$' >>"$CRASHDIR"/configs/mac
|
||||
else
|
||||
msg_alert "\033[31m已添加的设备,请勿重复添加!\033[0m"
|
||||
msg_alert "\033[31m$FWF_MAC_DUP\033[0m"
|
||||
fi
|
||||
elif [ "$num" -le $(cat $dhcpdir 2>/dev/null | awk 'END{print NR}') ]; then
|
||||
macadd=$(cat "$dhcpdir" | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ -z "$(cat "$CRASHDIR"/configs/mac | grep -E "$macadd")" ]; then
|
||||
echo "$macadd" >>"$CRASHDIR"/configs/mac
|
||||
else
|
||||
msg_alert "\033[31m已添加的设备,请勿重复添加!\033[0m"
|
||||
msg_alert "\033[31m$FWF_MAC_DUP\033[0m"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$FWF_RESERVE_ERR\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
add_ip() {
|
||||
while true; do
|
||||
comp_box "手动输入时仅支持 \033[32m192.168.1.0/24\033[0m 或 \033[32m192.168.1.0\033[0m 的形式" \
|
||||
"不支持ipv6地址过滤,可能导致过滤失败,建议使用mac地址过滤"
|
||||
content_line "已添加的IP地址(段):"
|
||||
comp_box "$FWF_IP_HINT" \
|
||||
"$FWF_IP_HINT2"
|
||||
content_line "$FWF_IP_EXISTED"
|
||||
content_line ""
|
||||
if [ -s "$CRASHDIR/configs/ip_filter" ]; then
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done <"$CRASHDIR/configs/ip_filter"
|
||||
else
|
||||
content_line "暫未添加任何IP地址(段)"
|
||||
content_line "$FWF_NONE_IP"
|
||||
fi
|
||||
|
||||
separator_line "="
|
||||
content_line "\033[33m序号 设备IP 设备名称\033[32m"
|
||||
content_line "$FWF_IP_HEADER"
|
||||
if [ -s "$dhcpdir" ]; then
|
||||
awk '{print NR") "$3, $4}' "$dhcpdir" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
else
|
||||
content_line "无纪录"
|
||||
content_line "$FWF_MAC_NONE"
|
||||
fi
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应序号或直接输入IP地址段> " num
|
||||
"$FWF_BACK"
|
||||
read -r -p "$FWF_IP_INPUT_HINT" num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
break
|
||||
@@ -373,17 +374,17 @@ fw_filter_lan() {
|
||||
if [ -z "$(cat "$CRASHDIR"/configs/ip_filter | grep -E "$num")" ]; then
|
||||
echo "$num" | grep -oE '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(/(3[0-2]|[12]?[0-9]))?$' >>"$CRASHDIR"/configs/ip_filter
|
||||
else
|
||||
msg_alert "\033[31m已添加的地址,请勿重复添加!\033[0m"
|
||||
msg_alert "\033[31m$FWF_IP_DUP\033[0m"
|
||||
fi
|
||||
elif [ "$num" -le "$(cat "$dhcpdir" 2>/dev/null | awk 'END{print NR}')" ]; then
|
||||
ipadd=$(cat "$dhcpdir" | awk '{print $3}' | sed -n "$num"p)
|
||||
if [ -z "$(cat "$CRASHDIR"/configs/mac | grep -E "$ipadd")" ]; then
|
||||
echo "$ipadd" >>"$CRASHDIR"/configs/ip_filter
|
||||
else
|
||||
msg_alert "\033[31m已添加的地址,请勿重复添加!\033[0m"
|
||||
msg_alert "\033[31m$FWF_IP_DUP\033[0m"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$FWF_RESERVE_ERR\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
@@ -391,11 +392,11 @@ fw_filter_lan() {
|
||||
del_all() {
|
||||
while true; do
|
||||
if [ -z "$(cat "$CRASHDIR"/configs/mac "$CRASHDIR"/configs/ip_filter 2>/dev/null)" ]; then
|
||||
msg_alert "\033[31m列表中没有需要移除的设备!\033[0m"
|
||||
msg_alert "\033[31m$FWF_REMOVE_NONE\033[0m"
|
||||
break
|
||||
else
|
||||
comp_box "请选择需要移除的设备:"
|
||||
content_line " \033[32m设备IP \033[36m设备mac地址 \033[35m设备名称\033[0m"
|
||||
comp_box "$FWF_REMOVE_TITLE"
|
||||
content_line "$FWF_REMOVE_HEADER"
|
||||
i=1
|
||||
for dev in $(cat "$CRASHDIR"/configs/mac "$CRASHDIR"/configs/ip_filter 2>/dev/null); do
|
||||
get_devinfo
|
||||
@@ -404,7 +405,7 @@ fw_filter_lan() {
|
||||
i=$((i + 1))
|
||||
done
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
"$FWF_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
mac_filter_rows=$(cat "$CRASHDIR"/configs/mac 2>/dev/null | wc -l)
|
||||
ip_filter_rows=$(cat "$CRASHDIR"/configs/ip_filter 2>/dev/null | wc -l)
|
||||
@@ -413,13 +414,13 @@ fw_filter_lan() {
|
||||
break
|
||||
elif [ "$num" -le "$mac_filter_rows" ]; then
|
||||
sed -i "${num}d" "$CRASHDIR"/configs/mac
|
||||
msg_alert "\033[32m对应设备已移除!\033[0m"
|
||||
msg_alert "\033[32m$FWF_REMOVE_OK\033[0m"
|
||||
elif [ "$num" -le $((mac_filter_rows + ip_filter_rows)) ]; then
|
||||
num=$((num - mac_filter_rows))
|
||||
sed -i "${num}d" "$CRASHDIR"/configs/ip_filter
|
||||
msg_alert "\033[32m对应设备已移除!\033[0m"
|
||||
msg_alert "\033[32m$FWF_REMOVE_OK\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$FWF_RESERVE_ERR\033[0m"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
@@ -432,22 +433,24 @@ fw_filter_lan() {
|
||||
[ -z "$dhcpdir" ] && [ -f /tmp/dnsmasq.leases ] && dhcpdir='/tmp/dnsmasq.leases'
|
||||
[ -z "$dhcpdir" ] && dhcpdir='/dev/null'
|
||||
[ -z "$macfilter_type" ] && macfilter_type='黑名单'
|
||||
if [ "$macfilter_type" = "黑名单" ]; then
|
||||
fw_filter_lan_over='白名单'
|
||||
fw_filter_lan_scrip='不'
|
||||
if [ "$macfilter_type" = '黑名单' ]; then
|
||||
macfilter_type_show="$FWF_BLACK_LIST"
|
||||
fw_filter_lan_over="$FWF_WHITE_LIST"
|
||||
fw_filter_lan_desc="$FWF_FILTER_BLACK_DESC"
|
||||
else
|
||||
fw_filter_lan_over='黑名单'
|
||||
fw_filter_lan_scrip=''
|
||||
macfilter_type_show="$FWF_WHITE_LIST"
|
||||
fw_filter_lan_over="$FWF_BLACK_LIST"
|
||||
fw_filter_lan_desc="$FWF_FILTER_WHITE_DESC"
|
||||
fi
|
||||
|
||||
comp_box "\033[30;47m请在此添加或移除设备\033[0m" \
|
||||
comp_box "\033[30;47m$FWF_FILTER_MENU_TITLE\033[0m" \
|
||||
"" \
|
||||
"当前过滤方式为:\033[33m$macfilter_type模式\033[0m" \
|
||||
"仅列表内设备流量\033[36m$fw_filter_lan_scrip经过\033[0m内核"
|
||||
"$FWF_FILTER_MODE\033[33m$macfilter_type_show$FWF_FILTER_MODE_SUFFIX\033[0m" \
|
||||
"\033[36m$fw_filter_lan_desc\033[0m"
|
||||
if [ -n "$(cat "$CRASHDIR"/configs/mac)" ]; then
|
||||
content_line "当前已过滤设备为:"
|
||||
content_line "$FWF_FILTER_EXISTED"
|
||||
content_line ""
|
||||
content_line " \033[36m设备mac/ip地址\033[0m \033[35m设备名称\033[0m"
|
||||
content_line "$FWF_FILTER_HEADER"
|
||||
for dev in $(cat "$CRASHDIR"/configs/mac 2>/dev/null); do
|
||||
get_devinfo
|
||||
content_line "$(printf "\033[36m%-20s \033[35m%s\033[0m" \
|
||||
@@ -460,22 +463,26 @@ fw_filter_lan() {
|
||||
done
|
||||
separator_line "="
|
||||
fi
|
||||
btm_box "1) 切换为\033[33m$fw_filter_lan_over模式\033[0m" \
|
||||
"2) \033[32m添加指定设备(mac地址)\033[0m" \
|
||||
"3) \033[32m添加指定设备(IP地址/网段)\033[0m" \
|
||||
"4) \033[36m移除指定设备\033[0m" \
|
||||
"9) \033[31m清空整个列表\033[0m" \
|
||||
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" \
|
||||
"$FWF_FILTER_CLEAR" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
"$FWF_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
macfilter_type=$fw_filter_lan_over
|
||||
if setconfig macfilter_type $macfilter_type; then
|
||||
msg_alert "\033[32m已切换为$macfilter_type模式!\033[0m"
|
||||
if [ "$macfilter_type" = '黑名单' ]; then
|
||||
macfilter_type='白名单'
|
||||
else
|
||||
macfilter_type='黑名单'
|
||||
fi
|
||||
if setconfig macfilter_type "$macfilter_type"; then
|
||||
msg_alert "\033[32m$FWF_SWITCH_OK\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
@@ -492,7 +499,7 @@ fw_filter_lan() {
|
||||
9)
|
||||
: >"$CRASHDIR"/configs/mac
|
||||
: >"$CRASHDIR"/configs/ip_filter
|
||||
msg_alert "\033[31m设备列表已清空!\033[0m"
|
||||
msg_alert "\033[31m$FWF_LIST_CLEARED\033[0m"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
|
||||
@@ -3,27 +3,27 @@
|
||||
|
||||
[ -n "$__IS_MODULE_OVERRIDE" ] && return
|
||||
__IS_MODULE_OVERRIDE=1
|
||||
|
||||
YAMLSDIR="$CRASHDIR"/yamls
|
||||
JSONSDIR="$CRASHDIR"/jsons
|
||||
load_lang override
|
||||
|
||||
# 配置文件覆写
|
||||
override() {
|
||||
while true; do
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] && server_link=1
|
||||
comp_box "\033[30;47m 欢迎使用配置文件覆写功能!\033[0m"
|
||||
content_line "2) 管理\033[36m自定义规则\033[0m"
|
||||
comp_box "\033[30;47m $OVR_TITLE\033[0m"
|
||||
content_line "$OVR_MENU_2"
|
||||
echo "$crashcore" | grep -q 'singbox' || {
|
||||
content_line "3) 管理\033[33m自定义节点\033[0m"
|
||||
content_line "4) 管理\033[36m自定义策略组\033[0m"
|
||||
content_line "$OVR_MENU_3"
|
||||
content_line "$OVR_MENU_4"
|
||||
}
|
||||
content_line "5) \033[32m自定义\033[0m高级功能"
|
||||
[ "$disoverride" != 1 ] && content_line "9) \033[33m禁用\033[0m配置文件覆写"
|
||||
content_line "$OVR_MENU_5"
|
||||
[ "$disoverride" != 1 ] && content_line "$OVR_MENU_9"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
content_line "$OVR_BACK"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -46,12 +46,12 @@ override() {
|
||||
sleep 3
|
||||
;;
|
||||
9)
|
||||
comp_box "\033[33m此功能可能会导致严重问题!启用后脚本中大部分功能都将禁用!!!\033[0m" \
|
||||
"如果你不是非常了解$crashcore的运行机制,切勿开启!\033[0m" \
|
||||
"\033[33m继续后如出现任何问题,请务必自行解决,一切提问恕不受理!\033[0m"
|
||||
comp_box "\033[33m$OVR_WARN_1\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 "1) 我确认遇到问题可以自行解决" \
|
||||
"0) 返回上级菜单"
|
||||
btm_box "$OVR_WARN_CONFIRM" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = '1' ] && {
|
||||
disoverride=1
|
||||
@@ -72,15 +72,15 @@ override() {
|
||||
# 自定义规则
|
||||
setrules() {
|
||||
set_rule_type() {
|
||||
comp_box "\033[33m请选择规则类型:\033[0m"
|
||||
comp_box "\033[33m$OVR_RULES_TYPE\033[0m"
|
||||
printf '%s\n' "$rule_type" |
|
||||
awk '{for (i = 1; i <= NF; i++) print i") " $i}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"$OVR_BACK"
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
[0-9]*)
|
||||
@@ -88,8 +88,8 @@ setrules() {
|
||||
errornum
|
||||
else
|
||||
rule_type_set=$(echo "$rule_type" | cut -d' ' -f"$num")
|
||||
comp_box "\033[33m请输入规则语句,\n可以是域名、泛域名、IP网段或者其他匹配规则类型的内容\033[0m"
|
||||
read -r -p "请输入对应规则> " rule_state_set
|
||||
comp_box "\033[33m$OVR_RULES_ADD_RULE\033[0m"
|
||||
read -r -p "$OVR_RULES_INPUT_RULE" rule_state_set
|
||||
if [ -n "$rule_state_set" ]; then
|
||||
set_group_type
|
||||
else
|
||||
@@ -104,16 +104,16 @@ setrules() {
|
||||
}
|
||||
|
||||
set_group_type() {
|
||||
comp_box "\033[36m请选择具体规则\033[0m" \
|
||||
"\033[33m此处规则读取自现有配置文件,如果你后续更换配置文件时运行出错,请尝试重新添加\033[0m"
|
||||
comp_box "\033[36m$OVR_RULES_GROUP\033[0m" \
|
||||
"\033[33m$OVR_RULES_EXIST_WARN\033[0m"
|
||||
printf '%s\n' "$rule_group" |
|
||||
awk -F '#' '{for (i = 1; i <= NF; i++) print i") " $i}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"$OVR_BACK"
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
[0-9]*)
|
||||
@@ -124,7 +124,7 @@ setrules() {
|
||||
rule_all="- ${rule_type_set},${rule_state_set},${rule_group_set}"
|
||||
echo "IP-CIDR SRC-IP-CIDR IP-CIDR6" | grep -q -- "$rule_type_set" && rule_all="${rule_all},no-resolve"
|
||||
echo "$rule_all" >>"$YAMLSDIR"/rules.yaml
|
||||
msg_alert "\033[32m添加成功!\033[0m"
|
||||
msg_alert "\033[32m$OVR_RULES_ADD_OK\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -135,15 +135,15 @@ setrules() {
|
||||
|
||||
del_rule_type() {
|
||||
while true; do
|
||||
comp_box "输入对应数字即可移除相应规则:"
|
||||
comp_box "$OVR_RULES_DEL_HINT"
|
||||
sed -i '/^ *$/d; /^#/d' "$YAMLSDIR"/rules.yaml
|
||||
awk -F '#' '!/^#/ {print NR") "$1 $2 $3}' "$YAMLSDIR/rules.yaml" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"$OVR_BACK"
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -170,18 +170,18 @@ setrules() {
|
||||
}
|
||||
|
||||
while true; do
|
||||
comp_box "\033[33m你可以在这里快捷管理自定义规则\033[0m" \
|
||||
"如需批量操作,请手动编辑:\033[36m $YAMLSDIR/rules.yaml\033[0m" \
|
||||
"\033[33msingbox和clash共用此处规则,可无缝切换!\033[0m" \
|
||||
"大量规则请尽量使用rule-set功能添加,\n\033[31m此处过量添加可能导致启动卡顿!\033[0m"
|
||||
content_line "1) 新增自定义规则"
|
||||
content_line "2) 移除自定义规则"
|
||||
content_line "3) 清空规则列表"
|
||||
echo "$crashcore" | grep -q 'singbox' || content_line "4) 配置节点绕过: \033[36m$proxies_bypass\033[0m"
|
||||
comp_box "\033[33m$OVR_RULES_MENU_HINT\033[0m" \
|
||||
"$OVR_RULES_MANUAL" \
|
||||
"\033[33m$OVR_RULES_SHARED\033[0m" \
|
||||
"$OVR_RULES_WARN"
|
||||
content_line "$OVR_RULES_ADD"
|
||||
content_line "$OVR_RULES_DEL"
|
||||
content_line "$OVR_RULES_CLEAR"
|
||||
echo "$crashcore" | grep -q 'singbox' || content_line "$OVR_RULES_BYPASS \033[36m$proxies_bypass\033[0m"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
content_line "$OVR_BACK"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -195,13 +195,13 @@ setrules() {
|
||||
if [ -s "$YAMLSDIR"/rules.yaml ]; then
|
||||
del_rule_type
|
||||
else
|
||||
msg_alert "请先添加自定义规则!"
|
||||
msg_alert "$OVR_RULES_NO_RULES"
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
comp_box "是否确认清空全部自定义规则?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
comp_box "$OVR_RULES_CLEAR_CONFIRM"
|
||||
btm_box "$OVR_CONFIRM_YES" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if sed -i '/^\s*[^#]/d' "$YAMLSDIR"/rules.yaml; then
|
||||
@@ -213,13 +213,12 @@ setrules() {
|
||||
;;
|
||||
4)
|
||||
if [ "$proxies_bypass" = "OFF" ]; then
|
||||
comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" \
|
||||
"\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" \
|
||||
comp_box "\033[33m$OVR_RULES_BYPASS_WARN1\033[0m" \
|
||||
"\033[33m$OVR_RULES_BYPASS_WARN2\033[0m" \
|
||||
"" \
|
||||
"是否启用节点绕过?"
|
||||
btm_box
|
||||
"1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
"$OVR_RULES_BYPASS_PROMPT"
|
||||
btm_box "$OVR_CONFIRM_YES" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
proxies_bypass=ON
|
||||
@@ -246,28 +245,28 @@ setrules() {
|
||||
# 自定义clash策略组
|
||||
setgroups() {
|
||||
set_group_type() {
|
||||
comp_box "\033[33m注意策略组名称必须和【自定义规则】或【自定义节点】功能中指定的策略组一致!\033[0m" \
|
||||
"\033[33m建议先创建策略组,之后可在【自定义规则】或【自定义节点】功能中智能指定\033[0m" \
|
||||
"\033[33m如需在当前策略组下添加节点,请手动编辑$YAMLSDIR/proxy-groups.yaml\033[0m"
|
||||
btm_box "\033[36m请直接输入自定义策略组名称\033[0m\n(不支持纯数字且不要包含特殊字符!)" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " new_group_name
|
||||
comp_box "\033[33m$OVR_GROUPS_WARN1\033[0m" \
|
||||
"\033[33m$OVR_GROUPS_WARN2\033[0m" \
|
||||
"\033[33m$OVR_GROUPS_WARN3\033[0m"
|
||||
btm_box "\033[36m$OVR_GROUPS_INPUT_NAME\033[0m" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$OVR_PROMPT" new_group_name
|
||||
|
||||
comp_box "\033[32m请选择策略组【$new_group_name】的类型:\033[0m"
|
||||
comp_box "\033[32m$OVR_GROUPS_CHOOSE_TYPE【$new_group_name】\033[0m"
|
||||
printf '%s\n' "$group_type_cn" |
|
||||
awk '{for (i = 1; i <= NF; i++) print i") " $i}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$OVR_GROUPS_INPUT_NUM" num
|
||||
new_group_type=$(echo "$group_type" | awk '{print $'"$num"'}')
|
||||
if [ "$num" = "1" ]; then
|
||||
unset new_group_url interval
|
||||
else
|
||||
comp_box "请输入测速地址" \
|
||||
"或直接回车使用默认地址:https://www.gstatic.com/generate_204"
|
||||
read -r -p "请输入> " new_group_url
|
||||
comp_box "$OVR_GROUPS_URL" \
|
||||
"$OVR_GROUPS_URL_HINT"
|
||||
read -r -p "$OVR_PROMPT" new_group_url
|
||||
[ -z "$new_group_url" ] && new_group_url=https://www.gstatic.com/generate_204
|
||||
new_group_url="url: '$new_group_url'"
|
||||
interval="interval: 300"
|
||||
@@ -283,22 +282,22 @@ setgroups() {
|
||||
- DIRECT
|
||||
EOF
|
||||
sed -i "/^ *$/d" "$YAMLSDIR"/proxy-groups.yaml
|
||||
msg_alert "\033[32m添加成功!\033[0m"
|
||||
msg_alert "\033[32m$OVR_GROUPS_ADD_OK\033[0m"
|
||||
|
||||
}
|
||||
|
||||
set_group_add() {
|
||||
comp_box "\033[36m请选择想要将本策略添加到的策略组\033[0m" \
|
||||
"\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m"
|
||||
comp_box "\033[36m$OVR_PROXIES_ADD_HINT\033[0m" \
|
||||
"\033[32m$OVR_PROXIES_MULTI_HINT\033[0m"
|
||||
printf '%s\n' "$proxy_group" |
|
||||
awk -F '#' '{for (i = 1; i <= NF; i++) print i") " $i}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
content_line ""
|
||||
content_line "0) 跳过添加"
|
||||
content_line "$OVR_GROUPS_SKIP"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应数字(多个用空格分隔)> " char
|
||||
read -r -p "$OVR_PROMPT" char
|
||||
case "$char" in
|
||||
"" | 0) ;;
|
||||
*)
|
||||
@@ -317,21 +316,21 @@ EOF
|
||||
}
|
||||
|
||||
while true; do
|
||||
comp_box "\033[33m你可以在这里快捷管理自定义策略组\033[0m" \
|
||||
"\033[36m如需修改或批量操作,请手动编辑:$YAMLSDIR/proxy-groups.yaml\033[0m"
|
||||
btm_box "1) 添加自定义策略组" \
|
||||
"2) 查看自定义策略组" \
|
||||
"3) 清空自定义策略组" \
|
||||
comp_box "\033[33m$OVR_GROUPS_MENU_HINT\033[0m" \
|
||||
"\033[36m$OVR_GROUPS_MANUAL\033[0m"
|
||||
btm_box "$OVR_GROUPS_ADD" \
|
||||
"$OVR_GROUPS_VIEW" \
|
||||
"$OVR_GROUPS_CLEAR" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"$OVR_BACK"
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
group_type="select url-test fallback load-balance"
|
||||
group_type_cn="手动选择 自动选择 故障转移 负载均衡"
|
||||
group_type_cn="$OVR_GROUP_TYPE_CN"
|
||||
proxy_group="$(cat "$YAMLSDIR"/proxy-groups.yaml "$YAMLSDIR"/config.yaml 2>/dev/null | sed "/#自定义策略组开始/,/#自定义策略组结束/d" | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/#.*//' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')"
|
||||
set_group_type
|
||||
;;
|
||||
@@ -343,9 +342,9 @@ EOF
|
||||
echo "==========================================================="
|
||||
;;
|
||||
3)
|
||||
comp_box "是否确认清空全部自定义策略组?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
comp_box "$OVR_GROUPS_CLEAR_CONFIRM"
|
||||
btm_box "$OVR_CONFIRM_YES" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if echo '#用于添加自定义策略组' >"$YAMLSDIR"/proxy-groups.yaml; then
|
||||
@@ -367,16 +366,16 @@ setproxies() {
|
||||
|
||||
set_proxy_type() {
|
||||
while true; do
|
||||
comp_box "\033[33m注意\n节点格式必须是单行、不包括括号、“name:”为开头,例如:\033[0m" \
|
||||
comp_box "\033[33m$OVR_PROXIES_WARN1\033[0m" \
|
||||
"\033[36m【name: \"test\", server: 192.168.1.1, port: 12345, type: socks5, udp: true】\033[0m" \
|
||||
"更多写法请参考:\033[32mhttps://juewuy.github.io/\033[0m"
|
||||
btm_box "\033[36m请直接输入自定义节点\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " proxy_state_set
|
||||
"$OVR_PROXIES_WARN2"
|
||||
btm_box "\033[36m$OVR_PROXIES_INPUT\033[0m" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$OVR_PROMPT" proxy_state_set
|
||||
if [ "$proxy_state_set" = 0 ]; then
|
||||
break
|
||||
elif echo "$proxy_state_set" | grep -q "#"; then
|
||||
msg_alert "\033[33m绝对禁止包含【#】号!\033[0m"
|
||||
msg_alert "\033[33m$OVR_PROXIES_BLOCK_HASH\033[0m"
|
||||
elif echo "$proxy_state_set" | grep -Eq "^name:"; then
|
||||
set_group_add
|
||||
else
|
||||
@@ -386,17 +385,17 @@ setproxies() {
|
||||
}
|
||||
|
||||
set_group_add() {
|
||||
comp_box "\033[36m请选择想要将节点添加到的策略组\033[0m" \
|
||||
"\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m" \
|
||||
"\033[33m如需自定义策略组,请先使用【管理自定义策略组功能】添加\033[0m"
|
||||
comp_box "\033[36m$OVR_PROXIES_ADD_HINT\033[0m" \
|
||||
"\033[32m$OVR_PROXIES_MULTI_HINT\033[0m" \
|
||||
"\033[33m$OVR_PROXIES_GROUP_HINT\033[0m"
|
||||
printf '%s\n' "$proxy_group" |
|
||||
awk -F '#' '{for (i = 1; i <= NF; i++) print i") " $i}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字(多个用空格分隔)> " char
|
||||
"$OVR_BACK"
|
||||
read -r -p "$OVR_PROMPT" char
|
||||
case "$char" in
|
||||
"" | 0) ;;
|
||||
*)
|
||||
@@ -406,7 +405,7 @@ setproxies() {
|
||||
done
|
||||
if [ -n "$rule_group_add" ]; then
|
||||
echo "- {$proxy_state_set}$rule_group_add" >>"$YAMLSDIR"/proxies.yaml
|
||||
msg_alert "\033[32m添加成功!\033[0m"
|
||||
msg_alert "\033[32m$OVR_PROXIES_ADD_OK\033[0m"
|
||||
unset rule_group_add
|
||||
else
|
||||
errornum
|
||||
@@ -416,15 +415,15 @@ setproxies() {
|
||||
}
|
||||
|
||||
while true; do
|
||||
comp_box "\033[33m你可以在这里快捷管理自定义节点\033[0m" \
|
||||
"\033[36m如需批量操作,请手动编辑:$YAMLSDIR/proxies.yaml\033[0m"
|
||||
btm_box "1) 添加自定义节点" \
|
||||
"2) 管理自定义节点" \
|
||||
"3) 清空自定义节点" \
|
||||
"4) 配置节点绕过: \033[36m$proxies_bypass\033[0m" \
|
||||
comp_box "\033[33m$OVR_PROXIES_MENU_HINT\033[0m" \
|
||||
"\033[36m$OVR_PROXIES_MANUAL\033[0m"
|
||||
btm_box "$OVR_PROXIES_ADD" \
|
||||
"$OVR_PROXIES_MANAGE" \
|
||||
"$OVR_PROXIES_CLEAR" \
|
||||
"$OVR_PROXIES_BYPASS \033[36m$proxies_bypass\033[0m" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"$OVR_BACK"
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -437,8 +436,8 @@ setproxies() {
|
||||
2)
|
||||
sed -i '/^ *$/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null
|
||||
if [ -s "$YAMLSDIR"/proxies.yaml ]; then
|
||||
comp_box "\033[33m输入节点对应数字可以移除对应节点\033[0m" \
|
||||
"当前已添加的自定义节点为:"
|
||||
comp_box "\033[33m$OVR_PROXIES_EXIST_HINT\033[0m" \
|
||||
"$OVR_PROXIES_EXIST_TITLE"
|
||||
grep -Ev '^#' "$YAMLSDIR/proxies.yaml" |
|
||||
awk -F '[,}]' '{print NR") " $1 " " $NF}' |
|
||||
sed 's/- {//g' |
|
||||
@@ -446,8 +445,8 @@ setproxies() {
|
||||
content_line "$line"
|
||||
done
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"$OVR_BACK"
|
||||
read -r -p "$OVR_INPUT_NUM" num
|
||||
if [ "$num" = 0 ]; then
|
||||
continue
|
||||
elif [ "$num" -le $(cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | wc -l) ]; then
|
||||
@@ -460,13 +459,13 @@ setproxies() {
|
||||
errornum
|
||||
fi
|
||||
else
|
||||
msg_alert "请先添加自定义节点!"
|
||||
msg_alert "$OVR_PROXIES_NO_PROXY"
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
comp_box "是否确认清空全部自定义节点?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
comp_box "$OVR_PROXIES_CLEAR_CONFIRM"
|
||||
btm_box "$OVR_CONFIRM_YES" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if sed -i '/^\s*[^#]/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null; then
|
||||
@@ -480,12 +479,12 @@ setproxies() {
|
||||
;;
|
||||
4)
|
||||
if [ "$proxies_bypass" = "OFF" ]; then
|
||||
comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" \
|
||||
"\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" \
|
||||
comp_box "\033[33m$OVR_PROXIES_BYPASS_WARN1\033[0m" \
|
||||
"\033[33m$OVR_PROXIES_BYPASS_WARN2\033[0m" \
|
||||
"" \
|
||||
"是否确定启用节点绕过:"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
"$OVR_PROXIES_BYPASS_PROMPT"
|
||||
btm_box "$OVR_CONFIRM_YES" \
|
||||
"$OVR_CONFIRM_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
proxies_bypass=ON
|
||||
@@ -527,24 +526,24 @@ EOF
|
||||
#listeners:
|
||||
EOF
|
||||
|
||||
comp_box "\033[32m已经创建自定义设定文件:$YAMLSDIR/user.yaml !\033[0m" \
|
||||
"\033[33m可用于编写自定义的DNS等功能\033[0m" \
|
||||
comp_box "\033[32m$OVR_ADV_USER_CREATED1\033[0m" \
|
||||
"\033[33m$OVR_ADV_USER_CREATED2\033[0m" \
|
||||
"" \
|
||||
"\033[32m已经创建自定义功能文件:$YAMLSDIR/others.yaml !\033[0m" \
|
||||
"\033[33m可用于编写自定义的锚点、入站、proxy-providers、rule-set、sub-rules、script等功能\033[0m"
|
||||
"\033[32m$OVR_ADV_USER_CREATED3\033[0m" \
|
||||
"\033[33m$OVR_ADV_USER_CREATED4\033[0m"
|
||||
|
||||
btm_box "Windows下请使用\033[33mWinSCP软件\033[0m进行编辑!\033[0m" \
|
||||
"MacOS下请使用\033[33mSecureFX软件\033[0m进行编辑!\033[0m" \
|
||||
"Linux可使用\033[33mvim\033[0m进行编辑(路由设备若不显示中文请勿使用)!\033[0m"
|
||||
btm_box "\033[33m$OVR_ADV_WIN\033[0m" \
|
||||
"\033[33m$OVR_ADV_MAC\033[0m" \
|
||||
"\033[33m$OVR_ADV_LIN\033[0m"
|
||||
}
|
||||
|
||||
# s自定义singbox配置文件
|
||||
set_singbox_adv() {
|
||||
comp_box "支持覆盖脚本设置的模块有:\033[0m" \
|
||||
comp_box "\033[33m$OVR_SING_TITLE1\033[0m" \
|
||||
"\033[36mlog dns ntp certificate experimental\033[0m" \
|
||||
"支持与内置功能合并(但不可冲突)的模块有:\033[0m" \
|
||||
"\033[33m$OVR_SING_TITLE2\033[0m" \
|
||||
"\033[36mendpoints inbounds outbounds providers route services\033[0m" \
|
||||
"将相应json文件放入\033[33m$JSONSDIR\033[0m目录后即可在启动时自动加载" \
|
||||
"$OVR_SING_TITLE3" \
|
||||
"" \
|
||||
"使用前请务必参考配置教程:\033[32;4m https://juewuy.github.io/nWTjEpkSK \033[0m"
|
||||
"$OVR_SING_TITLE4"
|
||||
}
|
||||
|
||||
@@ -97,26 +97,27 @@ 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
|
||||
# 通用部分生成
|
||||
[ "$skip_cert" != "OFF" ] && override_tls='true' || override_tls='false'
|
||||
[ -n "$(echo "$2" | grep 'oics.net')" ] && domain_resolver='dns_oix' || domain_resolver='dns_resolver'
|
||||
cat >>"$TMPDIR"/providers/providers.json <<EOF
|
||||
"health_check": {
|
||||
"enabled": true,
|
||||
@@ -124,11 +125,14 @@ EOF
|
||||
"interval": "${interval}m",
|
||||
"timeout": "3s"
|
||||
},
|
||||
"override_tls": {
|
||||
"enabled": true,
|
||||
"insecure": $override_tls
|
||||
}
|
||||
},
|
||||
"override_dialer": {
|
||||
"domain_resolver": "$domain_resolver"
|
||||
},
|
||||
"override_tls": {
|
||||
"enabled": true,
|
||||
"insecure": $override_tls
|
||||
}
|
||||
},
|
||||
EOF
|
||||
# 写入提供者
|
||||
echo '{ "tag": "'"$tag"'", "type": "urltest", "tolerance": 100, "providers": ["'"$tag"'"], "include": ".*" },' >>"$TMPDIR"/providers/outbounds_add.json
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ __IS_MODULE_SUBCONVERTER=1
|
||||
|
||||
load_lang subconverter
|
||||
|
||||
LISTFILE="$CRASHDIR"/configs/servers_"$i18n".list
|
||||
|
||||
# Subconverter在线订阅转换
|
||||
subconverter() {
|
||||
while true; do
|
||||
@@ -115,8 +117,8 @@ 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 ""
|
||||
@@ -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" \
|
||||
|
||||
@@ -14,118 +14,118 @@
|
||||
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 +139,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 "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.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"
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,12 +37,12 @@ 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 "$CRASHDIR"/task/cron ] && cat "$CRASHDIR"/task/cron >>"$TMPDIR"/cron_tmp
|
||||
[ -s "$CRASHDIR"/task/running ] && cat "$CRASHDIR"/task/running >>"$TMPDIR"/cron_tmp
|
||||
[ "$bot_tg_service" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程" >>"$TMPDIR"/cron_tmp
|
||||
[ "$start_old" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh shellcrash #ShellCrash保守模式守护进程" >>"$TMPDIR"/cron_tmp
|
||||
awk '!x[$0]++' "$TMPDIR"/cron_tmp >"$TMPDIR"/cron_tmp2 #删除重复行
|
||||
cronadd "$TMPDIR"/cron_tmp2
|
||||
rm -f "$TMPDIR"/cron_tmp "$TMPDIR"/cron_tmp2
|
||||
#加载条件任务
|
||||
|
||||
@@ -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
|
||||
@@ -82,61 +82,61 @@ EOF
|
||||
[ -s "$CRASHDIR"/task/bfstart ] && . "$CRASHDIR"/task/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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:')" ] && {
|
||||
@@ -56,6 +55,8 @@ EOF
|
||||
respect-rules: true
|
||||
nameserver-policy: {'rule-set:cn': [ $dns_nameserver ]}
|
||||
proxy-server-nameserver : [ $dns_resolver ]
|
||||
proxy-server-nameserver-policy:
|
||||
'*.oix_nodes.com': '124.221.68.73:1053'
|
||||
nameserver: [ $dns_final ]
|
||||
EOF
|
||||
else
|
||||
@@ -65,8 +66,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 +104,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 +178,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,6 +201,9 @@ EOF
|
||||
cat "$TMPDIR"/rules.yaml >>"$TMPDIR"/rules.add
|
||||
mv -f "$TMPDIR"/rules.add "$TMPDIR"/rules.yaml
|
||||
}
|
||||
}
|
||||
|
||||
generate_rule_providers_and_merge_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 '^ *') #获取空格数
|
||||
@@ -220,6 +233,9 @@ EOF
|
||||
done
|
||||
#合并完整配置文件
|
||||
cut -c 1- "$TMPDIR"/set.yaml $yaml_dns $yaml_hosts $yaml_user $yaml_others $yaml_add >"$TMPDIR"/config.yaml
|
||||
}
|
||||
|
||||
validate_and_rebuild_yaml_if_needed() {
|
||||
#测试自定义配置文件
|
||||
"$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml >/dev/null
|
||||
if [ "$?" != 0 ]; then
|
||||
@@ -233,10 +249,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
|
||||
generate_rule_providers_and_merge_yaml
|
||||
validate_and_rebuild_yaml_if_needed
|
||||
finalize_clash_yaml
|
||||
}
|
||||
|
||||
@@ -31,19 +31,19 @@ get_core_config() { #下载内核配置文件
|
||||
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}')
|
||||
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 +92,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"
|
||||
|
||||
@@ -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' | 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' | 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' | 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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -9,22 +9,22 @@ profile=/etc/profile
|
||||
. "$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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user