mirror of
https://github.com/juewuy/ShellCrash.git
synced 2026-03-10 23:41:22 +00:00
Compare commits
467 Commits
1.9.4beta3
...
2c9eda6cc6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c9eda6cc6 | ||
|
|
a6cc498cbd | ||
|
|
d032742984 | ||
|
|
c373b0b7b0 | ||
|
|
31bf9915c6 | ||
|
|
cae9613225 | ||
|
|
02a342cbd1 | ||
|
|
1fbade025a | ||
|
|
65244e51da | ||
|
|
1087f57893 | ||
|
|
f5394120e1 | ||
|
|
0a52ef2531 | ||
|
|
24fc10a59f | ||
|
|
5d4fcc2271 | ||
|
|
8083166256 | ||
|
|
a15b431e97 | ||
|
|
0589bc7881 | ||
|
|
3b578c7988 | ||
|
|
7f73133657 | ||
|
|
952e1a8f63 | ||
|
|
2c6e23e54d | ||
|
|
b3ac793f6e | ||
|
|
37269ef851 | ||
|
|
f2ce2fb9b4 | ||
|
|
d86969bf9b | ||
|
|
cd170e9b27 | ||
|
|
1c1d2ddac2 | ||
|
|
e5489f3c91 | ||
|
|
93ad3c133c | ||
|
|
b6bc1e9f72 | ||
|
|
dfc6910bc3 | ||
|
|
1afb261d0e | ||
|
|
e693b7ad35 | ||
|
|
fa72c49f2f | ||
|
|
32d73c18c4 | ||
|
|
cb9d5a783b | ||
|
|
c4bdd18195 | ||
|
|
7f0b0fa870 | ||
|
|
d5d9fab8e0 | ||
|
|
053f05d394 | ||
|
|
fc1c3c4415 | ||
|
|
623414bfa9 | ||
|
|
09bbe6f402 | ||
|
|
524c8a4268 | ||
|
|
b883e20b3e | ||
|
|
347f4668b4 | ||
|
|
5e05fea6f0 | ||
|
|
77113c81a4 | ||
|
|
3f39be82c4 | ||
|
|
3aeaec6ae4 | ||
|
|
aad43f15b3 | ||
|
|
1b2521290f | ||
|
|
642ac95ae9 | ||
|
|
2fc3a18df4 | ||
|
|
abb7d462a1 | ||
|
|
6a1d4086f3 | ||
|
|
b59da3be8a | ||
|
|
76efd54d03 | ||
|
|
ace8b08407 | ||
|
|
f70e642fea | ||
|
|
614bc696bb | ||
|
|
cd7d4232b6 | ||
|
|
f8e4450222 | ||
|
|
c92355742e | ||
|
|
fd3cfe3881 | ||
|
|
6e83081865 | ||
|
|
901b4b30c0 | ||
|
|
3aaa8b6460 | ||
|
|
8a37ff52b6 | ||
|
|
a34dac4e22 | ||
|
|
70aa90f584 | ||
|
|
228badb65f | ||
|
|
dec6b6bf6f | ||
|
|
e244730f16 | ||
|
|
28eea7c2bc | ||
|
|
fd4ca02ff3 | ||
|
|
b3010958ae | ||
|
|
47e668152b | ||
|
|
6fc2adc9b0 | ||
|
|
25c48ecc4b | ||
|
|
ac088c1adf | ||
|
|
7d2e1c54c4 | ||
|
|
f3cd3ff18a | ||
|
|
1196557d4c | ||
|
|
1af6cf36d2 | ||
|
|
1f59a971cf | ||
|
|
9cad2c21e8 | ||
|
|
0b1d297622 | ||
|
|
0ca7bb8eb2 | ||
|
|
1bd16b5ca6 | ||
|
|
643cd7ccae | ||
|
|
65996d6a54 | ||
|
|
111b151cba | ||
|
|
b1366df6b1 | ||
|
|
de154158fa | ||
|
|
eac695a0f5 | ||
|
|
b65cd1f54c | ||
|
|
ce1295610d | ||
|
|
1f6535c532 | ||
|
|
84008a81bd | ||
|
|
5ea24d1ca4 | ||
|
|
a38c50fa1c | ||
|
|
be60423f08 | ||
|
|
88ae50bc43 | ||
|
|
fe27f4c3e4 | ||
|
|
8cab9b5419 | ||
|
|
41bd93766b | ||
|
|
7f52ee60d9 | ||
|
|
d7f93d1e62 | ||
|
|
346d480a13 | ||
|
|
89cf950490 | ||
|
|
ced3c3ac59 | ||
|
|
3682a99a79 | ||
|
|
70b2816c04 | ||
|
|
b348535414 | ||
|
|
8fc3f34ca8 | ||
|
|
1129eb79b5 | ||
|
|
4e96a8c9b1 | ||
|
|
dfae7195b3 | ||
|
|
b493fba176 | ||
|
|
6fd9f9df03 | ||
|
|
da23b70ca4 | ||
|
|
70bd8ed591 | ||
|
|
b17286b73b | ||
|
|
d63b75b790 | ||
|
|
2536cae8fe | ||
|
|
07920b35ce | ||
|
|
01174fa6d4 | ||
|
|
7aa4a49ec9 | ||
|
|
83bed2f3f3 | ||
|
|
2625d7f4e4 | ||
|
|
6fdc38b4b0 | ||
|
|
44907fb3a2 | ||
|
|
a5c2dcd482 | ||
|
|
7c7ce098cb | ||
|
|
6170a0461d | ||
|
|
48705a0dd9 | ||
|
|
4a2a982c8d | ||
|
|
1dadeb8d7a | ||
|
|
f128560d97 | ||
|
|
4f119380a4 | ||
|
|
17f30cba33 | ||
|
|
38d081f40a | ||
|
|
6e41971725 | ||
|
|
bbe711b1ce | ||
|
|
bae05042db | ||
|
|
ee523035a6 | ||
|
|
aae0bd1880 | ||
|
|
95909e84c2 | ||
|
|
847010399d | ||
|
|
517675ff53 | ||
|
|
178228d8ec | ||
|
|
b9a29a69a7 | ||
|
|
a0901b8083 | ||
|
|
399928f6ea | ||
|
|
13b291ccc7 | ||
|
|
f99d5f974b | ||
|
|
692f2590d5 | ||
|
|
243e51dd5c | ||
|
|
2b3720b8f3 | ||
|
|
0261e5ecd4 | ||
|
|
6d904eb297 | ||
|
|
d2d25a60eb | ||
|
|
5e58823cee | ||
|
|
215fc29c35 | ||
|
|
21366a0667 | ||
|
|
6077061ba4 | ||
|
|
62a54a458a | ||
|
|
e468129572 | ||
|
|
d00f558ae2 | ||
|
|
60bee9039d | ||
|
|
acff8898a2 | ||
|
|
019ab1bd07 | ||
|
|
a71ca7c362 | ||
|
|
27d7b0cdf1 | ||
|
|
3ae53623d7 | ||
|
|
1211c48dbd | ||
|
|
d98501fe66 | ||
|
|
828d70e4f8 | ||
|
|
0014c5c32a | ||
|
|
961aeb5bb1 | ||
|
|
daee138365 | ||
|
|
9029a2ce82 | ||
|
|
219279c165 | ||
|
|
89e6fe7faa | ||
|
|
64566495ff | ||
|
|
4a1e49e1f0 | ||
|
|
08afce3500 | ||
|
|
ccbe2468b8 | ||
|
|
7c91ab5c02 | ||
|
|
0ecfad2d2c | ||
|
|
71e4816020 | ||
|
|
f0eb2fc672 | ||
|
|
323b8cf61c | ||
|
|
241d3f2335 | ||
|
|
ca236f2651 | ||
|
|
7f403992b6 | ||
|
|
dc694f30c0 | ||
|
|
5a5b688ad5 | ||
|
|
b3fdf16591 | ||
|
|
4e0417c951 | ||
|
|
3759951575 | ||
|
|
e03be1f184 | ||
|
|
26fca6b359 | ||
|
|
aec40082b1 | ||
|
|
b93a63d94a | ||
|
|
3dcdd8a676 | ||
|
|
58508966de | ||
|
|
3188d08b34 | ||
|
|
022b78a4e3 | ||
|
|
a8f9aa4385 | ||
|
|
52070fbba3 | ||
|
|
ca72c5e1fc | ||
|
|
48ad7723ad | ||
|
|
60d945c3a2 | ||
|
|
a082c68a7b | ||
|
|
601c419154 | ||
|
|
3fe8f93500 | ||
|
|
ef07b31fd9 | ||
|
|
5647f60373 | ||
|
|
fed0bfeb90 | ||
|
|
358fd945f2 | ||
|
|
236fb8cd9a | ||
|
|
a91cfc44ca | ||
|
|
9ca503ec82 | ||
|
|
beab3386d2 | ||
|
|
8f60cc41e7 | ||
|
|
89975bdfff | ||
|
|
a45bd9c0d1 | ||
|
|
f4048b4b9c | ||
|
|
8fd77bb666 | ||
|
|
213eccc436 | ||
|
|
e8651591ff | ||
|
|
9b7c5e658c | ||
|
|
acf34714cc | ||
|
|
56cb4a327f | ||
|
|
a80c5b5c42 | ||
|
|
382a9b7be3 | ||
|
|
fc247210cb | ||
|
|
df6ea47e2e | ||
|
|
41595bb643 | ||
|
|
25c0680e3a | ||
|
|
90682a06f4 | ||
|
|
f7f39af5e3 | ||
|
|
a73efc839e | ||
|
|
8d82fcb88f | ||
|
|
f9be142dfa | ||
|
|
148251bb7f | ||
|
|
de7b57330e | ||
|
|
8902a742a2 | ||
|
|
496467332a | ||
|
|
7fc043ec49 | ||
|
|
3d01ec827d | ||
|
|
7336e73354 | ||
|
|
ce4953ba75 | ||
|
|
cb0142785a | ||
|
|
4f5a037cc4 | ||
|
|
b39311d0a7 | ||
|
|
0d002eb957 | ||
|
|
83139a4936 | ||
|
|
dfaf2da168 | ||
|
|
4f9d543e46 | ||
|
|
1b3e4892a1 | ||
|
|
f18d0e4f6f | ||
|
|
7bf661ee3d | ||
|
|
c98180fc4e | ||
|
|
950afe955d | ||
|
|
48ee1ba07b | ||
|
|
a4d2a3d7d6 | ||
|
|
d33fef974a | ||
|
|
77687d4581 | ||
|
|
e25be4fafc | ||
|
|
6b9f416315 | ||
|
|
4dc170bf4a | ||
|
|
966b59692e | ||
|
|
8fe56b622e | ||
|
|
4f9ffbb7d7 | ||
|
|
01848bdeea | ||
|
|
100dee42be | ||
|
|
1dd48baca2 | ||
|
|
3f6b38b5fb | ||
|
|
09d794083c | ||
|
|
8b2bff3b03 | ||
|
|
bd5b9b315e | ||
|
|
b5a314ce67 | ||
|
|
98a610eb58 | ||
|
|
8a9a294604 | ||
|
|
de9c890559 | ||
|
|
02129b3109 | ||
|
|
023e0caeb9 | ||
|
|
d0aca38039 | ||
|
|
7e3ec496be | ||
|
|
d023479daf | ||
|
|
599dcdb15b | ||
|
|
48fd622ba2 | ||
|
|
6aa56b0c29 | ||
|
|
bdc2505570 | ||
|
|
c72840d813 | ||
|
|
e028260a65 | ||
|
|
11498c1517 | ||
|
|
d26f724621 | ||
|
|
de3f4b4254 | ||
|
|
477eb3d2aa | ||
|
|
c52327a30c | ||
|
|
5d0a61f496 | ||
|
|
9ba5a687af | ||
|
|
3232c73233 | ||
|
|
1d76570c2c | ||
|
|
6dca739c3e | ||
|
|
0fb8c21c14 | ||
|
|
180629c8dd | ||
|
|
b4bbaba73d | ||
|
|
588afd7381 | ||
|
|
a6e26c0bd6 | ||
|
|
5ee05aafb3 | ||
|
|
056e50dea2 | ||
|
|
6a0a31d76e | ||
|
|
25e998c34a | ||
|
|
013305e455 | ||
|
|
c4a7d7a005 | ||
|
|
fa81312609 | ||
|
|
9360363478 | ||
|
|
db71fcd04a | ||
|
|
7422a3f3c8 | ||
|
|
77f30626b3 | ||
|
|
e20b33046b | ||
|
|
e99695a2f1 | ||
|
|
42d9f6c0b7 | ||
|
|
040accdef0 | ||
|
|
f7b50209f0 | ||
|
|
23040b3570 | ||
|
|
14b6118ee4 | ||
|
|
66d848581a | ||
|
|
b98a996cb4 | ||
|
|
1cef94d23c | ||
|
|
18e3046aa4 | ||
|
|
0b8733f00e | ||
|
|
04c5f088ba | ||
|
|
28de722560 | ||
|
|
5223400684 | ||
|
|
24bff21259 | ||
|
|
a3a8e9aa86 | ||
|
|
0317d12e1d | ||
|
|
27aefb7699 | ||
|
|
bacdf4675f | ||
|
|
58dd51b483 | ||
|
|
ff4f8673fc | ||
|
|
0c9d110437 | ||
|
|
b3b72b4b85 | ||
|
|
9c7bf11cfa | ||
|
|
c816d97893 | ||
|
|
c84a92b2e5 | ||
|
|
0cb57d1d7b | ||
|
|
329db0d9f2 | ||
|
|
48c60b8ea0 | ||
|
|
496e353a11 | ||
|
|
2ca471a361 | ||
|
|
ebf0186266 | ||
|
|
7d8279c9df | ||
|
|
0c7cf39e29 | ||
|
|
ed6b4432e7 | ||
|
|
4e971176d2 | ||
|
|
63e6daca22 | ||
|
|
d01b96bdb3 | ||
|
|
2461c93b9f | ||
|
|
70b5c22fc2 | ||
|
|
ff278298c9 | ||
|
|
8cf3ab2228 | ||
|
|
3907be4c3f | ||
|
|
b5cfedf3dc | ||
|
|
5ccf102791 | ||
|
|
0fad4c0d3e | ||
|
|
bdd13aa91b | ||
|
|
b6d19a7ac4 | ||
|
|
e460df9ca6 | ||
|
|
b3d2c8af69 | ||
|
|
635dcd7ee3 | ||
|
|
cb38a98332 | ||
|
|
8ea6a38213 | ||
|
|
5154339546 | ||
|
|
2cad4ec818 | ||
|
|
4c16236823 | ||
|
|
422db97e87 | ||
|
|
174cbabb93 | ||
|
|
a5668dd94b | ||
|
|
16e3e7a489 | ||
|
|
31ea92516f | ||
|
|
e66bd832e1 | ||
|
|
7422f5dcc3 | ||
|
|
82f5fce989 | ||
|
|
3977565ad1 | ||
|
|
281595f79f | ||
|
|
602f3e2890 | ||
|
|
e048264d9e | ||
|
|
7c3039ea68 | ||
|
|
690db2fe73 | ||
|
|
26831994b1 | ||
|
|
f9af59a7a9 | ||
|
|
617b8cf4b8 | ||
|
|
f833bb9ce7 | ||
|
|
22b8e04717 | ||
|
|
48fee3d36d | ||
|
|
27906ee244 | ||
|
|
b2be8ab3fd | ||
|
|
08f346a6f4 | ||
|
|
739ee5d22c | ||
|
|
2d7fbdb443 | ||
|
|
3797d95174 | ||
|
|
7c33c24f80 | ||
|
|
0860d177a1 | ||
|
|
0cf5e798b3 | ||
|
|
0e6471c155 | ||
|
|
cf3b94424c | ||
|
|
e4efd439bf | ||
|
|
545ce0da20 | ||
|
|
d630f7534e | ||
|
|
ffce704f5e | ||
|
|
a1a9b10a85 | ||
|
|
98adc4dad5 | ||
|
|
56d8bbadc2 | ||
|
|
7676a3f607 | ||
|
|
55b8266dfd | ||
|
|
a544637651 | ||
|
|
51ff53f1d7 | ||
|
|
97de3c8fe8 | ||
|
|
da11c319b8 | ||
|
|
d797838378 | ||
|
|
093fffee05 | ||
|
|
ac60ba8001 | ||
|
|
2e150ca9d9 | ||
|
|
0712905fbe | ||
|
|
10e50dc244 | ||
|
|
d708f0e113 | ||
|
|
ff0fa89717 | ||
|
|
24ed96a618 | ||
|
|
3e331d786f | ||
|
|
cfa9c58451 | ||
|
|
26ae84afd5 | ||
|
|
85396a6b5d | ||
|
|
3147bb650d | ||
|
|
b065a7d4c8 | ||
|
|
903d0592ce | ||
|
|
d4646030a5 | ||
|
|
263792d0cf | ||
|
|
ad969c9f27 | ||
|
|
ea0bec152e | ||
|
|
167ab30b29 | ||
|
|
4760708248 | ||
|
|
64de8c8146 | ||
|
|
4003a80c56 | ||
|
|
2f796af178 | ||
|
|
1c4b936722 | ||
|
|
75302adb1c | ||
|
|
912f281730 | ||
|
|
270a5d68ab | ||
|
|
1e76dc11e8 | ||
|
|
cd7de527fa | ||
|
|
b428d4c786 | ||
|
|
f150d14f80 | ||
|
|
492a2fe898 | ||
|
|
a0df852611 | ||
|
|
a8f42ba443 | ||
|
|
b93ac17f2e | ||
|
|
da30e623ce | ||
|
|
75b69e91b6 | ||
|
|
2e1744a993 | ||
|
|
233b75b6e2 |
3
.github/workflows/core_auto_update.yml
vendored
3
.github/workflows/core_auto_update.yml
vendored
@@ -2,7 +2,7 @@ name: core_auto_update
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: 0 18 * * *
|
||||
- cron: 0 18 */3 * *
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
@@ -20,6 +20,7 @@ jobs:
|
||||
|
||||
auto_update_meta_alpha:
|
||||
permissions: write-all
|
||||
needs: auto_update_singboxr_dev
|
||||
uses: juewuy/ShellCrash/.github/workflows/update_meta_core.yaml@dev
|
||||
with:
|
||||
tag1: MetaCubeX/mihomo
|
||||
|
||||
89
.github/workflows/core_easy_update.yaml
vendored
Normal file
89
.github/workflows/core_easy_update.yaml
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
name: core_easy_update
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag1:
|
||||
description: 'meta or singbox or singboxr'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
get_version:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
version: ${{ steps.get_version.outputs.version }}
|
||||
steps:
|
||||
- id: get_version
|
||||
run: |
|
||||
[ "${{ inputs.tag1 }}" = meta ] && repo="MetaCubeX/mihomo"
|
||||
[ "${{ inputs.tag1 }}" = singbox ] && repo="SagerNet/sing-box"
|
||||
[ "${{ inputs.tag1 }}" = singboxr ] && repo="SagerNet/sing-box"
|
||||
latest_tag=$(curl -s "https://api.github.com/repos/$repo/releases/latest" | jq -r .tag_name)
|
||||
echo "version=$latest_tag" >> $GITHUB_OUTPUT
|
||||
|
||||
update_meta_upx:
|
||||
if: github.event.inputs.tag1 == 'meta'
|
||||
needs: get_version
|
||||
permissions: write-all
|
||||
uses: juewuy/ShellCrash/.github/workflows/update_meta_core.yaml@dev
|
||||
with:
|
||||
tag1: MetaCubeX/mihomo
|
||||
tag2: ${{ needs.get_version.outputs.version }}
|
||||
tag4: meta
|
||||
tag5: ""
|
||||
tag6: upx
|
||||
secrets: inherit
|
||||
|
||||
update_meta_tar:
|
||||
if: github.event.inputs.tag1 == 'meta'
|
||||
needs: [get_version, update_meta_upx]
|
||||
permissions: write-all
|
||||
uses: juewuy/ShellCrash/.github/workflows/update_meta_core.yaml@dev
|
||||
with:
|
||||
tag1: MetaCubeX/mihomo
|
||||
tag2: ${{ needs.get_version.outputs.version }}
|
||||
tag4: meta
|
||||
tag5: ""
|
||||
tag6: tar.gz
|
||||
secrets: inherit
|
||||
|
||||
update_singboxr_upx:
|
||||
if: github.event.inputs.tag1 == 'singboxr'
|
||||
needs: get_version
|
||||
permissions: write-all
|
||||
uses: juewuy/ShellCrash/.github/workflows/update_singbox_core.yaml@dev
|
||||
with:
|
||||
tag1: reF1nd/sing-box
|
||||
tag2: ${{ needs.get_version.outputs.version }}
|
||||
tag4: singboxr
|
||||
tag5: with_quic,with_utls,with_clash_api
|
||||
tag6: upx
|
||||
secrets: inherit
|
||||
|
||||
update_singboxr_tar:
|
||||
if: github.event.inputs.tag1 == 'singboxr'
|
||||
needs: [get_version, update_singboxr_upx]
|
||||
permissions: write-all
|
||||
uses: juewuy/ShellCrash/.github/workflows/update_singbox_core.yaml@dev
|
||||
with:
|
||||
tag1: reF1nd/sing-box
|
||||
tag2: ${{ needs.get_version.outputs.version }}
|
||||
tag4: singboxr
|
||||
tag5: with_gvisor,with_quic,with_wireguard,with_utls,with_clash_api,with_tailscale
|
||||
tag6: tar.gz
|
||||
secrets: inherit
|
||||
|
||||
update_singbox_upx:
|
||||
if: github.event.inputs.tag1 == 'singbox'
|
||||
needs: get_version
|
||||
permissions: write-all
|
||||
uses: juewuy/ShellCrash/.github/workflows/update_singbox_core.yaml@dev
|
||||
with:
|
||||
tag1: SagerNet/sing-box
|
||||
tag2: ${{ needs.get_version.outputs.version }}
|
||||
tag4: singbox
|
||||
tag5: with_quic,with_utls,with_clash_api
|
||||
tag6: upx
|
||||
secrets: inherit
|
||||
|
||||
33
.github/workflows/update_meta_core.yaml
vendored
33
.github/workflows/update_meta_core.yaml
vendored
@@ -64,8 +64,8 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: go
|
||||
env:
|
||||
REPO: ${{ github.event.inputs.tag1 }}
|
||||
TAGS: ${{ github.event.inputs.tag5 }}
|
||||
REPO: ${{ inputs.tag1 }}
|
||||
TAGS: ${{ inputs.tag5 }}
|
||||
outputs:
|
||||
version: ${{steps.meta.outputs.version}}
|
||||
tags: ${{steps.meta.outputs.tags}}
|
||||
@@ -74,7 +74,7 @@ jobs:
|
||||
- name: get meta version
|
||||
id: meta
|
||||
run: |
|
||||
version=${{ github.event.inputs.tag2 }}
|
||||
version=${{ inputs.tag2 }}
|
||||
[ "$version" = Alpha ] && version="Alpha-$(date +"%Y%m%d")"
|
||||
echo version=$version >> $GITHUB_OUTPUT
|
||||
if [ -z "$TAGS" ];then
|
||||
@@ -137,8 +137,8 @@ jobs:
|
||||
- name: Checkout meta
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: ${{ github.event.inputs.tag1 }}
|
||||
ref: ${{ github.event.inputs.tag2 }}
|
||||
repository: ${{ inputs.tag1 }}
|
||||
ref: ${{ inputs.tag2 }}
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Setup Go
|
||||
@@ -188,11 +188,11 @@ jobs:
|
||||
|
||||
- name: Zip core by upx
|
||||
if: env.ZIPTYPE == 'upx'
|
||||
run: |
|
||||
wget https://github.com/upx/upx/releases/download/v3.96/upx-3.96-amd64_linux.tar.xz
|
||||
wget https://github.com/upx/upx/releases/download/v3.94/upx-3.94-amd64_linux.tar.xz
|
||||
tar xf upx-3.96-amd64_linux.tar.xz
|
||||
tar xf upx-3.94-amd64_linux.tar.xz
|
||||
run: |
|
||||
for upxv in 3.94 3.96 5.1.0;do
|
||||
wget https://github.com/upx/upx/releases/download/v$upxv/upx-$upxv-amd64_linux.tar.xz
|
||||
tar xf upx-$upxv-amd64_linux.tar.xz
|
||||
done
|
||||
for arch in amd64 armv5 armv7 arm64 386 mips-softfloat mipsle-hardfloat mipsle-softfloat;do
|
||||
[ ! -f ./tmp/linux-${arch}/meta ] && continue
|
||||
mv -f ./tmp/linux-${arch}/meta ./tmp/clash-linux-${arch}.upx
|
||||
@@ -201,12 +201,15 @@ jobs:
|
||||
armv5|mips* )
|
||||
./upx-3.94-amd64_linux/upx --no-lzma ./tmp/clash-linux-${arch}.upx
|
||||
;;
|
||||
*)
|
||||
armv7|386)
|
||||
./upx-3.96-amd64_linux/upx --no-lzma ./tmp/clash-linux-${arch}.upx
|
||||
;;
|
||||
*)
|
||||
./upx-5.1.0-amd64_linux/upx ./tmp/clash-linux-${arch}.upx
|
||||
;;
|
||||
esac
|
||||
done
|
||||
rm -rf upx-3.9*
|
||||
rm -rf upx-*
|
||||
|
||||
- name: Zip core by tar
|
||||
if: env.ZIPTYPE == 'tar.gz'
|
||||
@@ -250,9 +253,9 @@ jobs:
|
||||
if: ${{ env.RELEASE != '' && env.PUSHDIR == '' }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
tag_name: ${{ github.event.inputs.tag3 }}
|
||||
name: ${{ github.event.inputs.tag3 }}
|
||||
body: "The ${{env.VERSION}} version of ${{ github.event.inputs.tag1 }} \n这是${{ github.event.inputs.tag1 }}的${{env.VERSION}}版本内核文件\nhttps://github.com/${{ github.event.inputs.tag1 }}/releases \nOnly support for ShellCrash\n仅适配ShellCrash项目"
|
||||
tag_name: ${{ inputs.tag3 }}
|
||||
name: ${{ inputs.tag3 }}
|
||||
body: "The ${{env.VERSION}} version of ${{ inputs.tag1 }} \n这是${{ inputs.tag1 }}的${{env.VERSION}}版本内核文件\nhttps://github.com/${{ inputs.tag1 }}/releases \nOnly support for ShellCrash\n仅适配ShellCrash项目"
|
||||
draft: false
|
||||
prerelease: true
|
||||
files: |
|
||||
|
||||
17
.github/workflows/update_singbox_core.yaml
vendored
17
.github/workflows/update_singbox_core.yaml
vendored
@@ -88,7 +88,7 @@ jobs:
|
||||
git fetch --tags sekai
|
||||
version=$(CGO_ENABLED=0 go run ./cmd/internal/read_tag)
|
||||
[ -z "$version" ] && version=${{ inputs.tag2 }}
|
||||
version=$(echo $version | sed 's/-reF1nd//')
|
||||
version=$(echo ${version%-*})
|
||||
echo version=$version >> $GITHUB_OUTPUT
|
||||
if [ -z "$TAGS" ];then
|
||||
if [ "$REPO" = 'SagerNet/sing-box' ];then
|
||||
@@ -208,10 +208,10 @@ jobs:
|
||||
- name: Zip core by upx
|
||||
if: env.ZIPTYPE == 'upx'
|
||||
run: |
|
||||
wget https://github.com/upx/upx/releases/download/v3.96/upx-3.96-amd64_linux.tar.xz
|
||||
wget https://github.com/upx/upx/releases/download/v3.94/upx-3.94-amd64_linux.tar.xz
|
||||
tar xf upx-3.96-amd64_linux.tar.xz
|
||||
tar xf upx-3.94-amd64_linux.tar.xz
|
||||
for upxv in 3.94 3.96 5.1.0;do
|
||||
wget https://github.com/upx/upx/releases/download/v$upxv/upx-$upxv-amd64_linux.tar.xz
|
||||
tar xf upx-$upxv-amd64_linux.tar.xz
|
||||
done
|
||||
for arch in amd64 armv5 armv7 arm64 386 mips-softfloat mipsle-hardfloat mipsle-softfloat;do
|
||||
[ ! -f ./tmp/linux-${arch}/sing-box ] && continue
|
||||
mv -f ./tmp/linux-${arch}/sing-box ./tmp/singbox-linux-${arch}.upx
|
||||
@@ -220,12 +220,15 @@ jobs:
|
||||
armv5|mips* )
|
||||
./upx-3.94-amd64_linux/upx --no-lzma ./tmp/singbox-linux-${arch}.upx
|
||||
;;
|
||||
*)
|
||||
armv7|386)
|
||||
./upx-3.96-amd64_linux/upx --no-lzma ./tmp/singbox-linux-${arch}.upx
|
||||
;;
|
||||
*)
|
||||
./upx-5.1.0-amd64_linux/upx ./tmp/singbox-linux-${arch}.upx
|
||||
;;
|
||||
esac
|
||||
done
|
||||
rm -rf upx-3.9*
|
||||
rm -rf upx-*
|
||||
|
||||
- name: Zip core by tar
|
||||
if: env.ZIPTYPE == 'tar.gz'
|
||||
|
||||
@@ -57,8 +57,7 @@ RUN apk add --no-cache \
|
||||
ca-certificates \
|
||||
tzdata \
|
||||
nftables \
|
||||
iproute2 \
|
||||
dcron
|
||||
iproute2
|
||||
|
||||
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \
|
||||
echo "${TZ}" > /etc/timezone
|
||||
|
||||
176
README.md
176
README.md
@@ -1,24 +1,178 @@
|
||||
<h1 align="center">
|
||||
<br>ShellCrash<br>
|
||||
</h1>
|
||||
|
||||
|
||||
<p align="center">
|
||||
<h1 align="center">ShellCrash</h1>
|
||||
|
||||
<p align="center">
|
||||
<a target="_blank" href="https://github.com/MetaCubeX/mihomo/releases">
|
||||
<img src="https://img.shields.io/github/release/MetaCubeX/mihomo.svg?style=flat-square&label=Core">
|
||||
</a>
|
||||
<a target="_blank" href="https://github.com/juewuy/ShellCrash/releases">
|
||||
<img src="https://img.shields.io/github/release/juewuy/ShellCrash.svg?style=flat-square&label=ShellCrash&colorB=green">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
[中文](README_CN.md) | English
|
||||
<p align="center">
|
||||
<strong>A powerful script tool for the convenient deployment and management of mihomo/sing-box kernels in Shell environments.</strong>
|
||||
</p>
|
||||
|
||||
## Function introduction:
|
||||
<p align="center">
|
||||
<a href="README_CN.md">简体中文</a> | English
|
||||
</p>
|
||||
|
||||
~Convenient use in Shell environment through management script [Crash](https://github.com/Dreamacro/Crash)<br>~Support management of [Crash functions](https://lancellc.gitbook.io/Crash)<br>~Support online import [Crash](https://github.com/Dreamacro/Crash) supports sharing, subscription and configuration links<br>~Support configuration timing tasks, support configuration file timing updates<br>~Support online installation and Use local web panel to manage built-in rules<br>~Support routing mode, native mode and other mode switching<br>~Support online update<br>
|
||||
---
|
||||
|
||||
## Equipment support:
|
||||
## :rocket: Core Features
|
||||
|
||||
~Support various router devices based on OpenWrt or secondary custom development using OpenWrt<br>~Support various devices running standard Linux systems (such as Debian/CenOS/Armbian, etc.)<br>~Compatible with Padavan firmware (conservative mode), Pandora firmware<br>~Compatible with various types of devices customized and developed using the Linux kernel<br>——————————<br>~For more device support, please submit an issue or go to the TG group for feedback (the device name and the device core information returned by running uname -a must be provided)<br>
|
||||
- **Multi-Kernel Support**: Easily manage and switch between **mihomo** and **sing-box** kernels directly within the Shell environment.
|
||||
- **Flexible Configuration Management**: Supports online import of subscription links and configuration files to simplify the setup process.
|
||||
- **Automated Tasks**: Configure scheduled tasks for automatic updates of configuration files and rules.
|
||||
- **Graphical Dashboard**: Support for online installation and use of local Web Dashboards to intuitively manage built-in rules and traffic.
|
||||
- **Multiple Operation Modes**: Supports switching between various traffic forwarding modes, including Router mode and Local mode.
|
||||
- **One-Click Maintenance**: Built-in online update functionality to keep the script and features up to date.
|
||||
|
||||
## :computer: Device Support
|
||||
|
||||
ShellCrash is designed to be compatible with the vast majority of network devices based on the Linux kernel:
|
||||
|
||||
* **Router Devices**: Supports various firmwares based on OpenWrt or its derivatives (e.g., Xiaomi, Netgear etc.).
|
||||
* **Linux Servers**: Supports devices running standard Linux/GNU distributions (e.g., Debian, CentOS, Armbian, Ubuntu, etc.).
|
||||
* **Third-Party Firmware**: Compatible with Padavan (Conservative Mode), Pandora, and ASUS/Merlin firmware.
|
||||
* **Other Devices**: Compatible with other devices based on Linux/GNU or Linux/busybox.
|
||||
* **Docker**:Compatible with Docker environments (e.g., Synology, PVE, etc.).
|
||||
|
||||
> For additional device support, please submit an [Issue](https://github.com/juewuy/ShellCrash/issues) or provide feedback in the [Telegram Group](https://t.me/ShellClash) (please include the device model and the output of the `uname -a` command).
|
||||
|
||||
---
|
||||
|
||||
## :hammer_and_wrench: Installation Guide
|
||||
|
||||
> [!TIP]
|
||||
> If you encounter connection failures or SSL-related issues, please try switching to an alternative installation mirror.
|
||||
|
||||
### Prerequisites
|
||||
1. Ensure the device has **SSH** enabled and **Root privileges** obtained (Linux systems with a GUI can use the terminal directly).
|
||||
2. Connect to the device using an SSH tool (such as PuTTY, JuiceSSH, or the system's built-in terminal).
|
||||
|
||||
### :penguin: Standard Linux Device Installation
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Please perform the installation as the root user.
|
||||
|
||||
> Install via wget (jsDelivr CDN source)
|
||||
```sh
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@dev' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install_en.sh \
|
||||
&& bash /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
> Or install via curl (Author's private source)
|
||||
|
||||
```sh
|
||||
export url='https://gh.jwsc.eu.org/dev' && bash -c "$(curl -kfsSl $url/install_en.sh)" && . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
### :satellite: Router Device Installation
|
||||
|
||||
**Installation via `curl`:**
|
||||
> GitHub Source (Recommended for overseas environments or environments with proxy access)
|
||||
```sh
|
||||
export url='https://raw.githubusercontent.com/juewuy/ShellCrash/dev' \
|
||||
&& sh -c "$(curl -kfsSl $url/install_en.sh)" \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
> Or jsDelivr CDN source
|
||||
|
||||
```sh
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@dev' \
|
||||
&& sh -c "$(curl -kfsSl $url/install_en.sh)" \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
> Or Author's private source
|
||||
```sh
|
||||
export url='https://gh.jwsc.eu.org/dev' && sh -c "$(curl -kfsSl $url/install_en.sh)" && . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
**Installation via `wget`:**
|
||||
> GitHub Source (Recommended for overseas environments or environments with proxy access)
|
||||
```sh
|
||||
export url='https://raw.githubusercontent.com/juewuy/ShellCrash/dev' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install_en.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
> Or jsDelivr CDN source
|
||||
```sh
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@dev' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install_en.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
### :pager: Installation for Legacy Devices with Older `wget` Versions
|
||||
|
||||
> Author's private HTTP beta source
|
||||
```sh
|
||||
export url='http://t.jwsc.eu.org' \
|
||||
&& wget -q -O /tmp/install.sh $url/install_en.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
|
||||
### :cloud: Virtual Machines
|
||||
- **Alpine Linux VM**: It is highly recommended to use an Alpine image for optimal compatibility.
|
||||
```sh
|
||||
# Install necessary dependencies
|
||||
apk add --no-cache wget openrc ca-certificates tzdata nftables iproute2 dcron
|
||||
# Execute installation command
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@dev' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install_en.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
### :whale: Docker
|
||||
|
||||
Please visit the official Docker image:
|
||||
|
||||
- [ShellCrash on Docker Hub](https://hub.docker.com/r/juewuy/shellcrash)
|
||||
|
||||
|
||||
### :package: Local Installation
|
||||
|
||||
If online installation is not possible, please follow the guide for local installation:
|
||||
|
||||
- [Local ShellCrash Installation Tutorial | Juewuy's Blog](https://juewuy.github.io/bdaz)
|
||||
|
||||
---
|
||||
|
||||
## :book: Usage Instructions
|
||||
|
||||
After installation, enter the following commands in the terminal to launch the management interface:
|
||||
|
||||
```shell
|
||||
crash # Launch the interactive script menu
|
||||
crash -h # View the list of command help
|
||||
```
|
||||
|
||||
### Running Dependencies
|
||||
| Component | Necessity | Description |
|
||||
| :--- | :--- | :--- |
|
||||
| curl / wget | Mandatory | Required for node saving, online installation, and update operations. |
|
||||
| iptables / nftables | Critical | Without these, the script can only run in Pure Mode. |
|
||||
| crontab | Low | Required for scheduled tasks; otherwise, they will not function. |
|
||||
| net-tools | Very Low | Used for automatic port occupancy detection. |
|
||||
| ubus / iproute-doc | Very Low | Used for automatically obtaining the local Host address. |
|
||||
|
||||
---
|
||||
|
||||
## :link: Related Links
|
||||
- FAQ: [Juewuy's Blog](https://juewuy.github.io/chang-jian-wen-ti/)
|
||||
- Changelog: [Release History](https://github.com/juewuy/ShellCrash/releases)
|
||||
- Discussion: [Telegram Group](https://t.me/ShellClash)
|
||||
|
||||
## :scroll: License
|
||||
|
||||
This project is licensed under the [GNU General Public License v3.0](LICENSE.txt).
|
||||
|
||||
235
README_CN.md
235
README_CN.md
@@ -1,10 +1,7 @@
|
||||
<h1 align="center">
|
||||
<br>ShellCrash<br>
|
||||
</h1>
|
||||
<h1 align="center">ShellCrash</h1>
|
||||
|
||||
|
||||
<p align="center">
|
||||
<a target="_blank" href="https://github.com/MetaCubeX/mihomo/releases">
|
||||
<p align="center">
|
||||
<a target="_blank" href="https://github.com/MetaCubeX/mihomo/releases">
|
||||
<img src="https://img.shields.io/github/release/MetaCubeX/mihomo.svg?style=flat-square&label=Core">
|
||||
</a>
|
||||
<a target="_blank" href="https://github.com/juewuy/ShellCrash/releases">
|
||||
@@ -12,147 +9,183 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
中文 | [English](README.md)
|
||||
<p align="center">
|
||||
<strong>一款在 Shell 环境下便捷部署与管理 mihomo/sing-box 内核的脚本工具</strong>
|
||||
</p>
|
||||
|
||||
功能简介:
|
||||
--
|
||||
<p align="center">
|
||||
简体中文 | <a href="README.md">English</a>
|
||||
</p>
|
||||
|
||||
~通过管理脚本在Shell环境下便捷使用Mihomo/Singbox内核<br>
|
||||
~支持在Shell环境下管理<br>
|
||||
~支持在线导入订阅及配置链接<br>
|
||||
~支持配置定时任务,支持配置文件定时更新<br>
|
||||
~支持在线安装及使用本地网页面板管理内置规则<br>
|
||||
~支持路由模式、本机模式等多种模式切换<br>
|
||||
~支持在线更新<br>
|
||||
---
|
||||
|
||||
设备支持:
|
||||
--
|
||||
## :rocket: 核心特性
|
||||
|
||||
~支持各种基于OpenWrt或使用OpenWrt二次定制开发的路由器设备<br>
|
||||
~支持各种运行标准Linux系统(如Debian/CenOS/Armbian等)的设备<br>
|
||||
~兼容Padavan固件(保守模式)、潘多拉固件以及华硕/梅林固件<br>
|
||||
~兼容各类使用Linux内核定制开发的各类型设备<br>
|
||||
- **多内核支持**:在 Shell 环境下便捷管理及切换 **mihomo** 与 **sing-box** 内核。
|
||||
- **灵活配置管理**:支持在线导入订阅连结及配置文件,简化配置流程。
|
||||
- **自动化任务**:支持配置定时任务,实现配置文件与规则的自动定时更新。
|
||||
- **图形化面板**:支持在线安装并使用本地 Web 面板(Dashboard),直观管理内置规则与流量。
|
||||
- **多模式运行**:支持路由模式、本机模式等多种流量转发模式切换。
|
||||
- **一键维护**:内置脚本在线更新功能,保持版本与功能的及时更迭。
|
||||
|
||||
——————————<br>
|
||||
~更多设备支持,请提issue或前往TG群反馈(需提供设备名称及运行uname -a返回的设备核心信息)<br>
|
||||
## :computer: 设备支持
|
||||
|
||||
## 常见问题:
|
||||
ShellCrash 旨在兼容绝大多数基于 Linux 内核的网络设备:
|
||||
|
||||
[ShellCrash常见问题 | Juewuy's Blog](https://juewuy.github.io/chang-jian-wen-ti/)
|
||||
* **路由器设备**:支持各种基于 OpenWrt 或其二次开发固件(如 小米路由、网件路由等设备)。
|
||||
* **Linux 服务器**:支持运行标准 Linux/GNU发行版(如 Debian、CentOS、Armbian、Ubuntu 等)的设备。
|
||||
* **第三方固件**:兼容 Padavan(保守模式)、潘多拉固件以及华硕/梅林固件。
|
||||
* **其他设备**:兼容各种基于Linux/GNU或者Linux/busybox开发的设备。
|
||||
* **Docker**:部分可能不兼容的设备(如群辉、PVE),支持docker环境运行。
|
||||
|
||||
## 使用方式:
|
||||
> 更多设备支持,请提交 [Issue](https://github.com/juewuy/ShellCrash/issues) 或前往 [Telegram 群组](https://t.me/ShellClash) 反馈(请附上设备型号及 `uname -a` 命令的输出信息)。
|
||||
|
||||
~确认设备已经开启SSH并获取root权限(带GUI桌面的Linux设备可使用自带终端安装)<br>
|
||||
~使用SSH连接工具(如putty,JuiceSSH,系统自带终端等)路由器或Linux设备的SSH管理界面或终端界面
|
||||
---
|
||||
|
||||
~之后在SSH界面执行目标设备对应的安装命令,并按照后续提示完成安装<br>
|
||||
## :hammer_and_wrench: 安装指南
|
||||
|
||||
### 在线安装:<br>
|
||||
> [!TIP]
|
||||
> 若遇到连接失败或SSL相关问题,请尝试切换至其他安装镜像站。
|
||||
|
||||
(**如无法连接或出现SSL连接错误,请尝试更换各种不同的安装源!**)<br>
|
||||
### 前置条件
|
||||
1. 确保设备已开启 **SSH** 并获得 **Root 权限**(带图形介面的 Linux 系统可直接使用终端)。
|
||||
2. 使用 SSH 工具(如 Putty、JuiceSSH、或系统自带终端)连接至设备。
|
||||
|
||||
~**标准Linux设备安装:**<br>
|
||||
### :penguin: 标准 Linux 设备安装
|
||||
|
||||
```shell
|
||||
sudo -i #切换到root用户,如果需要密码,请输入密码
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' && wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh && bash /tmp/install.sh && . /etc/profile &> /dev/null
|
||||
```
|
||||
或者
|
||||
```shell
|
||||
sudo -i #切换到root用户,如果需要密码,请输入密码
|
||||
export url='https://gh.jwsc.eu.org/master' && bash -c "$(curl -kfsSl $url/install.sh)" && . /etc/profile &> /dev/null
|
||||
> [!IMPORTANT]
|
||||
> 请以 root 用户进行安装。
|
||||
|
||||
> 使用 wget 安装(jsDelivr CDN 源)
|
||||
```sh
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh \
|
||||
&& bash /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
~**路由设备使用curl安装**:<br>
|
||||
> 或使用 curl 安装(作者私人源)
|
||||
|
||||
```shell
|
||||
#GitHub源(可能需要代理)
|
||||
export url='https://raw.githubusercontent.com/juewuy/ShellCrash/master' && sh -c "$(curl -kfsSl $url/install.sh)" && . /etc/profile &> /dev/null
|
||||
```
|
||||
或者
|
||||
```shell
|
||||
#jsDelivrCDN源
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' && sh -c "$(curl -kfsSl $url/install.sh)" && . /etc/profile &> /dev/null
|
||||
```
|
||||
或者
|
||||
```shell
|
||||
#作者私人源
|
||||
export url='https://gh.jwsc.eu.org/master' && sh -c "$(curl -kfsSl $url/install.sh)" && . /etc/profile &> /dev/null
|
||||
```sh
|
||||
export url='https://gh.jwsc.eu.org/master' \
|
||||
&& bash -c "$(curl -kfsSl $url/install.sh)" \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
~**路由设备使用wget安装**:<br>
|
||||
### :satellite: 路由器设备安装
|
||||
|
||||
```Shell
|
||||
#GitHub源(可能需要代理)
|
||||
export url='https://raw.githubusercontent.com/juewuy/ShellCrash/master' && wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh && sh /tmp/install.sh && . /etc/profile &> /dev/null
|
||||
```
|
||||
或者
|
||||
```shell
|
||||
#jsDelivrCDN源
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' && wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh && sh /tmp/install.sh && . /etc/profile &> /dev/null
|
||||
**使用 `curl` 安装:**
|
||||
> GitHub 源(推荐海外环境或具备代理环境使用)
|
||||
```sh
|
||||
export url='https://raw.githubusercontent.com/juewuy/ShellCrash/master' \
|
||||
&& sh -c "$(curl -kfsSl $url/install.sh)" \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
~**老旧设备使用低版本wge安装**:<br>
|
||||
> 或 jsDelivr CDN 源
|
||||
|
||||
```Shell
|
||||
#作者私人http内测源
|
||||
export url='http://t.jwsc.eu.org' && wget -q -O /tmp/install.sh $url/install.sh && sh /tmp/install.sh && . /etc/profile &> /dev/null
|
||||
```sh
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' \
|
||||
&& sh -c "$(curl -kfsSl $url/install.sh)" \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
##### ~**虚拟机安装:**<br>
|
||||
> 或作者私人源
|
||||
```sh
|
||||
export url='https://gh.jwsc.eu.org/master' \
|
||||
&& sh -c "$(curl -kfsSl $url/install.sh)" \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
虚拟机环境强烈建议使用Alpine镜像安装<br>
|
||||
**使用 `wget` 安装:**
|
||||
> GitHub 源(推荐海外环境或具备代理环境使用)
|
||||
```sh
|
||||
export url='https://raw.githubusercontent.com/juewuy/ShellCrash/master' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
```shell
|
||||
#安装必要依赖
|
||||
> 或 jsDelivr CDN 源
|
||||
```sh
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
### :pager: 老旧设备使用低版本 `wget` 安装
|
||||
|
||||
> 作者私人 http 内测源
|
||||
```sh
|
||||
export url='http://t.jwsc.eu.org' \
|
||||
&& wget -q -O /tmp/install.sh $url/install.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
|
||||
### :cloud: 虚拟机
|
||||
- **Alpine Linux 虚拟机**:强烈建议使用 Alpine 镜像以获得最佳兼容性
|
||||
```sh
|
||||
# 安装必要依赖
|
||||
apk add --no-cache wget openrc ca-certificates tzdata nftables iproute2 dcron
|
||||
#执行安装命令
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' && wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh && sh /tmp/install.sh && . /etc/profile &> /dev/null
|
||||
|
||||
# 执行安装命令
|
||||
export url='https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master' \
|
||||
&& wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh \
|
||||
&& sh /tmp/install.sh \
|
||||
&& . /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
##### ~Docker安装:<br>
|
||||
### :whale: Docker
|
||||
|
||||
请前往[ShellCrash官方Docker镜像](https://hub.docker.com/r/juewuy/shellcrash)
|
||||
请访问官方 Docker 镜像:
|
||||
|
||||
### **本地安装:**<br>
|
||||
- [ShellCrash on Docker Hub](https://hub.docker.com/r/juewuy/shellcrash)
|
||||
|
||||
如使用在线安装出现问题,请参考:[本地安装ShellCrash的教程 | Juewuy's Blog](https://juewuy.github.io/bdaz) 使用本地安装!<br>
|
||||
|
||||
### 使用脚本:<br>
|
||||
### :package: 本地安装
|
||||
|
||||
安装完成管理脚本后,执行如下命令使用~
|
||||
若无法进行在线安装,请参照以下指南执行本地安装:
|
||||
|
||||
```Shell
|
||||
crash #进入对话
|
||||
crash -h #帮助列表
|
||||
```
|
||||
- [本地安装ShellCrash教程 | Juewuy's Blog](https://juewuy.github.io/bdaz)
|
||||
|
||||
#### **运行时的额外依赖**:<br>
|
||||
---
|
||||
|
||||
> 大部分的设备/系统都已经预装了以下的大部分依赖,使用时如无影响可以无视之
|
||||
## :book: 使用说明
|
||||
|
||||
安装完成后,在终端输入以下指令即可启动管理界面:
|
||||
|
||||
```shell
|
||||
curl/wget 必须 全部缺少时无法在线安装及更新,无法使用节点保存功能
|
||||
iptables/nftables 重要 缺少时只能使用纯净模式
|
||||
crontab 较低 缺少时无法启用定时任务功能
|
||||
net-tools 极低 缺少时无法正常检测端口占用
|
||||
ubus/iproute-doc 极低 缺少时无法正常获取本机host地址
|
||||
crash # 启动脚本交互选单
|
||||
crash -h # 查看命令帮助列表
|
||||
```
|
||||
|
||||
### 运行依赖说明
|
||||
| 依赖组件 | 必要性 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| curl / wget | 必须 | 缺少时将无法进行节点保存、在线安装及更新操作 |
|
||||
| iptables / nftables | 重要 | 缺少时仅能运行于纯淨模式 |
|
||||
| crontab | 较低 | 缺少时定时任务功能将失效 |
|
||||
| net-tools | 极低 | 缺少时无法自动检测端口占用 |
|
||||
| ubus / iproute-doc | 极低 | 缺少时无法自动获取本机 Host 地址 |
|
||||
|
||||
---
|
||||
|
||||
更新日志:
|
||||
--
|
||||
## :link: 相关链接
|
||||
- 常见问题:[Juewuy's Blog](https://juewuy.github.io/chang-jian-wen-ti/)
|
||||
- 更新日志:[Release History](https://github.com/juewuy/ShellCrash/releases)
|
||||
- 交流反馈:[Telegram 讨论组](https://t.me/ShellClash)
|
||||
|
||||
### [点击查看](https://github.com/juewuy/ShellCrash/releases)
|
||||
---
|
||||
|
||||
交流反馈:
|
||||
--
|
||||
### [TG讨论组](https://t.me/ShellClash)
|
||||
## :scroll: 许可协议
|
||||
|
||||
机场推荐:
|
||||
--
|
||||
本项目采用[GNU通用公共许可证第3.0版](LICENSE.txt)授权。
|
||||
|
||||
#### [Dler-墙洞,多年稳定运行,功能齐全](https://dler.pro/auth/register?affid=89698)<br>
|
||||
---
|
||||
|
||||
#### [大米-群友力荐,流媒体解锁,月付推荐](https://1s.bigmeok.me/user#/register?code=2PuWY9I7)<br>
|
||||
## :airplane: 机场推荐
|
||||
|
||||
- [**大米**](https://1s.bigmeok.me/user#/register?code=2PuWY9I7),群友力荐,流媒体解锁,月付推荐。
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
meta_v=v1.19.17
|
||||
singboxr_v=1.13.0-alpha.27
|
||||
versionsh=1.9.4beta3.1
|
||||
versionsh=1.9.5alpha11
|
||||
GeoIP_v=20251205
|
||||
|
||||
@@ -57,6 +57,7 @@ docker run -d \
|
||||
--cap-add NET_ADMIN \
|
||||
--cap-add NET_RAW \
|
||||
--cap-add SYS_ADMIN \
|
||||
--sysctl net.ipv4.ip_forward=1 \
|
||||
--device /dev/net/tun:/dev/net/tun \
|
||||
--restart unless-stopped \
|
||||
juewuy/shellcrash:latest
|
||||
@@ -87,14 +88,10 @@ mkdir -p /root/ShellCrash
|
||||
```shell
|
||||
docker run -d \
|
||||
………………
|
||||
-v /root/ShellCrash:/etc/ShellCrash \
|
||||
-v shellcrash_configs:/etc/ShellCrash/configs \
|
||||
………………
|
||||
```
|
||||
|
||||
------
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
## Compose Deployment(Compose部署)
|
||||
@@ -102,8 +99,8 @@ docker run -d \
|
||||
### 1. 创建宿主机目录并进入目录
|
||||
|
||||
```shell
|
||||
mkdir -p /root/ShellCrash
|
||||
cd /root/ShellCrash
|
||||
mkdir -p /tmp/ShellCrash
|
||||
cd /tmp/ShellCrash
|
||||
```
|
||||
|
||||
### 2. 下载Compose模版
|
||||
@@ -126,8 +123,29 @@ docker compose up -d
|
||||
|
||||
------
|
||||
|
||||
### Notes
|
||||
## Delete(移除容器镜像或删除卷)
|
||||
|
||||
### Docker删除容器
|
||||
|
||||
```shell
|
||||
docker rm -f shellcrash
|
||||
```
|
||||
|
||||
### Docker删除卷
|
||||
|
||||
```shell
|
||||
docker volume rm shellcrash_configs
|
||||
```
|
||||
|
||||
### Compose删除容器&卷
|
||||
|
||||
```shell
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- 内置公网防火墙功能无法管理宿主机网络,请自行做好宿主机7890/9999端口的网络防护!
|
||||
- 旁路由模式需要宿主机支持 `TUN`
|
||||
- macvlan 网络下宿主机默认无法直接访问容器 IP
|
||||
- 透明代理场景可能需要额外的网络规划
|
||||
|
||||
@@ -14,11 +14,15 @@ services:
|
||||
devices:
|
||||
- "/dev/net/tun:/dev/net/tun"
|
||||
sysctls:
|
||||
net.ipv4.ip_forward: 1
|
||||
- net.ipv4.ip_forward: 1
|
||||
# - net.ipv6.conf.all.forwarding=1
|
||||
volumes:
|
||||
- /etc/ShellCrash:/root/ShellCrash
|
||||
- shellcrash_configs:/etc/ShellCrash/configs:rw
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
shellcrash_configs:
|
||||
|
||||
networks:
|
||||
macvlan_lan:
|
||||
name: macvlan_lan
|
||||
|
||||
537
install.sh
537
install.sh
@@ -1,23 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -z "$url" ] && url="https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@dev"
|
||||
type bash &>/dev/null && shtype=bash || shtype=sh
|
||||
[ -n "$(echo -e | grep e)" ] && echo=echo || echo='echo -e'
|
||||
echo "***********************************************"
|
||||
echo "** 欢迎使用 **"
|
||||
echo "** ShellCrash **"
|
||||
echo "** by Juewuy **"
|
||||
echo "***********************************************"
|
||||
|
||||
# Check available capacity
|
||||
dir_avail() {
|
||||
df -h >/dev/null 2>&1 && h="$2"
|
||||
df -P $h "${1:-.}" 2>/dev/null | awk 'NR==2 {print $4}'
|
||||
}
|
||||
language=chs
|
||||
[ -z "$url" ] && url="https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master"
|
||||
|
||||
ckcmd() { #检查命令
|
||||
if command -v sh >/dev/null 2>&1;then
|
||||
# 内置工具
|
||||
cecho() {
|
||||
printf '%b\n' "$*"
|
||||
}
|
||||
dir_avail() {
|
||||
df -h >/dev/null 2>&1 && h="$2"
|
||||
df -P $h "${1:-.}" 2>/dev/null | awk 'NR==2 {print $4}'
|
||||
}
|
||||
ckcmd() {
|
||||
if command -v sh >/dev/null 2>&1; then
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
else
|
||||
type "$1" >/dev/null 2>&1
|
||||
@@ -29,7 +31,7 @@ webget() {
|
||||
if curl --version >/dev/null 2>&1; then
|
||||
[ "$3" = "echooff" ] && progress='-s' || progress='-#'
|
||||
[ -z "$4" ] && redirect='-L' || redirect=''
|
||||
result=$(curl -w %{http_code} --connect-timeout 5 $progress $redirect -ko $1 $2)
|
||||
result=$(curl -w %{http_code} --connect-timeout 5 "$progress" "$redirect" -ko "$1" "$2")
|
||||
[ -n "$(echo $result | grep -e ^2)" ] && result="200"
|
||||
else
|
||||
if wget --version >/dev/null 2>&1; then
|
||||
@@ -40,296 +42,331 @@ webget() {
|
||||
fi
|
||||
[ "$3" = "echoon" ] && progress=''
|
||||
[ "$3" = "echooff" ] && progress='-q'
|
||||
wget $progress $redirect $certificate $timeout -O $1 $2
|
||||
wget "$progress" "$redirect" "$certificate" "$timeout" -O "$1" "$2"
|
||||
[ $? -eq 0 ] && result="200"
|
||||
fi
|
||||
}
|
||||
error_down() {
|
||||
$echo "请参考 \033[32mhttps://github.com/juewuy/ShellCrash/blob/master/README_CN.md"
|
||||
$echo "\033[33m使用其他安装源重新安装!\033[0m"
|
||||
cecho "请参考 \033[32mhttps://github.com/juewuy/ShellCrash/blob/master/README_CN.md"
|
||||
cecho "\033[33m使用其他安装源重新安装!\033[0m"
|
||||
}
|
||||
|
||||
#安装及初始化
|
||||
# 安装及初始化
|
||||
set_alias() {
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[36m请选择一个别名,或使用自定义别名:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
$echo " 1 【\033[32mcrash\033[0m】"
|
||||
$echo " 2 【\033[32m sc \033[0m】"
|
||||
$echo " 3 【\033[32m mm \033[0m】"
|
||||
$echo " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字或自定义别名 > " res
|
||||
case "$res" in
|
||||
1) my_alias=crash ;;
|
||||
2) my_alias=sc ;;
|
||||
3) my_alias=mm ;;
|
||||
0) echo "安装已取消"; exit 1 ;;
|
||||
*) my_alias=$res ;;
|
||||
esac
|
||||
cmd=$(ckcmd "$my_alias" | grep 'menu.sh')
|
||||
ckcmd "$my_alias" && [ -z "$cmd" ] && {
|
||||
$echo "\033[33m此别名和当前系统内置命令/别名冲突,请换一个!\033[0m"
|
||||
sleep 1
|
||||
set_alias
|
||||
}
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[36m请选择一个别名,或使用自定义别名:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
cecho " 1 【\033[32mcrash\033[0m】"
|
||||
cecho " 2 【\033[32m sc \033[0m】"
|
||||
cecho " 3 【\033[32m mm \033[0m】"
|
||||
cecho " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字或自定义别名 > " res
|
||||
case "$res" in
|
||||
0)
|
||||
echo "安装已取消"
|
||||
exit 1
|
||||
;;
|
||||
1)
|
||||
my_alias=crash
|
||||
;;
|
||||
2)
|
||||
my_alias=sc
|
||||
;;
|
||||
3)
|
||||
my_alias=mm
|
||||
;;
|
||||
*)
|
||||
my_alias=$res
|
||||
;;
|
||||
esac
|
||||
cmd=$(ckcmd "$my_alias" | grep 'menu.sh')
|
||||
ckcmd "$my_alias" && [ -z "$cmd" ] && {
|
||||
cecho "\033[33m此别名和当前系统内置命令/别名冲突,请换一个!\033[0m"
|
||||
sleep 1
|
||||
continue
|
||||
}
|
||||
break
|
||||
done
|
||||
}
|
||||
|
||||
gettar() {
|
||||
webget /tmp/ShellCrash.tar.gz "$url/ShellCrash.tar.gz"
|
||||
webget /tmp/ShellCrash.tar.gz "$url/ShellCrash.tar.gz" >/dev/null 2>&1
|
||||
if [ "$result" != "200" ]; then
|
||||
$echo "\033[33m文件下载失败!\033[0m"
|
||||
cecho "\033[33m文件下载失败!\033[0m"
|
||||
error_down
|
||||
exit 1
|
||||
else
|
||||
$CRASHDIR/start.sh stop 2>/dev/null
|
||||
#解压
|
||||
"$CRASHDIR"/start.sh stop 2>/dev/null
|
||||
# 解压
|
||||
echo "-----------------------------------------------"
|
||||
echo 开始解压文件!
|
||||
mkdir -p $CRASHDIR >/dev/null
|
||||
tar -zxf '/tmp/ShellCrash.tar.gz' -C $CRASHDIR/ || tar -zxf '/tmp/ShellCrash.tar.gz' --no-same-owner -C $CRASHDIR/
|
||||
if [ -s $CRASHDIR/init.sh ]; then
|
||||
echo "开始解压文件!"
|
||||
mkdir -p "$CRASHDIR" >/dev/null
|
||||
tar -zxf '/tmp/ShellCrash.tar.gz' -C "$CRASHDIR"/ || tar -zxf '/tmp/ShellCrash.tar.gz' --no-same-owner -C "$CRASHDIR"/
|
||||
if [ -s "$CRASHDIR"/init.sh ]; then
|
||||
set_alias
|
||||
. $CRASHDIR/init.sh >/dev/null
|
||||
[ "$?" != 0 ] && $echo "\033[33m初始化失败,请尝试本地安装!\033[0m" && exit 1
|
||||
. "$CRASHDIR"/init.sh >/dev/null
|
||||
[ "$?" != 0 ] && cecho "\033[33m初始化失败,请尝试本地安装!\033[0m" && exit 1
|
||||
else
|
||||
rm -rf /tmp/ShellCrash.tar.gz
|
||||
$echo "\033[33m文件解压失败!\033[0m"
|
||||
cecho "\033[33m文件解压失败!\033[0m"
|
||||
error_down
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
setdir() {
|
||||
set_usb_dir() {
|
||||
$echo "请选择安装目录"
|
||||
set_usb_dir() {
|
||||
while true; do
|
||||
cecho "请选择安装目录"
|
||||
du -hL /mnt | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "请输入相应数字 > " num
|
||||
dir=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ -z "$dir" ]; then
|
||||
$echo "\033[31m输入错误!请重新设置!\033[0m"
|
||||
set_usb_dir
|
||||
cecho "\033[31m输入错误!请重新设置!\033[0m"
|
||||
continue
|
||||
fi
|
||||
}
|
||||
set_asus_dir() {
|
||||
echo -e "请选择U盘目录"
|
||||
du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "请输入相应数字 > " num
|
||||
dir=$(du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ ! -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ]; then
|
||||
echo -e "\033[31m未找到下载大师自启文件:$dir/asusware.arm/etc/init.d/S50downloadmaster,请检查设置!\033[0m"
|
||||
set_asus_dir
|
||||
fi
|
||||
}
|
||||
set_cust_dir() {
|
||||
break 1
|
||||
done
|
||||
}
|
||||
set_xiaomi_dir() {
|
||||
cecho "\033[33m检测到当前设备为小米官方系统,请选择安装位置\033[0m"
|
||||
[ -d /data ] && cecho " 1 安装到 /data 目录,剩余空间:$(dir_avail /data -h)(支持软固化功能)"
|
||||
[ -d /userdisk ] && cecho " 2 安装到 /userdisk 目录,剩余空间:$(dir_avail /userdisk -h)(支持软固化功能)"
|
||||
[ -d /data/other_vol ] && cecho " 3 安装到 /data/other_vol 目录,剩余空间:$(dir_avail /data/other_vol -h)(支持软固化功能)"
|
||||
cecho " 4 安装到自定义目录(不推荐,不明勿用!)"
|
||||
cecho " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/data
|
||||
;;
|
||||
2)
|
||||
dir=/userdisk
|
||||
;;
|
||||
3)
|
||||
dir=/data/other_vol
|
||||
;;
|
||||
4)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
set_asus_usb() {
|
||||
while true; do
|
||||
echo -e "请选择U盘目录"
|
||||
du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "请输入相应数字 > " num
|
||||
dir=$(du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ ! -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ]; then
|
||||
echo -e "\033[31m未找到下载大师自启文件:$dir/asusware.arm/etc/init.d/S50downloadmaster,请检查设置!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
set_asus_dir() {
|
||||
cecho "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m"
|
||||
cecho " 1 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)"
|
||||
cecho " 2 基于自启脚本安装(仅支持部分梅林固件)"
|
||||
cecho " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
1)
|
||||
echo -e "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!"
|
||||
sleep 2
|
||||
set_asus_usb
|
||||
;;
|
||||
2)
|
||||
cecho "如开机无法正常自启,请重新使用U盘+下载大师安装!"
|
||||
sleep 2
|
||||
dir=/jffs
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
set_cust_dir() {
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
echo '可用路径 剩余空间:'
|
||||
echo '可用路径 剩余空间:'
|
||||
df -h | awk '{print $6,$4}' | sed 1d
|
||||
echo '路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!!!'
|
||||
read -p "请输入自定义路径 > " dir
|
||||
if [ "$(dir_avail $dir)" = 0 ] || [ -n "$(echo $dir | grep -E 'tmp|opt|sys')" ]; then
|
||||
$echo "\033[31m路径错误!请重新设置!\033[0m"
|
||||
set_cust_dir
|
||||
if [ "$(dir_avail "$dir")" = 0 ] || [ -n "$(echo "$dir" | grep -Eq '^/(tmp|opt|sys)(/|$)')" ]; then
|
||||
cecho "\033[31m路径错误!请重新设置!\033[0m"
|
||||
continue
|
||||
fi
|
||||
}
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[33m注意:安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m"
|
||||
if [ -n "$systype" ]; then
|
||||
[ "$systype" = "Padavan" ] && dir=/etc/storage
|
||||
[ "$systype" = "mi_snapshot" ] && {
|
||||
$echo "\033[33m检测到当前设备为小米官方系统,请选择安装位置\033[0m"
|
||||
[ -d /data ] && $echo " 1 安装到 /data 目录,剩余空间:$(dir_avail /data -h)(支持软固化功能)"
|
||||
[ -d /userdisk ] && $echo " 2 安装到 /userdisk 目录,剩余空间:$(dir_avail /userdisk -h)(支持软固化功能)"
|
||||
[ -d /data/other_vol ] && $echo " 3 安装到 /data/other_vol 目录,剩余空间:$(dir_avail /data/other_vol -h)(支持软固化功能)"
|
||||
$echo " 4 安装到自定义目录(不推荐,不明勿用!)"
|
||||
$echo " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/data
|
||||
;;
|
||||
2)
|
||||
dir=/userdisk
|
||||
;;
|
||||
3)
|
||||
dir=/data/other_vol
|
||||
;;
|
||||
4)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
[ "$systype" = "asusrouter" ] && {
|
||||
$echo "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m"
|
||||
$echo " 1 基于USB设备安装(限23年9月之前固件,须插入\033[31m任意\033[0mUSB设备)"
|
||||
$echo " 2 基于自启脚本安装(仅支持梅林及部分非koolshare官改固件)"
|
||||
$echo " 3 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)"
|
||||
$echo " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
1)
|
||||
read -p "将脚本安装到USB存储/系统闪存?(1/0) > " res
|
||||
[ "$res" = "1" ] && set_usb_dir || dir=/jffs
|
||||
usb_status=1
|
||||
;;
|
||||
2)
|
||||
$echo "如无法正常开机启动,请重新使用USB方式安装!"
|
||||
sleep 2
|
||||
dir=/jffs
|
||||
;;
|
||||
3)
|
||||
echo -e "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!"
|
||||
sleep 2
|
||||
set_asus_dir
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
[ "$systype" = "ng_snapshot" ] && dir=/tmp/mnt
|
||||
else
|
||||
$echo " 1 在\033[32m/etc目录\033[0m下安装(适合root用户)"
|
||||
$echo " 2 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)"
|
||||
$echo " 3 在\033[32m当前用户目录\033[0m下安装(适合非root用户)"
|
||||
$echo " 4 在\033[32m外置存储\033[0m中安装"
|
||||
$echo " 5 手动设置安装目录"
|
||||
$echo " 0 退出安装"
|
||||
echo "----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
#设置目录
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/etc
|
||||
;;
|
||||
2)
|
||||
dir=/usr/share
|
||||
;;
|
||||
3)
|
||||
dir=~/.local/share
|
||||
mkdir -p ~/.config/systemd/user
|
||||
;;
|
||||
4)
|
||||
set_usb_dir
|
||||
;;
|
||||
5)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
echo "安装已取消"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
break 1
|
||||
done
|
||||
}
|
||||
|
||||
if [ ! -w $dir ]; then
|
||||
$echo "\033[31m没有$dir目录写入权限!请重新设置!\033[0m" && sleep 1 && setdir
|
||||
else
|
||||
$echo "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail $dir -h)"
|
||||
read -p "确认安装?(1/0) > " res
|
||||
[ "$res" = "1" ] && CRASHDIR=$dir/ShellCrash || setdir
|
||||
fi
|
||||
setdir() {
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[33m注意:安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m"
|
||||
case "$systype" in
|
||||
Padavan) dir=/etc/storage ;;
|
||||
mi_snapshot) set_xiaomi_dir ;;
|
||||
asusrouter) set_asus_dir ;;
|
||||
ng_snapshot) dir=/tmp/mnt ;;
|
||||
*)
|
||||
cecho " 1 在\033[32m/etc目录\033[0m下安装(适合root用户)"
|
||||
cecho " 2 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)"
|
||||
cecho " 3 在\033[32m当前用户目录\033[0m下安装(适合非root用户)"
|
||||
cecho " 4 在\033[32m外置存储\033[0m中安装"
|
||||
cecho " 5 手动设置安装目录"
|
||||
cecho " 0 退出安装"
|
||||
echo "----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
# 设置目录
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/etc
|
||||
;;
|
||||
2)
|
||||
dir=/usr/share
|
||||
;;
|
||||
3)
|
||||
dir=~/.local/share
|
||||
mkdir -p ~/.config/systemd/user
|
||||
;;
|
||||
4)
|
||||
set_usb_dir
|
||||
;;
|
||||
5)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
echo "安装已取消"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ ! -w "$dir" ]; then
|
||||
cecho "\033[31m没有$dir目录写入权限!请重新设置!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
cecho "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail "$dir" -h)"
|
||||
read -p "确认安装?(1/0) > " res
|
||||
if [ "$res" = "1" ]; then
|
||||
CRASHDIR="$dir"/ShellCrash
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
install() {
|
||||
echo "-----------------------------------------------"
|
||||
echo 开始从服务器获取安装文件!
|
||||
echo "开始从服务器获取安装文件!"
|
||||
echo "-----------------------------------------------"
|
||||
gettar
|
||||
echo "-----------------------------------------------"
|
||||
echo "ShellCrash 已经安装成功!"
|
||||
[ "$profile" = "~/.bashrc" ] && echo "请执行【. ~/.bashrc > /dev/null】命令以加载环境变量!"
|
||||
[ -n "$(ls -l /bin/sh | grep -oE 'zsh')" ] && echo "请执行【. ~/.zshrc > /dev/null】命令以加载环境变量!"
|
||||
[ "$profile" = "~/.bashrc" ] && echo "请执行【. ~/.bashrc > /dev/null】命令以更新环境变量!"
|
||||
[ -n "$(ls -l /bin/sh | grep -oE 'zsh')" ] && echo "请执行【. ~/.zshrc > /dev/null】命令以更新环境变量!"
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[33m输入\033[30;47m $my_alias \033[0;33m命令即可管理!!!\033[0m"
|
||||
cecho "\033[33m输入\033[30;47m $my_alias \033[0;33m命令即可管理!!!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
}
|
||||
setversion() {
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[33m请选择想要安装的版本:\033[0m"
|
||||
$echo " 1 \033[32m公测版(推荐)\033[0m"
|
||||
$echo " 2 \033[36m稳定版\033[0m"
|
||||
$echo " 3 \033[31m开发版\033[0m"
|
||||
cecho "\033[33m请选择想要安装的版本:\033[0m"
|
||||
cecho " 1 \033[32m公测版(推荐)\033[0m"
|
||||
cecho " 2 \033[36m稳定版\033[0m"
|
||||
cecho " 3 \033[31m开发版\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
2)
|
||||
url=$(echo $url | sed 's/master/stable/')
|
||||
;;
|
||||
3)
|
||||
url=$(echo $url | sed 's/master/dev/')
|
||||
;;
|
||||
1) release_type=master ;;
|
||||
2) release_type=stable ;;
|
||||
3) release_type=dev ;;
|
||||
*) ;;
|
||||
esac
|
||||
url=$(echo "$url" | sed "s/master/$release_type/")
|
||||
}
|
||||
#特殊固件识别及标记
|
||||
[ -f "/etc/storage/started_script.sh" ] && {
|
||||
systype=Padavan #老毛子固件
|
||||
initdir='/etc/storage/started_script.sh'
|
||||
|
||||
# 安装检查
|
||||
check_systype() {
|
||||
[ -f "/etc/storage/started_script.sh" ] && {
|
||||
systype=Padavan #老毛子固件
|
||||
initdir='/etc/storage/started_script.sh'
|
||||
}
|
||||
[ -d "/jffs" ] && {
|
||||
systype=asusrouter #华硕固件
|
||||
[ -f "/jffs/.asusrouter" ] && initdir='/jffs/.asusrouter'
|
||||
[ -d "/jffs/scripts" ] && initdir='/jffs/scripts/nat-start'
|
||||
}
|
||||
[ -f "/data/etc/crontabs/root" ] && systype=mi_snapshot #小米设备
|
||||
[ -w "/var/mnt/cfg/firewall" ] && systype=ng_snapshot #NETGEAR设备
|
||||
}
|
||||
[ -d "/jffs" ] && {
|
||||
systype=asusrouter #华硕固件
|
||||
[ -f "/jffs/.asusrouter" ] && initdir='/jffs/.asusrouter'
|
||||
[ -d "/jffs/scripts" ] && initdir='/jffs/scripts/nat-start'
|
||||
check_user() {
|
||||
if [ "$USER" != "root" ] && [ -z "$systype" ]; then
|
||||
echo "当前用户:$USER"
|
||||
cecho "\033[31m请尽量使用root用户(不要直接使用sudo命令!)执行安装!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "仍要安装?可能会产生未知错误!(1/0) > " res
|
||||
[ "$res" != "1" ] && exit 1
|
||||
fi
|
||||
}
|
||||
[ -f "/data/etc/crontabs/root" ] && systype=mi_snapshot #小米设备
|
||||
[ -w "/var/mnt/cfg/firewall" ] && systype=ng_snapshot #NETGEAR设备
|
||||
check_version() {
|
||||
echo "$url" | grep -q 'master' && setversion
|
||||
webget /tmp/version "$url/version" echooff
|
||||
[ "$result" = "200" ] && versionsh=$(cat /tmp/version)
|
||||
rm -rf /tmp/version
|
||||
|
||||
#检查root权限
|
||||
if [ "$USER" != "root" -a -z "$systype" ]; then
|
||||
echo 当前用户:$USER
|
||||
$echo "\033[31m请尽量使用root用户(不要直接使用sudo命令!)执行安装!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "仍要安装?可能会产生未知错误!(1/0) > " res
|
||||
[ "$res" != "1" ] && exit 1
|
||||
fi
|
||||
# 输出
|
||||
cecho "最新版本:\033[32m$versionsh\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/ShellClash \033[0m"
|
||||
cecho "\033[37m支持各种基于openwrt的路由器设备"
|
||||
cecho "\033[33m支持Debian、Centos等标准Linux系统\033[0m"
|
||||
}
|
||||
check_dir() {
|
||||
if [ -n "$CRASHDIR" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
cecho "检测到旧的安装目录\033[36m$CRASHDIR\033[0m,是否覆盖安装?"
|
||||
cecho "\033[32m覆盖安装时不会移除配置文件!\033[0m"
|
||||
echo " 1 覆盖安装"
|
||||
echo " 2 卸载旧版本并安装"
|
||||
echo " 0 取消安装"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
1)
|
||||
install
|
||||
;;
|
||||
2)
|
||||
[ "$CRASHDIR" != "/" ] && rm -rf "$CRASHDIR"
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[31m 旧版本文件已卸载!\033[0m"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
9)
|
||||
echo "测试模式,变更安装位置 $CRASHDIR"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
*)
|
||||
cecho "\033[31m已取消安装!\033[0m"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
else
|
||||
setdir
|
||||
install
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -n "$(echo $url | grep master)" ]; then
|
||||
setversion
|
||||
fi
|
||||
#获取版本信息
|
||||
webget /tmp/version "$url/version" echooff
|
||||
[ "$result" = "200" ] && versionsh=$(cat /tmp/version)
|
||||
rm -rf /tmp/version
|
||||
|
||||
#输出
|
||||
$echo "最新版本:\033[32m$versionsh\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/ShellClash \033[0m"
|
||||
$echo "\033[37m支持各种基于openwrt的路由器设备"
|
||||
$echo "\033[33m支持Debian、Centos等标准Linux系统\033[0m"
|
||||
|
||||
if [ -n "$CRASHDIR" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
$echo "检测到旧的安装目录\033[36m$CRASHDIR\033[0m,是否覆盖安装?"
|
||||
$echo "\033[32m覆盖安装时不会移除配置文件!\033[0m"
|
||||
read -p "覆盖安装/卸载旧版本?(1/0) > " res
|
||||
case "$res" in
|
||||
1)
|
||||
install
|
||||
;;
|
||||
0)
|
||||
rm -rf $CRASHDIR
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[31m 旧版本文件已卸载!\033[0m"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
9)
|
||||
echo "测试模式,变更安装位置"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
*)
|
||||
$echo "\033[31m输入错误!已取消安装!\033[0m"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
else
|
||||
setdir
|
||||
install
|
||||
fi
|
||||
check_systype
|
||||
check_user
|
||||
check_version
|
||||
check_dir
|
||||
|
||||
372
install_en.sh
Normal file
372
install_en.sh
Normal file
@@ -0,0 +1,372 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
echo "***********************************************"
|
||||
echo "** Welcome to **"
|
||||
echo "** ShellCrash **"
|
||||
echo "** by Juewuy **"
|
||||
echo "***********************************************"
|
||||
|
||||
language=en
|
||||
[ -z "$url" ] && url="https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master"
|
||||
|
||||
# Internal Tools
|
||||
cecho() {
|
||||
printf '%b\n' "$*"
|
||||
}
|
||||
dir_avail() {
|
||||
df -h >/dev/null 2>&1 && h="$2"
|
||||
df -P $h "${1:-.}" 2>/dev/null | awk 'NR==2 {print $4}'
|
||||
}
|
||||
ckcmd() {
|
||||
if command -v sh >/dev/null 2>&1; then
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
else
|
||||
type "$1" >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
webget() {
|
||||
# Parameter [$1] Download Path, [$2] Online URL
|
||||
# Parameter [$3] Display Output, [$4] Disable Redirects
|
||||
if curl --version >/dev/null 2>&1; then
|
||||
[ "$3" = "echooff" ] && progress='-s' || progress='-#'
|
||||
[ -z "$4" ] && redirect='-L' || redirect=''
|
||||
result=$(curl -w %{http_code} --connect-timeout 5 "$progress" "$redirect" -ko "$1" "$2")
|
||||
[ -n "$(echo $result | grep -e ^2)" ] && result="200"
|
||||
else
|
||||
if wget --version >/dev/null 2>&1; then
|
||||
[ "$3" = "echooff" ] && progress='-q' || progress='-q --show-progress'
|
||||
[ "$4" = "rediroff" ] && redirect='--max-redirect=0' || redirect=''
|
||||
certificate='--no-check-certificate'
|
||||
timeout='--timeout=3'
|
||||
fi
|
||||
[ "$3" = "echoon" ] && progress=''
|
||||
[ "$3" = "echooff" ] && progress='-q'
|
||||
wget "$progress" "$redirect" "$certificate" "$timeout" -O "$1" "$2"
|
||||
[ $? -eq 0 ] && result="200"
|
||||
fi
|
||||
}
|
||||
error_down() {
|
||||
cecho "Please refer to \033[32mhttps://github.com/juewuy/ShellCrash/blob/master/README.md"
|
||||
cecho "\033[33mUse an alternative source to reinstall!\033[0m"
|
||||
}
|
||||
|
||||
# Installation and Initialization
|
||||
set_alias() {
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[36mPlease select an alias or enter a custom one:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
cecho " 1 【\033[32mcrash\033[0m】"
|
||||
cecho " 2 【\033[32m sc \033[0m】"
|
||||
cecho " 3 【\033[32m mm \033[0m】"
|
||||
cecho " 0 Exit Installation"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "Enter number or custom alias > " res
|
||||
case "$res" in
|
||||
0)
|
||||
echo "Installation cancelled"
|
||||
exit 1
|
||||
;;
|
||||
1)
|
||||
my_alias=crash
|
||||
;;
|
||||
2)
|
||||
my_alias=sc
|
||||
;;
|
||||
3)
|
||||
my_alias=mm
|
||||
;;
|
||||
*)
|
||||
my_alias=$res
|
||||
;;
|
||||
esac
|
||||
cmd=$(ckcmd "$my_alias" | grep 'menu.sh')
|
||||
ckcmd "$my_alias" && [ -z "$cmd" ] && {
|
||||
cecho "\033[33mThis alias conflicts with a system command; please choose another!\033[0m"
|
||||
sleep 1
|
||||
continue
|
||||
}
|
||||
break
|
||||
done
|
||||
}
|
||||
gettar() {
|
||||
webget /tmp/ShellCrash.tar.gz "$url/ShellCrash.tar.gz" >/dev/null 2>&1
|
||||
if [ "$result" != "200" ]; then
|
||||
cecho "\033[33mFile download failed!\033[0m"
|
||||
error_down
|
||||
exit 1
|
||||
else
|
||||
"$CRASHDIR"/start.sh stop 2>/dev/null
|
||||
# Extract
|
||||
echo "-----------------------------------------------"
|
||||
echo "Starting file extraction!"
|
||||
mkdir -p "$CRASHDIR" >/dev/null
|
||||
tar -zxf '/tmp/ShellCrash.tar.gz' -C "$CRASHDIR"/ || tar -zxf '/tmp/ShellCrash.tar.gz' --no-same-owner -C "$CRASHDIR"/
|
||||
if [ -s "$CRASHDIR"/init.sh ]; then
|
||||
set_alias
|
||||
. "$CRASHDIR"/init.sh >/dev/null
|
||||
[ "$?" != 0 ] && cecho "\033[33mInitialization failed, try local installation!\033[0m" && exit 1
|
||||
else
|
||||
rm -rf /tmp/ShellCrash.tar.gz
|
||||
cecho "\033[33mFile extraction failed!\033[0m"
|
||||
error_down
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
set_usb_dir() {
|
||||
while true; do
|
||||
cecho "Please select installation directory"
|
||||
du -hL /mnt | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "Enter number > " num
|
||||
dir=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ -z "$dir" ]; then
|
||||
cecho "\033[31mInvalid input! Please try again!\033[0m"
|
||||
continue
|
||||
fi
|
||||
break 1
|
||||
done
|
||||
}
|
||||
set_xiaomi_dir() {
|
||||
cecho "\033[33mXiaomi device detected, please select installation location\033[0m"
|
||||
[ -d /data ] && cecho " 1 Install to /data, Free space: $(dir_avail /data -h) (Supports soft-hardening)"
|
||||
[ -d /userdisk ] && cecho " 2 Install to /userdisk, Free space: $(dir_avail /userdisk -h) (Supports soft-hardening)"
|
||||
[ -d /data/other_vol ] && cecho " 3 Install to /data/other_vol, Free space: $(dir_avail /data/other_vol -h) (Supports soft-hardening)"
|
||||
cecho " 4 Custom directory (Not recommended for beginners!)"
|
||||
cecho " 0 Exit"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "Enter number > " num
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/data
|
||||
;;
|
||||
2)
|
||||
dir=/userdisk
|
||||
;;
|
||||
3)
|
||||
dir=/data/other_vol
|
||||
;;
|
||||
4)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
set_asus_usb() {
|
||||
while true; do
|
||||
echo -e "Please select USB directory"
|
||||
du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "Enter number > " num
|
||||
dir=$(du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ ! -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ]; then
|
||||
echo -e "\033[31mDownload Master startup file not found: $dir/asusware.arm/etc/init.d/S50downloadmaster. Check settings!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
set_asus_dir() {
|
||||
cecho "\033[33mAsus firmware detected, please select installation method\033[0m"
|
||||
cecho " 1 Via USB + Download Master (Supports all firmware, ARM only, USB required)"
|
||||
cecho " 2 Via startup script (Merlin firmware only)"
|
||||
cecho " 0 Exit"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "Enter number > " num
|
||||
case "$num" in
|
||||
1)
|
||||
echo -e "Please install and enable Download Master in the router web UI first, then select the storage directory!"
|
||||
sleep 2
|
||||
set_asus_usb
|
||||
;;
|
||||
2)
|
||||
cecho "If auto-start fails after reboot, please use USB + Download Master method instead!"
|
||||
sleep 2
|
||||
dir=/jffs
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
set_cust_dir() {
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
echo 'Path | Free Space:'
|
||||
df -h | awk '{print $6,$4}' | sed 1d
|
||||
echo 'Path must start with "/". Files in virtual memory (/tmp, /opt, /sys...) will be lost on reboot!!!'
|
||||
read -p "Enter custom path > " dir
|
||||
if [ "$(dir_avail "$dir")" = 0 ] || [ -n "$(echo "$dir" | grep -Eq '^/(tmp|opt|sys)(/|$)')" ]; then
|
||||
cecho "\033[31mInvalid path! Please try again!\033[0m"
|
||||
continue
|
||||
fi
|
||||
break 1
|
||||
done
|
||||
}
|
||||
|
||||
setdir() {
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[33mNote: ShellCrash requires at least 1MB of disk space\033[0m"
|
||||
case "$systype" in
|
||||
Padavan) dir=/etc/storage ;;
|
||||
mi_snapshot) set_xiaomi_dir ;;
|
||||
asusrouter) set_asus_dir ;;
|
||||
ng_snapshot) dir=/tmp/mnt ;;
|
||||
*)
|
||||
cecho " 1 Install in \033[32m/etc\033[0m (Best for root users)"
|
||||
cecho " 2 Install in \033[32m/usr/share\033[0m (Standard Linux systems)"
|
||||
cecho " 3 Install in \033[32mUser Directory\033[0m (Best for non-root users)"
|
||||
cecho " 4 Install on \033[32mExternal Storage\033[0m"
|
||||
cecho " 5 Manual path entry"
|
||||
cecho " 0 Exit"
|
||||
echo "----------------------------------------------"
|
||||
read -p "Enter number > " num
|
||||
# Set Dir
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/etc
|
||||
;;
|
||||
2)
|
||||
dir=/usr/share
|
||||
;;
|
||||
3)
|
||||
dir=~/.local/share
|
||||
mkdir -p ~/.config/systemd/user
|
||||
;;
|
||||
4)
|
||||
set_usb_dir
|
||||
;;
|
||||
5)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
echo "Installation cancelled"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ ! -w "$dir" ]; then
|
||||
cecho "\033[31mNo write permission for $dir! Please reset!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
cecho "Target directory: \033[32m$dir\033[0m | Free space: $(dir_avail "$dir" -h)"
|
||||
read -p "Confirm installation? (1/0) > " res
|
||||
if [ "$res" = "1" ]; then
|
||||
CRASHDIR="$dir"/ShellCrash
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
install() {
|
||||
echo "-----------------------------------------------"
|
||||
echo "Retrieving installation files from server..."
|
||||
echo "-----------------------------------------------"
|
||||
gettar
|
||||
echo "-----------------------------------------------"
|
||||
echo "ShellCrash installed successfully!"
|
||||
[ "$profile" = "~/.bashrc" ] && echo "Please run [. ~/.bashrc > /dev/null] to update environment variables!"
|
||||
[ -n "$(ls -l /bin/sh | grep -oE 'zsh')" ] && echo "Please run [. ~/.zshrc > /dev/null] to update environment variables!"
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[33mType \033[30;47m $my_alias \033[0;33m to start management dashboard!!!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
}
|
||||
setversion() {
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[33mSelect version to install:\033[0m"
|
||||
cecho " 1 \033[32mBeta (Recommended)\033[0m"
|
||||
cecho " 2 \033[36mStable\033[0m"
|
||||
cecho " 3 \033[31mDev (Unstable)\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "Enter number > " num
|
||||
case "$num" in
|
||||
1) release_type=master ;;
|
||||
2) release_type=stable ;;
|
||||
3) release_type=dev ;;
|
||||
*) ;;
|
||||
esac
|
||||
url=$(echo "$url" | sed "s/master/$release_type/")
|
||||
}
|
||||
|
||||
# Pre-Install Checks
|
||||
check_systype() {
|
||||
[ -f "/etc/storage/started_script.sh" ] && {
|
||||
systype=Padavan # Padavan Firmware
|
||||
initdir='/etc/storage/started_script.sh'
|
||||
}
|
||||
[ -d "/jffs" ] && {
|
||||
systype=asusrouter # Asus Firmware
|
||||
[ -f "/jffs/.asusrouter" ] && initdir='/jffs/.asusrouter'
|
||||
[ -d "/jffs/scripts" ] && initdir='/jffs/scripts/nat-start'
|
||||
}
|
||||
[ -f "/data/etc/crontabs/root" ] && systype=mi_snapshot # Xiaomi device
|
||||
[ -w "/var/mnt/cfg/firewall" ] && systype=ng_snapshot # NETGEAR device
|
||||
}
|
||||
check_user() {
|
||||
if [ "$USER" != "root" ] && [ -z "$systype" ]; then
|
||||
echo "Current User: $USER"
|
||||
cecho "\033[31mPlease use the root user (do not use sudo directly!) to install!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "Install anyway? Unknown errors may occur! (1/0) > " res
|
||||
[ "$res" != "1" ] && exit 1
|
||||
fi
|
||||
}
|
||||
check_version() {
|
||||
echo "$url" | grep -q 'master' && setversion
|
||||
webget /tmp/version "$url/version" echooff
|
||||
[ "$result" = "200" ] && versionsh=$(cat /tmp/version)
|
||||
rm -rf /tmp/version
|
||||
|
||||
# Output
|
||||
cecho "Latest Version: \033[32m$versionsh\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[44mFor issues, please join the TG group: \033[42;30m t.me/ShellClash \033[0m"
|
||||
cecho "\033[37mSupports various OpenWrt-based router devices"
|
||||
cecho "\033[33mSupports Debian, Centos and standard Linux systems\033[0m"
|
||||
}
|
||||
check_dir() {
|
||||
if [ -n "$CRASHDIR" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
cecho "Old installation detected at \033[36m$CRASHDIR\033[0m. Overwrite?"
|
||||
cecho "\033[32mConfiguration files will NOT be removed during overwrite!\033[0m"
|
||||
echo " 1 Overwrite Installation"
|
||||
echo " 2 Uninstall old version and reinstall"
|
||||
echo " 0 Cancel"
|
||||
read -p "Enter number > " num
|
||||
case "$num" in
|
||||
1)
|
||||
install
|
||||
;;
|
||||
2)
|
||||
[ "$CRASHDIR" != "/" ] && rm -rf "$CRASHDIR"
|
||||
echo "-----------------------------------------------"
|
||||
cecho "\033[31mOld version uninstalled!\033[0m"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
9)
|
||||
echo "Test Mode: Changing installation path $CRASHDIR"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
*)
|
||||
cecho "\033[31mInstallation cancelled!\033[0m"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
else
|
||||
setdir
|
||||
install
|
||||
fi
|
||||
}
|
||||
|
||||
check_systype
|
||||
check_user
|
||||
check_version
|
||||
check_dir
|
||||
@@ -1,25 +1,25 @@
|
||||
#DustinWin-geosite全分组规则+去广告
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {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: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {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: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
- {name: 🛑 广告域名, type: select, proxies: [🔴 全球拦截, 🟢 全球绕过]}
|
||||
- {name: 🔴 全球拦截, type: select, proxies: [REJECT], hidden: true}
|
||||
- {name: 🟢 全球绕过, type: select, proxies: [PASS], hidden: true}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
@@ -39,15 +39,15 @@ rules:
|
||||
- GEOSITE,apple-cn,🍎 苹果服务
|
||||
- GEOSITE,google-cn,🇬 谷歌服务
|
||||
- GEOSITE,games-cn,🎮 游戏服务
|
||||
- GEOSITE,games,🕹️ 游戏平台
|
||||
- GEOSITE,media,🌍 国外媒体
|
||||
- GEOSITE,games,🎮 游戏平台
|
||||
- GEOSITE,ai,🤖 AI 平台
|
||||
- GEOSITE,networktest,📈 网络测试
|
||||
- GEOSITE,proxy,🧱 代理域名
|
||||
- GEOSITE,cn,🛡️ 直连域名
|
||||
- GEOIP,private,🔒 私有网络,no-resolve
|
||||
- GEOIP,cn,🀄️ 直连 IP
|
||||
- GEOIP,media,🌍 国外媒体
|
||||
- GEOIP,games,🎮 游戏平台
|
||||
- GEOIP,telegram,📲 电报消息,no-resolve
|
||||
- GEOIP,games,🕹️ 游戏平台
|
||||
- GEOIP,media,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
@@ -1,22 +1,22 @@
|
||||
#DustinWin-geosite全分组规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {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: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {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: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
@@ -35,15 +35,15 @@ rules:
|
||||
- GEOSITE,apple-cn,🍎 苹果服务
|
||||
- GEOSITE,google-cn,🇬 谷歌服务
|
||||
- GEOSITE,games-cn,🎮 游戏服务
|
||||
- GEOSITE,games,🕹️ 游戏平台
|
||||
- GEOSITE,media,🌍 国外媒体
|
||||
- GEOSITE,games,🎮 游戏平台
|
||||
- GEOSITE,ai,🤖 AI 平台
|
||||
- GEOSITE,networktest,📈 网络测试
|
||||
- GEOSITE,proxy,🧱 代理域名
|
||||
- GEOSITE,cn,🛡️ 直连域名
|
||||
- GEOIP,private,🔒 私有网络,no-resolve
|
||||
- GEOIP,cn,🀄️ 直连 IP
|
||||
- GEOIP,media,🌍 国外媒体
|
||||
- GEOIP,games,🎮 游戏平台
|
||||
- GEOIP,telegram,📲 电报消息,no-resolve
|
||||
- GEOIP,games,🕹️ 游戏平台
|
||||
- GEOIP,media,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
@@ -1,12 +1,12 @@
|
||||
#DustinWin-gesite轻量规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🀄️ 直连 IP, 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: [全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
#DustinWin-geosite标准规则+去广告
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {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: 🤖 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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
- {name: 🛑 广告域名, type: select, proxies: [🔴 全球拦截, 🟢 全球绕过]}
|
||||
- {name: 🔴 全球拦截, type: select, proxies: [REJECT], hidden: true}
|
||||
- {name: 🟢 全球绕过, type: select, proxies: [PASS], hidden: true}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
#DustinWin-geosite标准规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {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: 🤖 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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
#DustinWin-ruleset全分组规则+去广告
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {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: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏平台, type: select, proxies: [🚀 节点选择, 🎯 全球直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {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: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
- {name: 🛑 广告域名, type: select, proxies: [🔴 全球拦截, 🟢 全球绕过]}
|
||||
- {name: 🔴 全球拦截, type: select, proxies: [REJECT], hidden: true}
|
||||
- {name: 🟢 全球绕过, type: select, proxies: [PASS], hidden: true}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
@@ -32,20 +34,20 @@ proxy-groups:
|
||||
- {name: 🇺🇸 美国节点, type: url-test, tolerance: 100, include-all: true, filter: "(?i)(🇺🇸|美|us|unitedstates|united states)"}
|
||||
|
||||
rule-providers:
|
||||
private:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/private.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
ads:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/ads.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/ads.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/ads.mrs"
|
||||
interval: 86400
|
||||
|
||||
private:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/private.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
@@ -53,7 +55,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/trackerslist.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
@@ -61,7 +63,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/microsoft-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/microsoft-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/microsoft-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
apple-cn:
|
||||
@@ -69,7 +71,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/apple-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/apple-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/apple-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
google-cn:
|
||||
@@ -77,7 +79,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/google-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/google-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/google-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
games-cn:
|
||||
@@ -85,15 +87,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/games-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
media:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/media.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/media.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/games-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
games:
|
||||
@@ -101,7 +95,31 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/games.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/games.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflix:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/netflix.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/netflix.mrs"
|
||||
interval: 86400
|
||||
|
||||
youtube:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/youtube.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/youtube.mrs"
|
||||
interval: 86400
|
||||
|
||||
media:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/media.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/media.mrs"
|
||||
interval: 86400
|
||||
|
||||
ai:
|
||||
@@ -109,7 +127,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/ai.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/ai.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/ai.mrs"
|
||||
interval: 86400
|
||||
|
||||
networktest:
|
||||
@@ -117,7 +135,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/networktest.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/networktest.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/networktest.mrs"
|
||||
interval: 86400
|
||||
|
||||
proxy:
|
||||
@@ -125,7 +143,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/proxy.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/proxy.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/proxy.mrs"
|
||||
interval: 86400
|
||||
|
||||
cn:
|
||||
@@ -133,7 +151,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
privateip:
|
||||
@@ -141,7 +159,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/privateip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/privateip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/privateip.mrs"
|
||||
interval: 86400
|
||||
|
||||
cnip:
|
||||
@@ -149,23 +167,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/cnip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
mediaip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/mediaip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/mediaip.mrs"
|
||||
interval: 86400
|
||||
|
||||
gamesip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/gamesip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/gamesip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
telegramip:
|
||||
@@ -173,7 +175,31 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/telegramip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/telegramip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/telegramip.mrs"
|
||||
interval: 86400
|
||||
|
||||
gamesip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/gamesip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/gamesip.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflixip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/netflixip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/netflixip.mrs"
|
||||
interval: 86400
|
||||
|
||||
mediaip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/mediaip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/mediaip.mrs"
|
||||
interval: 86400
|
||||
|
||||
rules:
|
||||
@@ -184,15 +210,18 @@ rules:
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
- RULE-SET,games-cn,🎮 游戏服务
|
||||
- RULE-SET,games,🕹️ 游戏平台
|
||||
- RULE-SET,netflix,🎥 奈飞视频
|
||||
- RULE-SET,youtube,📹 油管视频
|
||||
- RULE-SET,media,🌍 国外媒体
|
||||
- RULE-SET,games,🎮 游戏平台
|
||||
- RULE-SET,ai,🤖 AI 平台
|
||||
- RULE-SET,networktest,📈 网络测试
|
||||
- RULE-SET,proxy,🧱 代理域名
|
||||
- RULE-SET,cn,🛡️ 直连域名
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,cnip,🀄️ 直连 IP
|
||||
- RULE-SET,mediaip,🌍 国外媒体
|
||||
- RULE-SET,gamesip,🎮 游戏平台
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- MATCH,🐟 漏网之鱼
|
||||
- RULE-SET,gamesip,🕹️ 游戏平台
|
||||
- RULE-SET,netflixip,🎥 奈飞视频
|
||||
- RULE-SET,mediaip,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
#DustinWin-ruleset全分组规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {name: 📋 Trackerslist, type: select, proxies: [🎯 全球直连, 🚀 节点选择]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 全球直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 全球直连, 🚀 节点选择]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 全球直连, 🚀 节点选择]}
|
||||
- {name: 🌍 国外媒体, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏平台, type: select, proxies: [🚀 节点选择, 🎯 全球直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {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: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 👑 高级节点, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎮 游戏服务, type: select, proxies: [🎯 本地直连, 👑 高级节点, 🚀 节点选择]}
|
||||
- {name: 🪟 微软服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🇬 谷歌服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 本地直连, 🚀 节点选择]}
|
||||
- {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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
@@ -34,7 +36,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/private.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/private.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
@@ -42,7 +44,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/trackerslist.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
@@ -50,7 +52,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/microsoft-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/microsoft-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/microsoft-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
apple-cn:
|
||||
@@ -58,7 +60,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/apple-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/apple-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/apple-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
google-cn:
|
||||
@@ -66,7 +68,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/google-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/google-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/google-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
games-cn:
|
||||
@@ -74,15 +76,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/games-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
media:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/media.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/media.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/games-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
games:
|
||||
@@ -90,7 +84,31 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/games.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/games.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflix:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/netflix.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/netflix.mrs"
|
||||
interval: 86400
|
||||
|
||||
youtube:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/youtube.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/youtube.mrs"
|
||||
interval: 86400
|
||||
|
||||
media:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/media.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/media.mrs"
|
||||
interval: 86400
|
||||
|
||||
ai:
|
||||
@@ -98,7 +116,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/ai.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/ai.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/ai.mrs"
|
||||
interval: 86400
|
||||
|
||||
networktest:
|
||||
@@ -106,7 +124,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/networktest.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/networktest.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/networktest.mrs"
|
||||
interval: 86400
|
||||
|
||||
proxy:
|
||||
@@ -114,7 +132,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/proxy.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/proxy.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/proxy.mrs"
|
||||
interval: 86400
|
||||
|
||||
cn:
|
||||
@@ -122,7 +140,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
privateip:
|
||||
@@ -130,7 +148,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/privateip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/privateip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/privateip.mrs"
|
||||
interval: 86400
|
||||
|
||||
cnip:
|
||||
@@ -138,23 +156,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/cnip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
mediaip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/mediaip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/mediaip.mrs"
|
||||
interval: 86400
|
||||
|
||||
gamesip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/gamesip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/gamesip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
telegramip:
|
||||
@@ -162,7 +164,31 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/telegramip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/telegramip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/telegramip.mrs"
|
||||
interval: 86400
|
||||
|
||||
gamesip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/gamesip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/gamesip.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflixip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/netflixip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/netflixip.mrs"
|
||||
interval: 86400
|
||||
|
||||
mediaip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/mediaip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/mediaip.mrs"
|
||||
interval: 86400
|
||||
|
||||
rules:
|
||||
@@ -172,15 +198,18 @@ rules:
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
- RULE-SET,games-cn,🎮 游戏服务
|
||||
- RULE-SET,games,🕹️ 游戏平台
|
||||
- RULE-SET,netflix,🎥 奈飞视频
|
||||
- RULE-SET,youtube,📹 油管视频
|
||||
- RULE-SET,media,🌍 国外媒体
|
||||
- RULE-SET,games,🎮 游戏平台
|
||||
- RULE-SET,ai,🤖 AI 平台
|
||||
- RULE-SET,networktest,📈 网络测试
|
||||
- RULE-SET,proxy,🧱 代理域名
|
||||
- RULE-SET,cn,🛡️ 直连域名
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,cnip,🀄️ 直连 IP
|
||||
- RULE-SET,mediaip,🌍 国外媒体
|
||||
- RULE-SET,gamesip,🎮 游戏平台
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- MATCH,🐟 漏网之鱼
|
||||
- RULE-SET,gamesip,🕹️ 游戏平台
|
||||
- RULE-SET,netflixip,🎥 奈飞视频
|
||||
- RULE-SET,mediaip,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#DustinWin-ruleset轻量规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT, 🚀 节点选择]}
|
||||
- {name: 🎯 本地直连, type: select, proxies: [DIRECT, 🚀 节点选择]}
|
||||
- {name: 🧱 代理域名, type: select, proxies: [🚀 节点选择, DIRECT]}
|
||||
- {name: 📲 电报消息, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
@@ -22,7 +22,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
private:
|
||||
@@ -30,7 +30,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/private.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/private.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
tld-proxy:
|
||||
@@ -38,7 +38,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/tld-proxy.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/tld-proxy.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/tld-proxy.mrs"
|
||||
interval: 86400
|
||||
|
||||
proxy:
|
||||
@@ -46,7 +46,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/proxy.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/proxy.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/proxy.mrs"
|
||||
interval: 86400
|
||||
|
||||
privateip:
|
||||
@@ -54,7 +54,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/privateip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/privateip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/privateip.mrs"
|
||||
interval: 86400
|
||||
|
||||
cnip:
|
||||
@@ -62,7 +62,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/cnip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cnip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
telegramip:
|
||||
@@ -70,15 +70,15 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/telegramip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/telegramip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/telegramip.mrs"
|
||||
interval: 86400
|
||||
|
||||
rules:
|
||||
- RULE-SET,private,DIRECT
|
||||
- RULE-SET,tld-proxy,🧱 代理域名
|
||||
- RULE-SET,proxy,🧱 代理域名
|
||||
- RULE-SET,cn,🎯 全球直连
|
||||
- RULE-SET,cn,🎯 本地直连
|
||||
- RULE-SET,privateip,DIRECT,no-resolve
|
||||
- RULE-SET,cnip,🎯 全球直连
|
||||
- RULE-SET,cnip,🎯 本地直连
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- MATCH,🐟 漏网之鱼
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
#DustinWin-ruleset标准规则+去广告
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {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: 🤖 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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 本地直连]}
|
||||
- {name: 🛑 广告域名, type: select, proxies: [🔴 全球拦截, 🟢 全球绕过]}
|
||||
- {name: 🔴 全球拦截, type: select, proxies: [REJECT], hidden: true}
|
||||
- {name: 🟢 全球绕过, type: select, proxies: [PASS], hidden: true}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
@@ -35,7 +35,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/private.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/private.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
ads:
|
||||
@@ -43,7 +43,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/ads.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/ads.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/ads.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
@@ -51,7 +51,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/trackerslist.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
@@ -59,7 +59,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/microsoft-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/microsoft-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/microsoft-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
apple-cn:
|
||||
@@ -67,7 +67,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/apple-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/apple-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/apple-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
google-cn:
|
||||
@@ -75,7 +75,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/google-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/google-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/google-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
games-cn:
|
||||
@@ -83,7 +83,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/games-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/games-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
ai:
|
||||
@@ -91,7 +91,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/ai.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/ai.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/ai.mrs"
|
||||
interval: 86400
|
||||
|
||||
networktest:
|
||||
@@ -99,7 +99,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/networktest.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/networktest.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/networktest.mrs"
|
||||
interval: 86400
|
||||
|
||||
proxy:
|
||||
@@ -107,7 +107,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/proxy.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/proxy.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/proxy.mrs"
|
||||
interval: 86400
|
||||
|
||||
cn:
|
||||
@@ -115,7 +115,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
privateip:
|
||||
@@ -123,7 +123,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/privateip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/privateip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/privateip.mrs"
|
||||
interval: 86400
|
||||
|
||||
cnip:
|
||||
@@ -131,7 +131,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/cnip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cnip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
telegramip:
|
||||
@@ -139,7 +139,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/telegramip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/telegramip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/telegramip.mrs"
|
||||
interval: 86400
|
||||
|
||||
rules:
|
||||
@@ -157,4 +157,4 @@ rules:
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,cnip,🀄️ 直连 IP
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- MATCH,🐟 漏网之鱼
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
#DustinWin-ruleset标准规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, 👉 手动选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 📈 网络测试, type: select, proxies: [🎯 全球直连, 🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点]}
|
||||
- {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: 🤖 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: [🎯 全球直连], hidden: true}
|
||||
- {name: 🐟 漏网之鱼, type: select, proxies: [🚀 节点选择, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}, 🎯 全球直连]}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
- {name: 🔒 私有网络, type: select, proxies: [🎯 本地直连], hidden: true}
|
||||
- {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]|低倍率|省流|大流量)"}
|
||||
@@ -32,7 +32,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/private.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/private.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/private.mrs"
|
||||
interval: 86400
|
||||
|
||||
trackerslist:
|
||||
@@ -40,7 +40,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/trackerslist.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/trackerslist.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/trackerslist.mrs"
|
||||
interval: 86400
|
||||
|
||||
microsoft-cn:
|
||||
@@ -48,7 +48,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/microsoft-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/microsoft-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/microsoft-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
apple-cn:
|
||||
@@ -56,7 +56,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/apple-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/apple-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/apple-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
google-cn:
|
||||
@@ -64,7 +64,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/google-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/google-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/google-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
games-cn:
|
||||
@@ -72,7 +72,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/games-cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games-cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/games-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
ai:
|
||||
@@ -80,7 +80,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/ai.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/ai.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/ai.mrs"
|
||||
interval: 86400
|
||||
|
||||
networktest:
|
||||
@@ -88,7 +88,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/networktest.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/networktest.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/networktest.mrs"
|
||||
interval: 86400
|
||||
|
||||
proxy:
|
||||
@@ -96,7 +96,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/proxy.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/proxy.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/proxy.mrs"
|
||||
interval: 86400
|
||||
|
||||
cn:
|
||||
@@ -104,7 +104,7 @@ rule-providers:
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cn-lite.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
privateip:
|
||||
@@ -112,7 +112,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/privateip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/privateip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/privateip.mrs"
|
||||
interval: 86400
|
||||
|
||||
cnip:
|
||||
@@ -120,7 +120,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/cnip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cnip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
telegramip:
|
||||
@@ -128,7 +128,7 @@ rule-providers:
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/telegramip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/telegramip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/telegramip.mrs"
|
||||
interval: 86400
|
||||
|
||||
rules:
|
||||
@@ -145,4 +145,4 @@ rules:
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,cnip,🀄️ 直连 IP
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- MATCH,🐟 漏网之鱼
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ShellCrash-geosite极简规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [{providers_tags}], include-all: true}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT, 🚀 节点选择]}
|
||||
- {name: 🎯 本地直连, type: select, proxies: [DIRECT, 🚀 节点选择]}
|
||||
rules:
|
||||
- GEOIP,cn,🎯 全球直连
|
||||
- GEOIP,cn,🎯 本地直连
|
||||
- MATCH,🚀 节点选择
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#ShellCrash-ruleset 全分组规则+去广告 For mihomo By Maozai 260107
|
||||
#ShellCrash-ruleset 全分组规则+去广告 For mihomo By Maozai 260111
|
||||
|
||||
#此版本为Maozai根据ACL4SSR规则修改优化而来,尽量在保持原有的基础上进行优化。
|
||||
#数据源采用了DustinWin/ruleset_geodata和MetaCubeX/meta-rules-dat两个开源项目的规则,感谢原作者的辛勤付出。
|
||||
@@ -11,12 +11,12 @@ proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, ✨ 自动选择(去高倍率), 🛠️ 手动切换, ⚖️ 负载均衡, 🚑 故障转移, 🎯 本地直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🛠️ 手动切换, type: select, include-all: true, proxies: [🎯 本地直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: ♻️ 自动选择, type: url-test, interval: 1800, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"}
|
||||
- {name: ✨ 自动选择(去高倍率), type: url-test, interval: 1800, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|\\d{2,}))"}
|
||||
- {name: ⚖️ 负载均衡, type: load-balance, interval: 1800, include-all: true, hidden: true}
|
||||
- {name: 🚑 故障转移, type: fallback, interval: 1800, include-all: true, hidden: true}
|
||||
|
||||
- {name: ✨ 自动选择(去高倍率), type: url-test, interval: 1800, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)`(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|\\d{2,}))"}
|
||||
- {name: ⚖️ 负载均衡, type: load-balance, interval: 1800, include-all: true, hidden: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"}
|
||||
- {name: 🚑 故障转移, type: fallback, interval: 1800, include-all: true, hidden: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"}
|
||||
#
|
||||
- {name: 🤖 AI 平台, type: select, proxies: [🚀 节点选择, 🤖 AI节点(过滤港澳), 🎯 本地直连, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🤖 AI节点(过滤港澳), type: url-test, interval: 3600, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|🇭🇰|港|🇲🇴|澳门|hk|hongkong|hong kong)", hidden: true}
|
||||
- {name: 🤖 AI节点(过滤港澳), type: url-test, interval: 3600, tolerance: 50, include-all: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)`(?i)(🇭🇰|港|🇲🇴|澳门|hk|hongkong|hong kong)", hidden: true}
|
||||
- {name: 🎬 奈飞视频, type: select, proxies: [🚀 节点选择, 🎬 奈飞节点, 🎯 本地直连, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🎬 奈飞节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(NF|奈飞|解锁|Netflix|NETFLIX|Media)", hidden: true}
|
||||
- {name: ▶️ 油管视频, type: select, proxies: [🚀 节点选择, 🎯 本地直连, ♻️ 自动选择, 🛠️ 手动切换, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
@@ -45,10 +45,10 @@ proxy-groups:
|
||||
- {name: 🎯 本地直连, type: select, proxies: [DIRECT], hidden: true}
|
||||
|
||||
- {name: 🇭🇰 香港节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇭🇰|港|hk|hongkong|hong kong)"}
|
||||
- {name: 🇹🇼 台湾节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇹🇼|台|tw|taiwan|tai wan)"}
|
||||
- {name: 🇺🇸 美国节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇺🇸|美|洛杉矶|圣何塞|西雅图|纽约|波特兰|旧金山|us|unitedstates|united states)"}
|
||||
- {name: 🇯🇵 日本节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇯🇵|日|东京|大阪|埼玉|九州|jp|japan)"}
|
||||
- {name: 🇪🇺 欧洲节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇪🇺|欧|德|英|法|荷|俄罗斯|西班牙|意大利|瑞士|瑞典|土耳其|挪威|芬兰|丹麦|比利时|爱尔兰|奥地利|波兰|葡萄牙|乌克兰|希腊|捷克|匈牙利|罗马尼亚|保加利亚|冰岛|克罗地亚)"}
|
||||
- {name: 🇹🇼 台湾节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇹🇼|台|tw|taiwan|tai wan)", exclude-filter: "(?i)(仙台)"}
|
||||
- {name: 🇺🇸 美国节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇺🇸|美|洛杉矶|圣何塞|西雅图|纽约|波特兰|旧金山|休斯|达拉斯|硅谷|堪萨斯|迈阿密|凤凰城|芝加哥|奥勒姆|us|unitedstates|united states)", exclude-filter: "(?i)(南美|中美|拉美|亚美尼亚|美属)"}
|
||||
- {name: 🇯🇵 日本节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇯🇵|日|东京|大阪|埼玉|九州|仙台|jp|japan)", exclude-filter: "(?i)(尼日利亚|尼日尔|日内瓦)"}
|
||||
- {name: 🇪🇺 欧洲节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇪🇺|欧|德|英|法|荷|俄罗斯|西班牙|意大利|瑞士|瑞典|土耳其|挪威|芬兰|丹麦|比利时|爱尔兰|奥地利|波兰|葡萄牙|乌克兰|希腊|捷克|匈牙利|罗马尼亚|保加利亚|冰岛|克罗地亚|阿姆斯特丹)"}
|
||||
- {name: 🇰🇷 韩国节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇰🇷|韩|韓|首尔|kr|kor)"}
|
||||
- {name: 🇸🇬 狮城节点, type: url-test, tolerance: 50, include-all: true, filter: "(?i)(🇸🇬|新加坡|狮城|sg|singapore)"}
|
||||
|
||||
@@ -221,8 +221,8 @@ rule-providers:
|
||||
|
||||
#规则顺序
|
||||
rules:
|
||||
- DOMAIN-SUFFIX,captive.apple.com,DIRECT
|
||||
- DOMAIN-SUFFIX,kamo.teracloud.jp,DIRECT
|
||||
- DOMAIN-SUFFIX,captive.apple.com,🍎 苹果服务
|
||||
- DOMAIN-SUFFIX,kamo.teracloud.jp,🀄️ 国内流量
|
||||
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,private,🔒 私有网络
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
#ShellCrash-ruleset极简规则
|
||||
proxy-groups:
|
||||
- {name: 🚀 节点选择, type: select, proxies: [{providers_tags}], include-all: true}
|
||||
- {name: 🎯 全球直连, type: select, proxies: [DIRECT, 🚀 节点选择]}
|
||||
- {name: 🎯 本地直连, type: select, proxies: [DIRECT, 🚀 节点选择]}
|
||||
rule-providers:
|
||||
cn:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/cn.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cn.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cn.mrs"
|
||||
interval: 86400
|
||||
privateip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/privateip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/privateip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/privateip.mrs"
|
||||
interval: 86400
|
||||
cnip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/cnip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cnip.mrs"
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
rules:
|
||||
- RULE-SET,privateip,🎯 全球直连,no-resolve
|
||||
- RULE-SET,cn,🎯 全球直连
|
||||
- RULE-SET,cnip,🎯 全球直连
|
||||
- RULE-SET,privateip,🎯 本地直连,no-resolve
|
||||
- RULE-SET,cn,🎯 本地直连
|
||||
- RULE-SET,cnip,🎯 本地直连
|
||||
- MATCH,🚀 节点选择
|
||||
|
||||
@@ -3,14 +3,16 @@
|
||||
"outbounds": [
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": [ "♻️ 自动选择", "👉 手动选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", "🎯 本地直连", {providers_tags} ] },
|
||||
{ "tag": "📈 网络测试", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点" ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🕹️ 游戏平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🎮 游戏服务", "type": "selector", "outbounds": [ "🎯 本地直连", "👑 高级节点", "🚀 节点选择" ] },
|
||||
{ "tag": "🪟 微软服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇬 谷歌服务", "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": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {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": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
@@ -39,29 +41,24 @@
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
{ "rule_set": [ "games-cn" ], "outbound": "🎮 游戏服务" },
|
||||
{ "rule_set": [ "games" ], "outbound": "🕹️ 游戏平台" },
|
||||
{ "rule_set": [ "netflix" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "youtube" ], "outbound": "📹 油管视频" },
|
||||
{ "rule_set": [ "media" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "games" ], "outbound": "🎮 游戏平台" },
|
||||
{ "rule_set": [ "ai" ], "outbound": "🤖 AI 平台" },
|
||||
{ "rule_set": [ "networktest" ], "outbound": "📈 网络测试" },
|
||||
{ "rule_set": [ "proxy" ], "outbound": "🧱 代理域名" },
|
||||
{ "rule_set": [ "cn" ], "outbound": "🛡️ 直连域名" },
|
||||
{ "rule_set": [ "privateip" ], "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": "🀄️ 直连 IP" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🎮 游戏平台" }
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🕹️ 游戏平台" },
|
||||
{ "rule_set": [ "netflixip" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" }
|
||||
],
|
||||
"rule_set": [
|
||||
{
|
||||
"tag": "private",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/private.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "ads",
|
||||
"type": "remote",
|
||||
@@ -70,6 +67,14 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/ads.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "private",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/private.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "trackerslist",
|
||||
"type": "remote",
|
||||
@@ -110,14 +115,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/games-cn.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "media",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/media.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/media.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "games",
|
||||
"type": "remote",
|
||||
@@ -126,6 +123,30 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/games.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "netflix",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/netflix.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/netflix.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "youtube",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/youtube.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/youtube.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "media",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/media.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/media.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "ai",
|
||||
"type": "remote",
|
||||
@@ -159,11 +180,11 @@
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "privateip",
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/privateip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/privateip.srs",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
@@ -174,14 +195,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "mediaip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/mediaip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/mediaip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "gamesip",
|
||||
"type": "remote",
|
||||
@@ -191,11 +204,19 @@
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "telegramip",
|
||||
"tag": "netflixip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"path": "./ruleset/netflixip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/netflixip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "mediaip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/mediaip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/mediaip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
}
|
||||
],
|
||||
|
||||
@@ -3,14 +3,16 @@
|
||||
"outbounds": [
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": [ "♻️ 自动选择", "👉 手动选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", "🎯 本地直连", {providers_tags} ] },
|
||||
{ "tag": "📈 网络测试", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点" ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🕹️ 游戏平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🎮 游戏服务", "type": "selector", "outbounds": [ "🎯 本地直连", "👑 高级节点", "🚀 节点选择" ] },
|
||||
{ "tag": "🪟 微软服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🇬 谷歌服务", "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": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {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": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
@@ -36,19 +38,22 @@
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
{ "rule_set": [ "games-cn" ], "outbound": "🎮 游戏服务" },
|
||||
{ "rule_set": [ "games" ], "outbound": "🕹️ 游戏平台" },
|
||||
{ "rule_set": [ "netflix" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "youtube" ], "outbound": "📹 油管视频" },
|
||||
{ "rule_set": [ "media" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "games" ], "outbound": "🎮 游戏平台" },
|
||||
{ "rule_set": [ "ai" ], "outbound": "🤖 AI 平台" },
|
||||
{ "rule_set": [ "networktest" ], "outbound": "📈 网络测试" },
|
||||
{ "rule_set": [ "proxy" ], "outbound": "🧱 代理域名" },
|
||||
{ "rule_set": [ "cn" ], "outbound": "🛡️ 直连域名" },
|
||||
{ "rule_set": [ "privateip" ], "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": "🀄️ 直连 IP" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🎮 游戏平台" }
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🕹️ 游戏平台" },
|
||||
{ "rule_set": [ "netflixip" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" }
|
||||
],
|
||||
"rule_set": [
|
||||
{
|
||||
@@ -99,14 +104,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/games-cn.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "media",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/media.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/media.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "games",
|
||||
"type": "remote",
|
||||
@@ -115,6 +112,30 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/games.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "netflix",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/netflix.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/netflix.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "youtube",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/youtube.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/youtube.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "media",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/media.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/media.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "ai",
|
||||
"type": "remote",
|
||||
@@ -148,11 +169,11 @@
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "privateip",
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/privateip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/privateip.srs",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
@@ -163,14 +184,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "mediaip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/mediaip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/mediaip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "gamesip",
|
||||
"type": "remote",
|
||||
@@ -180,11 +193,19 @@
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "telegramip",
|
||||
"tag": "netflixip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"path": "./ruleset/netflixip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/netflixip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "mediaip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/mediaip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/mediaip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
}
|
||||
],
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
{ "rule_set": [ "tld-proxy" ], "outbound": "🧱 代理域名" },
|
||||
{ "rule_set": [ "proxy" ], "outbound": "🧱 代理域名" },
|
||||
{ "rule_set": [ "cn" ], "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "privateip" ], "outbound": "🎯 本地直连" },
|
||||
{ "ip_is_private": true, "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "telegramip" ], "outbound": "📲 电报消息" },
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
@@ -63,11 +63,11 @@
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "privateip",
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/privateip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/privateip.srs",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
@@ -77,14 +77,6 @@
|
||||
"path": "./ruleset/cnip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
}
|
||||
],
|
||||
"final": "🐟 漏网之鱼"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"outbounds": [
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": [ "♻️ 自动选择", "👉 手动选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", "🎯 本地直连", {providers_tags} ] },
|
||||
{ "tag": "📈 网络测试", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点" ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🎮 游戏服务", "type": "selector", "outbounds": [ "🎯 本地直连", "👑 高级节点", "🚀 节点选择" ] },
|
||||
{ "tag": "🪟 微软服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
@@ -41,21 +41,13 @@
|
||||
{ "rule_set": [ "networktest" ], "outbound": "📈 网络测试" },
|
||||
{ "rule_set": [ "proxy" ], "outbound": "🧱 代理域名" },
|
||||
{ "rule_set": [ "cn" ], "outbound": "🛡️ 直连域名" },
|
||||
{ "rule_set": [ "privateip" ], "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": "🀄️ 直连 IP" }
|
||||
],
|
||||
"rule_set": [
|
||||
{
|
||||
"tag": "private",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/private.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "ads",
|
||||
"type": "remote",
|
||||
@@ -64,6 +56,14 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/ads.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "private",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/private.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/private.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "trackerslist",
|
||||
"type": "remote",
|
||||
@@ -137,11 +137,11 @@
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "privateip",
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/privateip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/privateip.srs",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
@@ -151,14 +151,6 @@
|
||||
"path": "./ruleset/cnip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
}
|
||||
],
|
||||
"final": "🐟 漏网之鱼"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"outbounds": [
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": [ "♻️ 自动选择", "👉 手动选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", "🎯 本地直连", {providers_tags} ] },
|
||||
{ "tag": "📈 网络测试", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "👑 高级节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点" ] },
|
||||
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": [ "🚀 节点选择", "👑 高级节点", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇯🇵 日本节点", "🇸🇬 新加坡节点", "🇺🇸 美国节点", "📉 省流节点", {providers_tags} ] },
|
||||
{ "tag": "📋 Trackerslist", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
{ "tag": "🎮 游戏服务", "type": "selector", "outbounds": [ "🎯 本地直连", "👑 高级节点", "🚀 节点选择" ] },
|
||||
{ "tag": "🪟 微软服务", "type": "selector", "outbounds": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
@@ -38,7 +38,7 @@
|
||||
{ "rule_set": [ "networktest" ], "outbound": "📈 网络测试" },
|
||||
{ "rule_set": [ "proxy" ], "outbound": "🧱 代理域名" },
|
||||
{ "rule_set": [ "cn" ], "outbound": "🛡️ 直连域名" },
|
||||
{ "rule_set": [ "privateip" ], "outbound": "🎯 本地直连" },
|
||||
{ "ip_is_private": true, "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "telegramip" ], "outbound": "📲 电报消息" },
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
@@ -127,11 +127,11 @@
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "privateip",
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/privateip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/privateip.srs",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
@@ -141,14 +141,6 @@
|
||||
"path": "./ruleset/cnip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "telegramip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/telegramip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
}
|
||||
],
|
||||
"final": "🐟 漏网之鱼"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//ShellCrash-ruleset 全分组规则+去广告 For Sing-box By Maozai 260107
|
||||
//ShellCrash-ruleset 全分组规则+去广告 For Sing-box By Maozai 260111
|
||||
{
|
||||
"outbounds": [
|
||||
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": ["♻️ 自动选择", "✨ 自动选择(去高倍率)", "🛠️ 手动切换", "🎯 本地直连", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
@@ -28,19 +28,18 @@
|
||||
{ "tag": "🀄️ 国内流量", "type": "selector", "outbounds": ["🎯 本地直连", "🚀 节点选择", "♻️ 自动选择", "🛠️ 手动切换", {providers_tags}] },
|
||||
|
||||
{ "tag": "🐟 漏网之鱼", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
|
||||
|
||||
{ "tag": "🛑 广告拦截", "type": "selector", "outbounds": ["⛔ 禁止连接","🔀 规则放行", "🎯 本地直连"] },
|
||||
|
||||
{ "tag": "🛑 广告拦截", "type": "selector", "outbounds": ["⛔ 禁止连接", "🔀 规则放行", "🎯 本地直连"] },
|
||||
{ "tag": "⛔ 禁止连接", "type": "block" },
|
||||
{ "tag": "🔀 规则放行", "type": "pass" },
|
||||
{ "tag": "🎯 本地直连", "type": "direct" },
|
||||
{ "tag": "GLOBAL", "type": "selector", "outbounds": [ "🚀 节点选择", "🎯 本地直连" ] },
|
||||
{ "tag": "GLOBAL", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连"] },
|
||||
|
||||
{ "tag": "🇭🇰 香港节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇭🇰|港|hk|hongkong|hong kong)" },
|
||||
{ "tag": "🇹🇼 台湾节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇹🇼|台|tw|taiwan|tai wan)" },
|
||||
{ "tag": "🇺🇸 美国节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇺🇸|美|洛杉矶|圣何塞|西雅图|纽约|波特兰|旧金山|us|unitedstates|united states)" },
|
||||
{ "tag": "🇯🇵 日本节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇯🇵|日|东京|大阪|埼玉|九州|jp|japan)" },
|
||||
{ "tag": "🇪🇺 欧洲节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇪🇺|欧|德|英|法|荷|俄罗斯|西班牙|意大利|瑞士|瑞典|土耳其|挪威|芬兰|丹麦|比利时|爱尔兰|奥地利|波兰|葡萄牙|乌克兰|希腊|捷克|匈牙利|罗马尼亚|保加利亚|冰岛|克罗地亚)" },
|
||||
{ "tag": "🇹🇼 台湾节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇹🇼|台|tw|taiwan|tai wan)", "exclude": "(?i)(仙台)" },
|
||||
{ "tag": "🇺🇸 美国节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇺🇸|美|洛杉矶|圣何塞|西雅图|纽约|波特兰|旧金山|休斯|达拉斯|硅谷|堪萨斯|迈阿密|凤凰城|芝加哥|奥勒姆|us|unitedstates|united states)", "exclude": "(?i)(南美|中美|拉美|亚美尼亚|美属)" },
|
||||
{ "tag": "🇯🇵 日本节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇯🇵|日|东京|大阪|埼玉|九州|jp|japan)", "exclude": "(?i)(尼日利亚|尼日尔|日内瓦)" },
|
||||
{ "tag": "🇪🇺 欧洲节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇪🇺|欧|德|英|法|荷|俄罗斯|西班牙|意大利|瑞士|瑞典|土耳其|挪威|芬兰|丹麦|比利时|爱尔兰|奥地利|波兰|葡萄牙|乌克兰|希腊|捷克|匈牙利|罗马尼亚|保加利亚|冰岛|克罗地亚|阿姆斯特丹)" },
|
||||
{ "tag": "🇰🇷 韩国节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇰🇷|韩|韓|首尔|kr|kor)" },
|
||||
{ "tag": "🇸🇬 狮城节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(🇸🇬|新加坡|狮城|sg|singapore)" },
|
||||
|
||||
@@ -49,9 +48,9 @@
|
||||
],
|
||||
"route": {
|
||||
"rules": [
|
||||
{ "domain_suffix": ["captive.apple.com"], "outbound": "DIRECT" },
|
||||
{ "domain_suffix": ["kamo.teracloud.jp"], "outbound": "DIRECT" },
|
||||
|
||||
{ "domain_suffix": ["captive.apple.com"], "outbound": "🍎 苹果服务" },
|
||||
{ "domain_suffix": ["kamo.teracloud.jp"], "outbound": "🀄️ 国内流量" },
|
||||
|
||||
{ "rule_set": ["private"], "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": ["ads"], "outbound": "🛑 广告拦截" },
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
],
|
||||
"route": {
|
||||
"rules": [
|
||||
{ "rule_set": [ "privateip" ], "outbound": "🎯 本地直连" },
|
||||
{ "ip_is_private": true, "outbound": "🎯 本地直连" },
|
||||
{ "rule_set": [ "cn" ], "outbound": "🎯 本地直连" },
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
@@ -21,14 +21,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cn.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "privateip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/privateip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/privateip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "cnip",
|
||||
"type": "remote",
|
||||
|
||||
@@ -81,11 +81,8 @@ done
|
||||
setconfig versionsh_l $version
|
||||
#生成用于执行启动服务的变量文件
|
||||
[ ! -f "$CRASHDIR"/configs/command.env ] && {
|
||||
TMPDIR='/tmp/ShellCrash'
|
||||
BINDIR="$CRASHDIR"
|
||||
touch "$CRASHDIR"/configs/command.env
|
||||
setconfig TMPDIR "$TMPDIR" "$CRASHDIR"/configs/command.env
|
||||
setconfig BINDIR "$BINDIR" "$CRASHDIR"/configs/command.env
|
||||
echo 'TMPDIR=/tmp/ShellCrash' > "$CRASHDIR"/configs/command.env
|
||||
echo "BINDIR=$CRASHDIR" >> "$CRASHDIR"/configs/command.env
|
||||
}
|
||||
if [ -n "$(grep 'crashcore=singbox' "$CFG_PATH")" ]; then
|
||||
COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"'
|
||||
@@ -100,7 +97,10 @@ grep -q 'firewall_mod' "$CRASHDIR/configs/ShellClash.cfg" 2>/dev/null || {
|
||||
setconfig firewall_mod $firewall_mod
|
||||
}
|
||||
#设置更新地址
|
||||
[ -n "$url" ] && setconfig update_url $url
|
||||
[ -n "$url" ] && setconfig update_url "$url"
|
||||
[ -n "$release_type" ] && setconfig release_type "$release_type"
|
||||
#设置语言
|
||||
[ -n "$language" ] && echo "$language" > "$CRASHDIR/configs/i18n.cfg"
|
||||
#设置环境变量
|
||||
[ -w /opt/etc/profile ] && [ "$systype" = "Padavan" ] && profile=/opt/etc/profile
|
||||
[ -w /jffs/configs/profile.add ] && profile=/jffs/configs/profile.add
|
||||
@@ -130,7 +130,7 @@ 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"
|
||||
setconfig CRASHDIR "$CRASHDIR" "$CRASHDIR"/starts/snapshot_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
|
||||
@@ -213,7 +213,7 @@ sed -i '/shellclash/d' /etc/group
|
||||
rm -rf /etc/init.d/clash
|
||||
rm -rf "$CRASHDIR"/rules
|
||||
[ "$systype" = "mi_snapshot" -a "$CRASHDIR" != '/data/clash' ] && rm -rf /data/clash
|
||||
for file in webget.sh misnap_init.sh core.new; do
|
||||
for file in webget.sh misnap_init.sh core.new configs/ShellCrash.cfg.bak; do
|
||||
rm -f "$CRASHDIR/$file"
|
||||
done
|
||||
#旧版变量改名
|
||||
@@ -222,12 +222,13 @@ sed -i "s/clash_v/core_v/g" "$CFG_PATH"
|
||||
sed -i "s/clash.meta/meta/g" "$CFG_PATH"
|
||||
sed -i "s/ShellClash/ShellCrash/g" "$CFG_PATH"
|
||||
sed -i "s/cpucore=armv8/cpucore=arm64/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=Nft基础/redir_mod=Redir模式/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=Nft混合/redir_mod=Tproxy模式/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=Tproxy混合/redir_mod=Tproxy模式/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=Redir模式/redir_mod=Redir/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=Tproxy模式/redir_mod=Tproxy/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=Tun模式/redir_mod=Tun/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=混合模式/redir_mod=Mix/g" "$CFG_PATH"
|
||||
sed -i "s/redir_mod=纯净模式/firewall_area=4/g" "$CFG_PATH"
|
||||
#变量统一使用ON/OFF
|
||||
sed -i 's/=\(已启用\|已开启\)$/=ON/' "$CFG_PATH"
|
||||
sed -i 's/=\(未启用\|未开启\)$/=OFF/' "$CFG_PATH"
|
||||
|
||||
echo -e "\033[32m脚本初始化完成,请输入\033[30;47m $my_alias \033[0;33m命令开始使用!\033[0m"
|
||||
printf '\033[32m脚本初始化完成,请输入\033[30;47m %s \033[0;33m命令开始使用!\033[0m\n' "$my_alias"
|
||||
|
||||
10
scripts/lang/chs/1_start.lang
Normal file
10
scripts/lang/chs/1_start.lang
Normal file
@@ -0,0 +1,10 @@
|
||||
# ===== 启动完成 =====
|
||||
START_SERVICE_OK="服务已启动!"
|
||||
START_WEB_HINT="管理面板:"
|
||||
START_PAC_HINT="其他设备可使用 PAC 配置:"
|
||||
START_PROXY_HINT="或使用 HTTP / SOCKS5 方式连接:"
|
||||
|
||||
# ===== 启动流程 =====
|
||||
START_NO_CORE_CFG_TRY_GEN="没有找到核心配置文件,尝试生成 providers 配置文件!"
|
||||
START_NO_CORE_CFG_IMPORT_FIRST="没有找到核心配置文件,请先导入配置文件!"
|
||||
START_FIREWALL_DONE="已完成防火墙设置!"
|
||||
133
scripts/lang/chs/2_settings.lang
Normal file
133
scripts/lang/chs/2_settings.lang
Normal file
@@ -0,0 +1,133 @@
|
||||
# =================================================
|
||||
# Settings main menu
|
||||
# =================================================
|
||||
SET_MENU_TITLE="功能设置菜单"
|
||||
SET_MENU_REDIR="路由模式设置:"
|
||||
SET_MENU_DNS="DNS设置: "
|
||||
SET_MENU_FW_FILTER="透明路由流量过滤"
|
||||
SET_MENU_SKIP_CERT="跳过证书验证:"
|
||||
SET_MENU_SNIFFER="启用域名嗅探:"
|
||||
SET_MENU_ADV_PORT="自定义端口及密钥"
|
||||
SET_MENU_IPV6="IPv6设置: "
|
||||
SET_MENU_RESET="重置/备份/还原脚本设置"
|
||||
SET_MENU_LANG="多语言切换"
|
||||
SET_MENU_UI="UI切换"
|
||||
|
||||
# =================================================
|
||||
# Main menu messages
|
||||
# =================================================
|
||||
SET_WARN_NONROOT="非root用户可能无法正确配置其他模式,是否继续?"
|
||||
SET_SKIP_CERT_ON="已启用跳过本地证书验证!"
|
||||
SET_SKIP_CERT_OFF="已禁用跳过本地证书验证!"
|
||||
|
||||
SET_SNIFFER_CORE_SWITCH="已自动切换至Meta内核(域名嗅探需要)"
|
||||
SET_SNIFFER_LOCKED="当前内核与DNS模式组合下,域名嗅探无法关闭!"
|
||||
|
||||
SET_CORE_RUNNING="检测到服务正在运行,需要先停止服务!"
|
||||
SET_CORE_STOP_CONFIRM="是否确认停止服务?"
|
||||
|
||||
# =================================================
|
||||
# Backup / Restore / Reset
|
||||
# =================================================
|
||||
SET_BACKUP="备份脚本设置"
|
||||
SET_RESTORE="还原脚本设置"
|
||||
SET_RESET="重置脚本设置"
|
||||
|
||||
SET_BACKUP_OK="备份脚本设置成功!"
|
||||
SET_BACKUP_FAIL="备份脚本设置失败!"
|
||||
SET_RESTORE_OK="脚本设置已还原!(被覆盖配置已备份)"
|
||||
SET_RESET_OK="重置脚本设置成功!(旧配置已备份)"
|
||||
SET_RESET_FAIL="重置脚本设置失败!"
|
||||
SET_BACKUP_MISS="未找到备份文件,请先备份!"
|
||||
SET_NEED_RESTART="请重新启动脚本以生效!"
|
||||
|
||||
# =================================================
|
||||
# Redir mode
|
||||
# =================================================
|
||||
SET_REDIR_DEFAULT="Redir模式"
|
||||
SET_REDIR_CURRENT="当前路由模式为:"
|
||||
SET_CORE_CURRENT="ShellCrash 核心为:"
|
||||
SET_REDIR_RESTART_HINT="注意:切换模式后需要手动重启服务以生效!"
|
||||
|
||||
SET_REDIR_APPLIED="已设为"
|
||||
|
||||
SET_REDIR_REDIR="Redir模式"
|
||||
SET_REDIR_MIX="Mix模式"
|
||||
SET_REDIR_TPROXY="Tproxy模式"
|
||||
SET_REDIR_TUN="Tun模式"
|
||||
|
||||
SET_REDIR_REDIRDES="Redir转发TCP,不转发UDP"
|
||||
SET_REDIR_MIXDES="Redir转发TCP,Tun转发UDP"
|
||||
SET_REDIR_TPROXYDES="Tproxy转发TCP&UDP"
|
||||
SET_REDIR_TUNDES="Tun转发TCP&UDP(占用高不推荐)"
|
||||
|
||||
SET_NO_MOD="设备未检测到内核模块:"
|
||||
SET_NO_MOD2="请尝试其他模式或者安装相关依赖!"
|
||||
XIAOMI_QOS="小米设备的 QoS 服务与当前模式冲突,是否禁用相关功能?"
|
||||
|
||||
# =================================================
|
||||
# Firewall / VM
|
||||
# =================================================
|
||||
SET_FW_AREA="设置路由劫持范围"
|
||||
SET_VM_REDIR="容器/虚拟机劫持"
|
||||
SET_FW_SWITCH="切换防火墙应用"
|
||||
|
||||
SET_FW_AREA_DESC="仅局域网|仅本机|局域网+本机|纯净模式|旁路转发"
|
||||
|
||||
FW_AREA_NOTE_1="如你使用了第三方DNS如smartdns等,"
|
||||
FW_AREA_NOTE_2="请勿启用本机劫持或使用shellcrash用户执行!"
|
||||
FW_AREA_LAN="仅劫持局域网流量"
|
||||
FW_AREA_LOCAL="仅劫持本机流量"
|
||||
FW_AREA_BOTH="劫持局域网 + 本机流量"
|
||||
FW_AREA_NONE="不配置流量劫持(纯净模式)"
|
||||
FW_NO_NFTABLES="当前设备未安装 nftables,或 nftables 版本过低(< 1.0.2),无法切换!"
|
||||
FW_NO_IPTABLES="当前设备未安装 iptables,无法切换!"
|
||||
FW_NO_FIREWALL_BACKEND="检测不到可用的防火墙应用(iptables / nftables),无法切换!"
|
||||
|
||||
VM_DETECT_DESC="默认的容器/虚拟机网段为:"
|
||||
VM_ENABLE_AUTO="启用劫持并使用自动检测的网段"
|
||||
VM_ENABLE_MANUAL="启用劫持并手动指定网段"
|
||||
VM_DISABLE="禁用劫持"
|
||||
VM_INPUT_INFO="多个网段请用空格连接,可使用【ip route】命令查看,例如:"
|
||||
VM_INPUT_NET="请输入自定义网段"
|
||||
VM_NO_NET_DETECTED="未检测到容器或虚拟机网段,请先运行容器后再运行脚本,或选择手动设置网段!"
|
||||
VM_INPUT_DESC_1="多个网段请使用空格分隔,可通过【ip route】命令查看"
|
||||
VM_INPUT_DESC_2="例如:"
|
||||
|
||||
#inputport
|
||||
INPUT_PORT="请输入端口号"
|
||||
# =================================================
|
||||
# Advanced config
|
||||
# =================================================
|
||||
ADV_HTTP_PORT="修改HTTP/SOCKS5端口"
|
||||
ADV_HTTP_AUTH="设置HTTP/SOCKS5认证"
|
||||
ADV_REDIR_PORT="修改Redir/Tproxy端口"
|
||||
ADV_DNS_PORT="修改DNS监听端口"
|
||||
ADV_PANEL_PORT="修改面板访问端口"
|
||||
ADV_PANEL_PASS="设置面板访问密码"
|
||||
ADV_PANEL_PASS_INPUT="请输入面板访问密码(输入0删除)"
|
||||
ADV_HOST="自定义本机 Host 地址"
|
||||
ADV_TABLE="自定义路由表"
|
||||
# Advanced auth
|
||||
ADV_AUTH_FORMAT_DESC="格式必须为 \033[32m用户名:密码\033[0m,请使用英文冒号分隔!"
|
||||
ADV_AUTH_WARN="请尽量不要使用特殊符号,以避免产生未知错误!"
|
||||
ADV_AUTH_REMOVE_HINT="输入 0 可删除认证信息"
|
||||
ADV_AUTH_INPUT="请输入 HTTP / SOCKS5 用户名及密码"
|
||||
ADV_AUTH_REMOVED="认证信息已移除!"
|
||||
ADV_AUTH_ENV_CONFLICT="请先禁用本机劫持功能或使用增强模式!"
|
||||
ADV_AUTH_INVALID="输入格式错误,请重新输入!"
|
||||
# Host
|
||||
ADV_HOST_WARN_LAN="如果你的局域网网段不是 192.168.x / 172.16.x / 10.x,请务必修改!"
|
||||
ADV_HOST_WARN_CHANGE="设置后如本机 Host 地址发生变化,请务必重新修改!"
|
||||
ADV_HOST_INPUT="请输入自定义 Host 地址(输入 0 移除)"
|
||||
ADV_HOST_REMOVED="自定义 Host 地址已移除,请重新运行脚本以自动获取!"
|
||||
ADV_HOST_INVALID="输入错误,请仔细核对!"
|
||||
# Routing table
|
||||
ADV_TABLE_WARN="仅当 Tproxy/Tun/混合模式 下路由表发生冲突时才需要设置!"
|
||||
ADV_TABLE_INPUT="请输入路由表编号(不清楚请勿修改,建议 102-125)"
|
||||
|
||||
# =================================================
|
||||
# IPv6
|
||||
# =================================================
|
||||
IPV6_REDIR="IPv6透明路由(劫持IPv6流量)"
|
||||
IPV6_DNS="IPv6-DNS解析(是否返回IPv6地址)"
|
||||
6
scripts/lang/chs/5_task.lang
Normal file
6
scripts/lang/chs/5_task.lang
Normal file
@@ -0,0 +1,6 @@
|
||||
# 推荐任务配置
|
||||
TASK_RECOM_TITLE="是否启用以下推荐的自动任务配置:"
|
||||
|
||||
TASK_RECOM_ITEM_1="运行时每10分钟自动保存面板配置"
|
||||
TASK_RECOM_ITEM_2="服务启动后自动同步 NTP 时间"
|
||||
TASK_RECOM_ITEM_3="在每日的3点0分重启服务"
|
||||
13
scripts/lang/chs/common.lang
Normal file
13
scripts/lang/chs/common.lang
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
COMMON_INPUT="请输入对应数字"
|
||||
COMMON_INPUT_L="请输入对应字母或数字"
|
||||
COMMON_INPUT_R="是否启用?(1/0) > "
|
||||
COMMON_BACK="返回上级菜单"
|
||||
COMMON_SUCCESS="操作成功!"
|
||||
COMMON_FAILED="操作失败!"
|
||||
COMMON_UNSET="未设置"
|
||||
COMMON_MOD="模式"
|
||||
COMMON_ERR_NUM="请输入正确的数字!"
|
||||
COMMON_ERR_LETTER="请输入正确的字母或数字!"
|
||||
COMMON_ERR_INPUT="输入错误,请重新输入!"
|
||||
COMMON_ERR_CANCEL="操作已取消!"
|
||||
52
scripts/lang/chs/dns.lang
Normal file
52
scripts/lang/chs/dns.lang
Normal file
@@ -0,0 +1,52 @@
|
||||
#=====DNS主菜单=====
|
||||
DNS_CURRENT_MODE="当前DNS运行模式为:"
|
||||
DNS_RESTART_NOTICE="切换模式后需要手动重启服务以生效!"
|
||||
|
||||
DNS_MODE_MIX_DESC="CN域名DIRECT-DNS,其它fake-ip"
|
||||
DNS_MODE_ROUTE_DESC="CN域名DIRECT-DNS,其它PROXY-DNS"
|
||||
DNS_MODE_REDIR_DESC="建议搭配加密/第三方DNS服务使用"
|
||||
|
||||
DNS_MENU_PROTECT="DNS防泄漏"
|
||||
DNS_MENU_HOSTS="Hosts优化"
|
||||
DNS_MENU_ECS="ECS优化"
|
||||
DNS_MENU_REDIR="DNS劫持端口"
|
||||
|
||||
DNS_PROTECT_DESC="——启用时少量网站可能出现连接卡顿"
|
||||
DNS_HOSTS_DESC="——调用本机hosts并劫持NTP服务"
|
||||
DNS_ECS_DESC="——解决CDN下载浪费流量等问题"
|
||||
DNS_REDIR_PORT_DESC="——用于兼容第三方DNS服务"
|
||||
|
||||
DNS_FAKEIP_MENU="管理Fake-IP过滤列表"
|
||||
DNS_ADV_MENU="修改DNS服务器"
|
||||
|
||||
DNS_SET_OK="DNS模式已设置为"
|
||||
DNS_CORE_UNSUPPORTED="当前内核不支持该功能!"
|
||||
|
||||
#=====DNS重定向=====
|
||||
DNS_REDIR_WARN="仅限搭配第三方DNS服务(AdGuard、SmartDNS等)使用!"
|
||||
DNS_REDIR_HINT="建议第三方DNS上游指向"
|
||||
DNS_REDIR_NO_SERVICE="该端口未检测到正在运行的DNS服务!"
|
||||
|
||||
#=====Fake-IP=====
|
||||
DNS_FAKEIP_DESC="用于解决Fake-IP模式下部分地址或应用无法连接的问题"
|
||||
DNS_FAKEIP_TIP="脚本已内置大量地址,只需添加出现问题的地址"
|
||||
DNS_FAKEIP_EXAMPLE="示例格式如下:\na.b.com\n*.b.com\n*.*.b.com"
|
||||
DNS_FAKEIP_EXIST="已添加的Fake-IP过滤地址:"
|
||||
DNS_FAKEIP_EMPTY="当前尚未添加任何自定义Fake-IP过滤地址"
|
||||
DNS_FAKEIP_EDIT="输入序号移除,输入地址添加"
|
||||
|
||||
#=====DNS高级=====
|
||||
DNS_ADV_SPLIT="多个DNS地址请使用“|”或“,”分隔输入"
|
||||
DNS_ADV_CERT="使用DoH/DoT需具备本地根证书文件"
|
||||
DNS_ADV_SINGBOX_LIMIT="注意:SingBox内核仅加载第一个DNS"
|
||||
|
||||
DNS_ADV_EDIT_DIRECT="修改DIRECT-DNS"
|
||||
DNS_ADV_EDIT_PROXY="修改PROXY-DNS(该DNS查询会经过节点)"
|
||||
DNS_ADV_EDIT_DEFAULT="修改DEFAULT-DNS(必须是IP,用于解析其他DNS)"
|
||||
DNS_ADV_AUTO_ENCRYPT="一键配置加密DNS"
|
||||
DNS_ADV_RESET="重置默认DNS配置"
|
||||
|
||||
DNS_IPV6_NOT_SUPPORT="该选项暂不支持IPv6加密DNS!"
|
||||
|
||||
DNS_ENCRYPT_OK="已设置加密DNS,如遇DNS解析问题,请重置DNS配置!"
|
||||
DNS_CORE_REQUIRE="请使用Mihomo或SingBox内核"
|
||||
83
scripts/lang/chs/menu.lang
Normal file
83
scripts/lang/chs/menu.lang
Normal file
@@ -0,0 +1,83 @@
|
||||
# ===== 通用提示 =====
|
||||
|
||||
MENU_RESTART_NOTICE="检测到配置变更,是否立即重启服务以应用新配置?"
|
||||
|
||||
MENU_PORT_CONFLICT_TITLE="检测到端口被以下进程占用!内核可能无法正常启动!"
|
||||
MENU_PORT_CONFLICT_HINT="请修改默认端口配置!"
|
||||
|
||||
MENU_CORE_LOADED_OK="内核加载完成!"
|
||||
MENU_CORE_LOADED_BAD="检测到不可用的内核文件!可能是文件受损或CPU架构不匹配!"
|
||||
MENU_CORE_REMOVED="内核文件已移除,请认真检查后重新上传!"
|
||||
|
||||
MENU_CFG_LOADED_OK="配置文件加载完成!"
|
||||
|
||||
MENU_OVERRIDE_WARN="你已经禁用了配置文件覆写功能,这会导致大量脚本功能无法使用!"
|
||||
MENU_OVERRIDE_ASK="是否取消禁用?"
|
||||
|
||||
# ===== 欢迎与状态 =====
|
||||
MENU_WELCOME="欢迎使用ShellCrash!"
|
||||
|
||||
MENU_RUN_ON="正在运行"
|
||||
MENU_RUN_SET="已设置"
|
||||
MENU_RUN_OFF="没有运行"
|
||||
|
||||
MENU_PURE_MOD="纯净"
|
||||
MENU_MOD="模式"
|
||||
MENU_IP_DF="设备IP地址"
|
||||
|
||||
MENU_AUTOSTART_ON="已设置开机启动!"
|
||||
MENU_AUTOSTART_OFF="未设置开机启动!"
|
||||
MENU_AUTOSTART_DEBUG="并处于debug状态!"
|
||||
|
||||
MENU_MEM_USED="当前内存占用:"
|
||||
MENU_RUNNING_TIME="已运行:"
|
||||
|
||||
MENU_TG_CHANNEL="TG频道:"
|
||||
|
||||
# ===== /tmp 文件检测 =====
|
||||
MENU_TMP_CORE_FOUND="发现可用的内核文件:"
|
||||
MENU_TMP_CORE_ASK="是否立即加载该内核(会停止当前服务)?"
|
||||
|
||||
MENU_TMP_CFG_FOUND="发现内核配置文件:"
|
||||
MENU_TMP_CFG_ASK="是否立即加载为配置文件?"
|
||||
|
||||
MENU_MAIN_1="启动/重启服务"
|
||||
MENU_MAIN_2="功能设置"
|
||||
MENU_MAIN_3="停止服务"
|
||||
MENU_MAIN_4="启动设置"
|
||||
MENU_MAIN_5="自动任务"
|
||||
MENU_MAIN_6="配置文件管理"
|
||||
MENU_MAIN_7="访问与控制"
|
||||
MENU_MAIN_8="工具与优化"
|
||||
MENU_MAIN_9="更新与支持"
|
||||
MENU_MAIN_0="退出脚本"
|
||||
|
||||
MENU_MAIN_PROMPT="请输入对应数字> "
|
||||
|
||||
# ===== 服务操作 =====
|
||||
MENU_SERVICE_STOPPED="服务已停止!"
|
||||
|
||||
# ===== 测试 / 调试 =====
|
||||
MENU_TEST_RUNNING_1="正在测试运行!"
|
||||
MENU_TEST_RUNNING_2="如发现错误请截图后前往咨询:"
|
||||
MENU_TEST_DONE_OK="测试完成!没有发现问题,请重新启动服务~"
|
||||
MENU_TEST_DONE_FAIL="测试完成!"
|
||||
MENU_TEST_LOG_HINT="完整执行记录请查看:"
|
||||
|
||||
MENU_ERROR_FOUND="发现错误:"
|
||||
|
||||
# ===== 命令行帮助 =====
|
||||
|
||||
MENU_CLI_TEST="测试模式"
|
||||
MENU_CLI_HELP="帮助列表"
|
||||
MENU_CLI_UNINSTALL="卸载脚本"
|
||||
MENU_CLI_INIT="初始化脚本"
|
||||
MENU_CLI_DEBUG="测试运行"
|
||||
|
||||
MENU_CLI_START="启动服务"
|
||||
MENU_CLI_STOP="停止服务"
|
||||
MENU_CLI_BOOT_INIT="开机初始化"
|
||||
|
||||
MENU_HELP_ONLINE="在线求助:"
|
||||
MENU_HELP_BLOG="官方博客:"
|
||||
MENU_HELP_GITHUB="发布页面:"
|
||||
14
scripts/lang/chs/userguide.lang
Normal file
14
scripts/lang/chs/userguide.lang
Normal file
@@ -0,0 +1,14 @@
|
||||
# 新手引导
|
||||
UG_WELCOME="欢迎使用新手引导!"
|
||||
UG_CHOOSE_ENV="请先选择你的使用环境:"
|
||||
UG_TIP_CONFIG="(你之后依然可以在设置中更改各种配置)"
|
||||
UG_OPTION_1="路由设备配置局域网透明代理"
|
||||
UG_OPTION_2="Linux设备仅配置本机代理"
|
||||
UG_OPTION_3="还原之前备份的设置"
|
||||
UG_RESTORE_OK="脚本设置已还原!请重新启动脚本!"
|
||||
UG_IP_FORWARD_WARN="检测到你的设备尚未开启ip转发,局域网设备将无法正常连接网络,是否立即开启?"
|
||||
UG_ENABLE_LOW_MEM="检测到你的安装目录空间不足10M,是否开启小闪存模式?"
|
||||
UG_IMPORT_CONFIG="这是运行前的最后一步"
|
||||
UG_CONFIG_TIP="你必须拥有一份配置文件才能运行服务!"
|
||||
UG_CONFIG_RES="是否立即导入配置文件?"
|
||||
UG_FINAL_TIP="很好!现在只需要执行启动就可以愉快的使用了!"
|
||||
10
scripts/lang/en/1_start.lang
Normal file
10
scripts/lang/en/1_start.lang
Normal file
@@ -0,0 +1,10 @@
|
||||
# ===== Startup =====
|
||||
START_SERVICE_OK="Service started successfully!"
|
||||
START_WEB_HINT="Dashboard:"
|
||||
START_PAC_HINT="Other devices can connect using PAC configuration:"
|
||||
START_PROXY_HINT="Or connect using HTTP / SOCKS5:"
|
||||
|
||||
# ===== Startup Flow =====
|
||||
START_NO_CORE_CFG_TRY_GEN="Core configuration not found. Attempting to generate providers configuration!"
|
||||
START_NO_CORE_CFG_IMPORT_FIRST="Core configuration not found. Please import a configuration first!"
|
||||
START_FIREWALL_DONE="Firewall configuration completed!"
|
||||
128
scripts/lang/en/2_settings.lang
Normal file
128
scripts/lang/en/2_settings.lang
Normal file
@@ -0,0 +1,128 @@
|
||||
# =================================================
|
||||
# Settings main menu
|
||||
# =================================================
|
||||
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_SKIP_CERT="Skip Cert Verify:"
|
||||
SET_MENU_SNIFFER="Enable Sniff:"
|
||||
SET_MENU_ADV_PORT="Custom Ports and Secrets"
|
||||
SET_MENU_IPV6="IPv6 Settings:"
|
||||
SET_MENU_RESET="Reset / Backup / Restore Script Settings"
|
||||
SET_MENU_LANG="Language"
|
||||
SET_MENU_UI="UI Switch"
|
||||
|
||||
# =================================================
|
||||
# Main menu messages
|
||||
# =================================================
|
||||
SET_WARN_NONROOT="Non-root users may not be able to configure some modes correctly. Continue anyway?"
|
||||
SET_SKIP_CERT_ON="Skipping local certificate verification is now ENABLED!"
|
||||
SET_SKIP_CERT_OFF="Skipping local certificate verification is now DISABLED!"
|
||||
|
||||
SET_SNIFFER_CORE_SWITCH="Automatically switched to Meta core (required for domain sniffing)"
|
||||
SET_SNIFFER_LOCKED="Domain sniffing cannot be disabled with the current core and DNS mode combination!"
|
||||
|
||||
SET_CORE_RUNNING="Service is currently running and must be stopped first!"
|
||||
SET_CORE_STOP_CONFIRM="Do you want to stop the service?"
|
||||
|
||||
# =================================================
|
||||
# Backup / Restore / Reset
|
||||
# =================================================
|
||||
SET_BACKUP="Backup Script Settings"
|
||||
SET_RESTORE="Restore Script Settings"
|
||||
SET_RESET="Reset Script Settings"
|
||||
|
||||
SET_BACKUP_OK="Script settings have been backed up!"
|
||||
SET_RESTORE_OK="Script settings have been restored! (Overwritten config has been backed up)"
|
||||
SET_RESET_OK="Script settings have been reset! (Old config has been backed up)"
|
||||
SET_BACKUP_MISS="Backup file not found. Please back up first!"
|
||||
SET_NEED_RESTART="Please restart the script for changes to take effect!"
|
||||
|
||||
# =================================================
|
||||
# Redir mode
|
||||
# =================================================
|
||||
SET_REDIR_DEFAULT="Redir Mode"
|
||||
SET_REDIR_CURRENT="Current routing mode:"
|
||||
SET_CORE_CURRENT="ShellCrash core:"
|
||||
SET_REDIR_RESTART_HINT="You must manually restart the service for the change to take effect!"
|
||||
|
||||
SET_REDIR_APPLIED="Routing mode set to"
|
||||
|
||||
SET_REDIR_REDIR="Redir Mode"
|
||||
SET_REDIR_MIX="Mix Mode"
|
||||
SET_REDIR_TPROXY="Tproxy Mode"
|
||||
SET_REDIR_TUN="Tun Mode"
|
||||
|
||||
SET_REDIR_REDIRDES="Redirect TCP traffic only (no UDP)"
|
||||
SET_REDIR_MIXDES="Redirect TCP via Redir, UDP via Tun"
|
||||
SET_REDIR_TPROXYDES="Tproxy forwards both TCP UDP"
|
||||
SET_REDIR_TUNDES="Tun forwards both TCP UDP (high resource usage)"
|
||||
|
||||
SET_NO_MOD="The kernel module not detected:"
|
||||
SET_NO_MOD2="Please install required dependencies or select another mode!"
|
||||
XIAOMI_QOS="Xiaomi QoS service conflicts with the current mode. Disable related features?"
|
||||
|
||||
# =================================================
|
||||
# Firewall / VM
|
||||
# =================================================
|
||||
SET_FW_AREA="Set Routing Hijack Scope"
|
||||
SET_VM_REDIR="Container / VM Hijacking"
|
||||
SET_FW_SWITCH="Switch Firewall Backend"
|
||||
|
||||
SET_FW_AREA_DESC="LAN only|Local only|LAN&Local|Pure mode|Bypass:"
|
||||
|
||||
FW_AREA_NOTE="If you are using a third-party DNS like SmartDNS, \ndo not enable local hijacking or run the service as a ShellCrash user"
|
||||
FW_AREA_LAN="Hijack LAN traffic only"
|
||||
FW_AREA_LOCAL="Hijack local device traffic only"
|
||||
FW_AREA_BOTH="Hijack both LAN and local device traffic"
|
||||
FW_AREA_NONE="Do not hijack traffic (Pure mode)"
|
||||
FW_NO_NFTABLES="nftables is not installed, or the version is too old (< 1.0.2). Unable to switch!"
|
||||
FW_NO_IPTABLES="iptables is not installed. Unable to switch!"
|
||||
FW_NO_FIREWALL_BACKEND="No available firewall backend detected (iptables / nftables). Unable to switch!"
|
||||
|
||||
VM_DETECT_DESC="Default Container/VM Subnet:"
|
||||
VM_ENABLE_AUTO="Enable hijacking using automatically detected subnets"
|
||||
VM_ENABLE_MANUAL="Enable hijacking and manually specify subnets"
|
||||
VM_DISABLE="Disable hijacking"
|
||||
VM_INPUT_INFO="Separate multiple segments with spaces. Check your configuration using ip route. Example:"
|
||||
VM_INPUT_NET="Please enter cust subnets"
|
||||
VM_NO_NET_DETECTED="No container or VM subnet detected. Please start the container first, or configure the subnet manually!"
|
||||
VM_INPUT_DESC="Multiple subnets should be separated by spaces. You can check them using the 'ip route' command, for example:"
|
||||
|
||||
#inputport
|
||||
INPUT_PORT="Input port"
|
||||
# =================================================
|
||||
# Advanced config
|
||||
# =================================================
|
||||
ADV_HTTP_PORT="Change HTTP / SOCKS5 Port"
|
||||
ADV_HTTP_AUTH="Set HTTP / SOCKS5 Authentication"
|
||||
ADV_REDIR_PORT="Change Redir / Tproxy Ports"
|
||||
ADV_DNS_PORT="Change DNS Listening Port"
|
||||
ADV_PANEL_PORT="Change Web Panel Port"
|
||||
ADV_PANEL_PASS="Set Web Panel Password"
|
||||
ADV_PANEL_PASS_INPUT="Enter web panel password (enter 0 to remove)"
|
||||
ADV_HOST="Custom Local Host Address"
|
||||
ADV_TABLE="Custom Routing Table"
|
||||
# Advanced auth
|
||||
ADV_AUTH_FORMAT_DESC="Format must be \033[32musername:password\033[0m, separated by a colon!"
|
||||
ADV_AUTH_WARN="Avoid using special characters to prevent unexpected issues!"
|
||||
ADV_AUTH_REMOVE_HINT="Enter 0 to remove authentication"
|
||||
ADV_AUTH_INPUT="Please enter HTTP / SOCKS5 username and password"
|
||||
ADV_AUTH_REMOVED="Authentication information has been removed!"
|
||||
ADV_AUTH_ENV_CONFLICT="Please disable local hijacking or switch to enhanced mode first!"
|
||||
ADV_AUTH_INVALID="Invalid input format. Please try again!"
|
||||
# Host
|
||||
ADV_HOST_WARN_LAN="If your LAN subnet is not 192.168.x / 172.16.x / 10.x, you must modify it!"
|
||||
ADV_HOST_WARN_CHANGE="If the local host address changes after setting, please update it again!"
|
||||
ADV_HOST_INPUT="Please enter a custom host address (enter 0 to remove)"
|
||||
ADV_HOST_REMOVED="Custom host address removed. Please rerun the script to auto-detect!"
|
||||
ADV_HOST_INVALID="Invalid input. Please check carefully!"
|
||||
# Routing table
|
||||
ADV_TABLE_WARN="Only required when routing table conflicts occur in Tproxy, Tun, or Mixed mode!"
|
||||
ADV_TABLE_INPUT="Please enter the routing table ID (do not modify unless necessary, recommended 102-125)"
|
||||
# =================================================
|
||||
# IPv6
|
||||
# =================================================
|
||||
IPV6_REDIR="IPv6 Transparent Routing (Hijack IPv6 Traffic)"
|
||||
IPV6_DNS="IPv6 DNS Resolution (Return IPv6 addresses)"
|
||||
6
scripts/lang/en/5_task.lang
Normal file
6
scripts/lang/en/5_task.lang
Normal file
@@ -0,0 +1,6 @@
|
||||
# Recommended task configuration
|
||||
TASK_RECOM_TITLE="Enable the following recommended automatic tasks?"
|
||||
|
||||
TASK_RECOM_ITEM_1="Save Dashboard select every 10 minutes"
|
||||
TASK_RECOM_ITEM_2="Synchronize NTP after service startup"
|
||||
TASK_RECOM_ITEM_3="Daily service restart at 03:00"
|
||||
13
scripts/lang/en/common.lang
Normal file
13
scripts/lang/en/common.lang
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
COMMON_INPUT="Please enter a number"
|
||||
COMMON_INPUT_L="Enter a letter or a number"
|
||||
COMMON_INPUT_R="Enable? (1/0) > "
|
||||
COMMON_BACK="Back"
|
||||
COMMON_SUCCESS="Setup Success!"
|
||||
COMMON_FAILED="Setup failed!"
|
||||
COMMON_UNSET="Not set"
|
||||
COMMON_MOD="Mod"
|
||||
COMMON_ERR_NUM="Please enter a valid number!"
|
||||
COMMON_ERR_LETTER="Please enter a valid letter or number!"
|
||||
COMMON_ERR_INPUT="Invalid input, please try again!"
|
||||
COMMON_ERR_CANCEL="Operation cancelled!"
|
||||
54
scripts/lang/en/dns.lang
Normal file
54
scripts/lang/en/dns.lang
Normal file
@@ -0,0 +1,54 @@
|
||||
#===== DNS Main Menu =====
|
||||
DNS_CURRENT_MODE="Current DNS running mode:"
|
||||
DNS_RESTART_NOTICE="Changes require a manual service restart to take effect."
|
||||
|
||||
DNS_MODE_MIX_DESC="CN domains use DIRECT-DNS, others use fake-ip"
|
||||
DNS_MODE_ROUTE_DESC="CN domains use DIRECT-DNS, others use PROXY-DNS"
|
||||
DNS_MODE_REDIR_DESC="All domains use DIRECT-DNS"
|
||||
|
||||
DNS_MENU_PROTECT="DNS Leak Protect"
|
||||
DNS_MENU_HOSTS="Hosts Optimization"
|
||||
DNS_MENU_ECS="ECS Optimization"
|
||||
DNS_MENU_REDIR="DNS Redirect Port"
|
||||
|
||||
DNS_PROTECT_DESC="May cause slow connections on some websites when enabled"
|
||||
DNS_HOSTS_DESC="Use local hosts file and hijack NTP service"
|
||||
DNS_ECS_DESC="Reduce wasted traffic caused by CDN misrouting"
|
||||
DNS_REDIR_PORT_DESC="Used for compatibility with third-party DNS services"
|
||||
|
||||
DNS_FAKEIP_MENU="Manage Fake-IP Filter List"
|
||||
DNS_ADV_MENU="Configure DNS Servers"
|
||||
|
||||
DNS_SET_OK="DNS mode has been set to"
|
||||
DNS_CORE_UNSUPPORTED="The current core does not support this feature."
|
||||
|
||||
#===== DNS Redirect =====
|
||||
DNS_REDIR_WARN="For use with third-party DNS services only (AdGuard, SmartDNS, etc.)"
|
||||
DNS_REDIR_HINT="It is recommended to set the upstream DNS of the third-party service to"
|
||||
DNS_REDIR_INPUT="Enter the listening port of the third-party DNS service (0 to reset)>"
|
||||
DNS_REDIR_NO_SERVICE="No running DNS service detected on this port!"
|
||||
|
||||
#===== Fake-IP =====
|
||||
DNS_FAKEIP_DESC="Used to resolve connectivity issues for certain addresses or applications in Fake-IP mode"
|
||||
DNS_FAKEIP_TIP="The script already includes many built-in entries. Only add problematic addresses."
|
||||
DNS_FAKEIP_EXAMPLE="Examples:\na.b.com\n*.b.com\n*.*.b.com"
|
||||
DNS_FAKEIP_EXIST="Existing Fake-IP filter entries:"
|
||||
DNS_FAKEIP_EMPTY="No Fake-IP filter entries have been added"
|
||||
DNS_FAKEIP_EDIT="Enter a number to remove an entry, or enter an address to add one"
|
||||
|
||||
#===== Advanced DNS =====
|
||||
DNS_ADV_SPLIT="Use '|' or ',' to separate multiple DNS addresses"
|
||||
DNS_ADV_CERT="DoH/DoT requires a local root certificate file"
|
||||
DNS_ADV_SINGBOX_LIMIT="Note: SingBox core only loads the first DNS entry"
|
||||
|
||||
DNS_ADV_EDIT_DIRECT="Edit DIRECT-DNS"
|
||||
DNS_ADV_EDIT_PROXY="Edit PROXY-DNS (queries go through the proxy)"
|
||||
DNS_ADV_EDIT_DEFAULT="Edit DEFAULT-DNS (must be an IP, used to resolve other DNS servers)"
|
||||
DNS_ADV_AUTO_ENCRYPT="Auto-configure Encrypted DNS"
|
||||
DNS_ADV_RESET="Reset to default DNS configuration"
|
||||
|
||||
DNS_INPUT_NEW="Enter new DNS address>"
|
||||
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"
|
||||
83
scripts/lang/en/menu.lang
Normal file
83
scripts/lang/en/menu.lang
Normal file
@@ -0,0 +1,83 @@
|
||||
# ===== Common Prompts =====
|
||||
|
||||
MENU_RESTART_NOTICE="Changes have been detected. Please restart the service!"
|
||||
|
||||
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!"
|
||||
|
||||
MENU_CORE_LOADED_OK="Core loaded successfully!"
|
||||
MENU_CORE_LOADED_BAD="The core file is invalid. It may be corrupted or incompatible with the CPU architecture!"
|
||||
MENU_CORE_REMOVED="The core file has been removed. Please verify and upload it again!"
|
||||
|
||||
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?"
|
||||
|
||||
# ===== Welcome & Status =====
|
||||
MENU_WELCOME="Welcome to ShellCrash!"
|
||||
|
||||
MENU_RUN_ON=" Running"
|
||||
MENU_RUN_SET="Configured"
|
||||
MENU_RUN_OFF="Stopped"
|
||||
|
||||
MENU_PURE_MOD="Pure"
|
||||
MENU_MOD=" Mod"
|
||||
MENU_IP_DF="Device IP Address"
|
||||
|
||||
MENU_AUTOSTART_ON="Autostart enable!"
|
||||
MENU_AUTOSTART_OFF="Autostart disable!"
|
||||
MENU_AUTOSTART_DEBUG="Debug mode!"
|
||||
|
||||
MENU_MEM_USED="Memory usage: "
|
||||
MENU_RUNNING_TIME="Running time: "
|
||||
|
||||
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_TMP_CFG_FOUND="Kernel configuration file found:"
|
||||
MENU_TMP_CFG_ASK="Load as the configuration file? (1/0) > "
|
||||
|
||||
# ===== Main Menu =====
|
||||
MENU_MAIN_1="Start / Restart Service"
|
||||
MENU_MAIN_2="Feature Settings"
|
||||
MENU_MAIN_3="Stop Service"
|
||||
MENU_MAIN_4="Startup Settings"
|
||||
MENU_MAIN_5="Scheduled Tasks"
|
||||
MENU_MAIN_6="Configuration Management"
|
||||
MENU_MAIN_7="Access & Control"
|
||||
MENU_MAIN_8="Tools & Optimization"
|
||||
MENU_MAIN_9="Updates & Support"
|
||||
MENU_MAIN_0="Exit Script"
|
||||
|
||||
MENU_MAIN_PROMPT="Please enter a number > "
|
||||
|
||||
# ===== Service Operations =====
|
||||
MENU_SERVICE_STOPPED="Service has been stopped!"
|
||||
|
||||
# ===== Test / Debug =====
|
||||
MENU_TEST_RUNNING="Running test mode. If errors occur, please take a screenshot and seek assistance."
|
||||
MENU_TEST_DONE_OK="Test completed! No issues found. Please restart the service."
|
||||
MENU_TEST_DONE_FAIL="Test completed!"
|
||||
MENU_TEST_LOG_HINT="Full execution log can be found at:"
|
||||
|
||||
MENU_ERROR_FOUND="Error found:"
|
||||
|
||||
# ===== Command Line Help =====
|
||||
|
||||
MENU_CLI_TEST="Test Mode"
|
||||
MENU_CLI_HELP="Help List"
|
||||
MENU_CLI_UNINSTALL="Uninstall Script"
|
||||
MENU_CLI_INIT="Initialize Script"
|
||||
MENU_CLI_DEBUG="Debug Mode"
|
||||
|
||||
MENU_CLI_START="Start Service"
|
||||
MENU_CLI_STOP="Stop Service"
|
||||
MENU_CLI_BOOT_INIT="Boot Initialization"
|
||||
|
||||
MENU_HELP_ONLINE="Online Support:"
|
||||
MENU_HELP_BLOG="Official Blog:"
|
||||
MENU_HELP_GITHUB="Release Page:"
|
||||
14
scripts/lang/en/userguide.lang
Normal file
14
scripts/lang/en/userguide.lang
Normal file
@@ -0,0 +1,14 @@
|
||||
|
||||
UG_WELCOME="Welcome to User Guide!"
|
||||
UG_CHOOSE_ENV="Please select your usage environment:"
|
||||
UG_TIP_CONFIG="(You can still change various settings later)"
|
||||
UG_OPTION_1="Router: LAN transparent proxy"
|
||||
UG_OPTION_2="Linux device: local proxy only"
|
||||
UG_OPTION_3="Restore previous backup settings"
|
||||
UG_RESTORE_OK="Script settings have been restored! Please restart the script!"
|
||||
UG_IP_FORWARD_WARN="Your device has not enabled IP forwarding, LAN devices will not connect properly. Enable now?"
|
||||
UG_ENABLE_LOW_MEM="Your installation directory is less than 10MB, enable low-flash mode?"
|
||||
UG_IMPORT_CONFIG="Import configuration file? (Last step before running)"
|
||||
UG_CONFIG_TIP="You must have a configuration file to run the service!"
|
||||
UG_CONFIG_RES="Importing now? "
|
||||
UG_FINAL_TIP="Great! Now just start the service to enjoy!"
|
||||
@@ -3,6 +3,7 @@ check_autostart(){
|
||||
[ ! -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
|
||||
|
||||
@@ -23,7 +23,9 @@ core_unzip() { #$1:需要解压的文件 $2:目标文件名
|
||||
}
|
||||
core_find(){
|
||||
if [ ! -f "$TMPDIR"/CrashCore ];then
|
||||
core_dir=$(find "$BINDIR"/CrashCore.* $find_para 2>/dev/null)
|
||||
[ -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
|
||||
}
|
||||
@@ -40,16 +42,20 @@ core_check(){
|
||||
COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
|
||||
fi
|
||||
if [ -z "$v" ]; then
|
||||
rm -rf "$TMPDIR"/core_new
|
||||
rm -rf "$1"
|
||||
rm -rf "$1" "$TMPDIR"/core_new
|
||||
return 2
|
||||
else
|
||||
rm -f "$BINDIR"/CrashCore.tar.gz "$BINDIR"/CrashCore.gz "$BINDIR"/CrashCore.upx
|
||||
mv -f "$TMPDIR"/core_new "$TMPDIR"/CrashCore
|
||||
if [ -f "$1" ];then
|
||||
mv -f "$1" "$BINDIR/CrashCore.${zip_type}"
|
||||
if [ -z "$zip_type" ];then
|
||||
gzip -c "$TMPDIR/core_new" > "$BINDIR/CrashCore.gz"
|
||||
else
|
||||
gzip -c "$TMPDIR"/CrashCore > "$BINDIR"/CrashCore.gz
|
||||
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
|
||||
@@ -64,17 +70,20 @@ core_webget(){
|
||||
. "$CRASHDIR"/libs/check_target.sh
|
||||
if [ -z "$custcorelink" ];then
|
||||
[ -z "$zip_type" ] && zip_type='tar.gz'
|
||||
get_bin "$TMPDIR/CrashCore.${zip_type}" "bin/$crashcore/${target}-linux-${cpucore}.${zip_type}"
|
||||
get_bin "$TMPDIR/Coretmp.$zip_type" "bin/$crashcore/${target}-linux-${cpucore}.$zip_type"
|
||||
else
|
||||
zip_type=$(echo "$custcorelink" | grep -oE 'tar.gz$')
|
||||
[ -z "$zip_type" ] && zip_type=$(echo "$custcorelink" | grep -oE 'gz$')
|
||||
[ -n "$zip_type" ] && webget "$TMPDIR/CrashCore.${zip_type}" "$custcorelink"
|
||||
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/CrashCore.${zip_type}"
|
||||
core_check "$TMPDIR/Coretmp.$zip_type"
|
||||
else
|
||||
rm -rf "$TMPDIR/CrashCore.${zip_type}"
|
||||
rm -f "$TMPDIR/Coretmp.$zip_type"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
|
||||
# 检查配置文件
|
||||
[ -f "$CRASHDIR"/configs/ShellCrash.cfg ] || . "$CRASHDIR"/init.sh >/dev/null 2>&1
|
||||
. "$CRASHDIR"/configs/command.env >/dev/null 2>&1
|
||||
. "$CRASHDIR"/configs/ShellCrash.cfg
|
||||
|
||||
@@ -13,10 +16,7 @@ routing_mark=$((fwmark + 2))
|
||||
|
||||
[ -z "$dns_nameserver" ] && {
|
||||
dns_nameserver='223.5.5.5, 1.2.4.8'
|
||||
cat /proc/net/udp | grep -q '0035' && dns_nameserver='localhost'
|
||||
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"
|
||||
cat /proc/net/udp | grep -q '0035' && dns_resolver='127.0.0.1'
|
||||
}
|
||||
[ -z "$dns_resolver" ] && dns_resolver="223.5.5.5, 2400:3200::1"
|
||||
|
||||
8
scripts/libs/i18n.sh
Normal file
8
scripts/libs/i18n.sh
Normal file
@@ -0,0 +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"
|
||||
}
|
||||
@@ -1,14 +1,19 @@
|
||||
|
||||
[ -n "$__IS_LIB_LOGGER" ] && return
|
||||
__IS_LIB_LOGGER=1
|
||||
|
||||
#日志工具
|
||||
. "$CRASHDIR"/libs/web_json.sh
|
||||
#$1日志内容$2显示颜色$3是否推送
|
||||
#$1日志内容$2显示颜色$3是否推送$4是否覆盖上一条
|
||||
logger() {
|
||||
TMPDIR=/tmp/ShellCrash
|
||||
[ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m"
|
||||
[ -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
|
||||
echo "$log_text" >>"$TMPDIR"/ShellCrash.log
|
||||
[ "$(wc -l "$TMPDIR"/ShellCrash.log | awk '{print $1}')" -gt 99 ] && sed -i '1,50d' "$TMPDIR"/ShellCrash.log
|
||||
[ "$(wc -l "$TMPDIR"/ShellCrash.log | awk '{print $1}')" -gt 199 ] && sed -i '1,20d' "$TMPDIR"/ShellCrash.log
|
||||
#推送远程日志
|
||||
[ -z "$3" ] && {
|
||||
[ "$3" != off ] && {
|
||||
[ -n "$device_name" ] && log_text="$log_text($device_name)"
|
||||
[ -n "$push_TG" ] && {
|
||||
url="https://api.telegram.org/bot${push_TG}/sendMessage"
|
||||
@@ -18,7 +23,7 @@ logger() {
|
||||
}
|
||||
[ -n "$push_bark" ] && {
|
||||
url="${push_bark}"
|
||||
content="{\"body\":\"${log_text}\",\"title\":\"ShellCrash日志推送\",\"level\":\"passive\",\"badge\":\"1\"}"
|
||||
content="{\"body\":\"${log_text}\",\"title\":\"ShellCrash_log\",\"level\":\"passive\",\"badge\":\"1\"}"
|
||||
web_json_post "$url" "$content" &
|
||||
}
|
||||
[ -n "$push_Deer" ] && {
|
||||
@@ -28,17 +33,17 @@ logger() {
|
||||
}
|
||||
[ -n "$push_Po" ] && {
|
||||
url="https://api.pushover.net/1/messages.json"
|
||||
content="{\"token\":\"${push_Po}\",\"user\":\"${push_Po_key}\",\"title\":\"ShellCrash日志推送\",\"message\":\"$log_text\"}"
|
||||
content="{\"token\":\"${push_Po}\",\"user\":\"${push_Po_key}\",\"title\":\"ShellCrash_log\",\"message\":\"$log_text\"}"
|
||||
web_json_post "$url" "$content" &
|
||||
}
|
||||
[ -n "$push_PP" ] && {
|
||||
url="http://www.pushplus.plus/send"
|
||||
content="{\"token\":\"${push_PP}\",\"title\":\"ShellCrash日志推送\",\"content\":\"$log_text\"}"
|
||||
content="{\"token\":\"${push_PP}\",\"title\":\"ShellCrash_log\",\"content\":\"$log_text\"}"
|
||||
web_json_post "$url" "$content" &
|
||||
}
|
||||
[ -n "$push_Gotify" ] && {
|
||||
url="${push_Gotify}"
|
||||
content="{\"title\":\"ShellCrash日志推送\",\"message\":\"$log_text\",\"priority\":5}"
|
||||
content="{\"title\":\"ShellCrash_log\",\"message\":\"$log_text\",\"priority\":5}"
|
||||
web_json_post "$url" "$content" &
|
||||
}
|
||||
[ -n "$push_SynoChat" ] && {
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
#参数1代表变量名,参数2代表变量值,参数3即文件路径
|
||||
setconfig() {
|
||||
[ -z "$3" ] && configpath="$CRASHDIR"/configs/ShellCrash.cfg || configpath="${3}"
|
||||
if grep -q "^${1}=" "$configpath"; then
|
||||
sed -i "s#^${1}=.*#${1}=${2}#g" "$configpath"
|
||||
else
|
||||
printf '%s=%s\n' "$1" "$2" >>"$configpath"
|
||||
fi
|
||||
sed -i "/^${1}=.*/d" "$configpath"
|
||||
printf '%s=%s\n' "$1" "$2" >>"$configpath"
|
||||
}
|
||||
@@ -1,27 +1,39 @@
|
||||
|
||||
crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}')"
|
||||
crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}'| tr -d ' ')"
|
||||
[ ! -w "$crondir" ] && crondir="/etc/storage/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron"
|
||||
tmpcron="$TMPDIR"/cron_tmp
|
||||
[ -z "$USER" ] && USER=$(whoami 2>/dev/null)
|
||||
tmpcron=/tmp/cron_tmp
|
||||
touch "$tmpcron"
|
||||
|
||||
croncmd() { #定时任务工具
|
||||
if [ -n "$(crontab -h 2>&1 | grep '\-l')" ]; then
|
||||
cronadd() { #定时任务工具
|
||||
if crontab -h 2>&1 | grep -q '\-l'; then
|
||||
crontab "$1"
|
||||
elif [ -w "$crondir" ] && [ -n "$USER" ];then
|
||||
[ "$1" = "-l" ] && cat "$crondir"/"$USER" 2>/dev/null
|
||||
[ -f "$1" ] && cat "$1" >"$crondir"/"$USER"
|
||||
killall -HUP crond 2>/dev/null
|
||||
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
|
||||
crontab -l
|
||||
elif [ -f "$crondir/$USER" ];then
|
||||
cat "$crondir"/"$USER" 2>/dev/null
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
cronset() { #定时任务设置
|
||||
# 参数1代表要移除的关键字,参数2代表要添加的任务语句
|
||||
croncmd -l >"$tmpcron"
|
||||
sed -i "/$1/d" "$tmpcron"
|
||||
sed -i '/^$/d' "$tmpcron"
|
||||
echo "$2" >>"$tmpcron"
|
||||
croncmd "$tmpcron"
|
||||
rm -f "$tmpcron"
|
||||
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
|
||||
}
|
||||
|
||||
@@ -5,4 +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
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
webget(){
|
||||
if pidof CrashCore >/dev/null; then
|
||||
setproxy #设置临时代理
|
||||
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/#')
|
||||
@@ -10,31 +10,59 @@ webget(){
|
||||
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\""
|
||||
[ -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=''
|
||||
[ "$5" = "skipceroff" ] && certificate='' || certificate='--no-check-certificate'
|
||||
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
|
||||
[ "$3" = "echooff" ] && progress='-s' || progress='-#'
|
||||
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'
|
||||
[ "$5" = "skipceroff" ] && certificate='' || certificate='-k'
|
||||
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)
|
||||
result=$(curl $agent -w '%{http_code}' --connect-timeout 3 --proxy-header "Proxy-Authorization: Basic $auth_b64" $progress $redirect $certificate -o "$1" "$url")
|
||||
else
|
||||
result=$(curl $agent -w '%{http_code}' --connect-timeout 3 $progress $redirect $certificate -o "$1" "$url")
|
||||
[ -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=""
|
||||
result=$(curl $agent -w '%{http_code}' --connect-timeout 5 $progress $redirect $certificate -o "$1" "$2")
|
||||
|
||||
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
|
||||
@@ -43,7 +71,7 @@ webget(){
|
||||
wget -Y off $progress -O "$1" "$2"
|
||||
return $?
|
||||
else
|
||||
echo "找不到可用下载工具!!!请安装Curl或Wget!!!"
|
||||
echo "No Curl or Wget!!!"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
47
scripts/libs/web_get_curlbar.sh
Normal file
47
scripts/libs/web_get_curlbar.sh
Normal file
@@ -0,0 +1,47 @@
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
@@ -26,7 +26,7 @@ web_save() { #最小化保存面板节点选择
|
||||
. "$CRASHDIR"/libs/compare.sh && compare "$TMPDIR/$file" "$CRASHDIR/configs/$file"
|
||||
[ "$?" = 0 ] && rm -f "$TMPDIR/$file" || mv -f "$TMPDIR/$file" "$CRASHDIR/configs/$file"
|
||||
else
|
||||
rm -f "$CRASHDIR/configs/$file" #空文件时移除旧文件
|
||||
> "$CRASHDIR/configs/$file" #空文件时移除旧文件
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
583
scripts/menu.sh
583
scripts/menu.sh
@@ -2,298 +2,345 @@
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
CRASHDIR=$(
|
||||
cd $(dirname $0)
|
||||
pwd
|
||||
cd $(dirname $0)
|
||||
pwd
|
||||
)
|
||||
|
||||
CFG_PATH="$CRASHDIR"/configs/ShellCrash.cfg
|
||||
#加载执行目录,失败则初始化
|
||||
|
||||
# 加载执行目录,失败则初始化
|
||||
. "$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"
|
||||
|
||||
#通用工具
|
||||
# 通用工具
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/check_cmd.sh
|
||||
. "$CRASHDIR"/libs/check_autostart.sh
|
||||
. "$CRASHDIR"/libs/i18n.sh
|
||||
. "$CRASHDIR"/menus/common.sh
|
||||
. "$CRASHDIR"/menus/1_start.sh
|
||||
. "$CRASHDIR"/menus/running_status.sh
|
||||
errornum() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m请输入正确的字母或数字!\033[0m"
|
||||
}
|
||||
|
||||
# 加载Tui界面
|
||||
[ -z "$tui_type" ] && tui_type='tui_layout'
|
||||
[ "$1" = '-l' ] && tui_type='tui_lite'
|
||||
. "$CRASHDIR"/menus/"$tui_type".sh
|
||||
|
||||
# 加载语言
|
||||
load_lang common
|
||||
load_lang menu
|
||||
|
||||
checkrestart() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m检测到已变更的内容,请重启服务!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "是否现在重启服务?(1/0) > " res
|
||||
[ "$res" = 1 ] && start_service
|
||||
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
|
||||
}
|
||||
|
||||
checkport() { #检查端口冲突
|
||||
for portx in $dns_port $mix_port $redir_port $((redir_port + 1)) $db_port; do
|
||||
if [ -n "$(netstat -ntul 2>&1 | grep ':$portx ')" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "检测到端口【$portx】被以下进程占用!内核可能无法正常启动!\033[33m"
|
||||
echo $(netstat -ntul | grep :$portx | head -n 1)
|
||||
echo -e "\033[0m-----------------------------------------------"
|
||||
echo -e "\033[36m请修改默认端口配置!\033[0m"
|
||||
. "$CRASHDIR"/menus/2_settings.sh && set_adv_config
|
||||
. "$CRASHDIR"/libs/get_config.sh
|
||||
checkport
|
||||
fi
|
||||
done
|
||||
# 检查端口冲突
|
||||
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)
|
||||
|
||||
conflict_found=0
|
||||
|
||||
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 ")
|
||||
|
||||
if [ -n "$conflict_line" ]; then
|
||||
|
||||
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"
|
||||
|
||||
. "$CRASHDIR"/menus/2_settings.sh && set_adv_config
|
||||
. "$CRASHDIR"/libs/get_config.sh
|
||||
|
||||
# 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 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
|
||||
}
|
||||
ckstatus() { #脚本启动前检查
|
||||
#检查脚本配置文件
|
||||
if [ -f "$CFG_PATH" ]; then
|
||||
[ -n "$(awk 'a[$0]++' $CFG_PATH)" ] && awk '!a[$0]++' "$CFG_PATH" >"$CFG_PATH" #检查重复行并去除
|
||||
else
|
||||
. "$CRASHDIR"/init.sh >/dev/null 2>&1
|
||||
fi
|
||||
versionsh=$(cat "$CRASHDIR"/version)
|
||||
[ -n "$versionsh" ] && versionsh_l=$versionsh
|
||||
[ -z "$redir_mod" ] && redir_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='设备IP地址'
|
||||
#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已设置开机启动!\033[0m"
|
||||
auto1="\033[36m禁用\033[0mShellCrash开机启动"
|
||||
else
|
||||
auto="\033[31m未设置开机启动!\033[0m"
|
||||
auto1="\033[36m允许\033[0mShellCrash开机启动"
|
||||
fi
|
||||
#获取运行状态
|
||||
PID=$(pidof CrashCore | awk '{print $NF}')
|
||||
if [ -n "$PID" ]; then
|
||||
run="\033[32m正在运行($redir_mod)\033[0m"
|
||||
running_status
|
||||
elif [ "$firewall_area" = 5 ] && [ -n "$(ip route list table 100)" ]; then
|
||||
run="\033[32m已设置($redir_mod)\033[0m"
|
||||
else
|
||||
run="\033[31m没有运行($redir_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并处于debug状态!\033[0m"
|
||||
#输出状态
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[30;46m欢迎使用ShellCrash!\033[0m 版本:$versionsh_l"
|
||||
echo -e "$corename服务$run,$auto"
|
||||
if [ -n "$PID" ]; then
|
||||
echo -e "当前内存占用:\033[44m"$VmRSS"\033[0m,已运行:\033[46;30m"$day"\033[44;37m"$time"\033[0m"
|
||||
fi
|
||||
echo -e "TG频道:\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
#检查新手引导
|
||||
if [ -z "$userguide" ]; then
|
||||
setconfig userguide 1
|
||||
. "$CRASHDIR"/menus/8_tools.sh && userguide
|
||||
fi
|
||||
#检查执行权限
|
||||
[ ! -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|meta.*'); do
|
||||
echo -e "发现可用的内核文件: \033[36m/tmp/$file\033[0m "
|
||||
read -p "是否加载(会停止当前服务)?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
|
||||
# 脚本启动前检查
|
||||
ckstatus() {
|
||||
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'
|
||||
|
||||
# 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
|
||||
|
||||
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
|
||||
|
||||
# 检查执行权限
|
||||
[ ! -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
|
||||
echo -e "\033[32m内核加载完成!\033[0m "
|
||||
if [ "$?" = 0 ]; then
|
||||
msg_alert "\033[32m$MENU_CORE_LOADED_OK\033[0m"
|
||||
switch_core
|
||||
else
|
||||
echo -e "\033[33m检测到不可用的内核文件!可能是文件受损或CPU架构不匹配!\033[0m"
|
||||
rm -rf /tmp/"$file"
|
||||
echo -e "\033[33m内核文件已移除,请认真检查后重新上传!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
}
|
||||
echo "-----------------------------------------------"
|
||||
done
|
||||
#检查/tmp配置文件
|
||||
for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -iE 'config.yaml$|config.yml$|config.json$'); do
|
||||
tmp_file=/tmp/$file
|
||||
echo -e "发现内核配置文件: \033[36m/tmp/$file\033[0m "
|
||||
read -p "是否加载为$crashcore的配置文件?(1/0) > " 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
|
||||
echo -e "\033[32m配置文件加载完成!\033[0m "
|
||||
sleep 1
|
||||
}
|
||||
done
|
||||
#检查禁用配置覆写
|
||||
[ "$disoverride" = "1" ] && {
|
||||
echo -e "\033[33m你已经禁用了配置文件覆写功能,这会导致大量脚本功能无法使用!\033[0m "
|
||||
read -p "是否取消禁用?(1/0) > " res
|
||||
[ "$res" = 1 ] && unset disoverride && setconfig disoverride
|
||||
echo "-----------------------------------------------"
|
||||
}
|
||||
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
|
||||
|
||||
# 检查禁用配置覆写
|
||||
[ "$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
|
||||
}
|
||||
|
||||
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() {
|
||||
#############################
|
||||
ckstatus
|
||||
#############################
|
||||
echo -e " 1 \033[32m启动/重启服务\033[0m"
|
||||
echo -e " 2 \033[36m功能设置\033[0m"
|
||||
echo -e " 3 \033[31m停止服务\033[0m"
|
||||
echo -e " 4 \033[33m启动设置\033[0m"
|
||||
echo -e " 5 设置\033[32m自动任务\033[0m"
|
||||
echo -e " 6 管理\033[36m配置文件\033[0m"
|
||||
echo -e " 7 \033[33m访问与控制\033[0m"
|
||||
echo -e " 8 \033[0m工具与优化\033[0m"
|
||||
echo -e " 9 \033[32m更新与支持\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 \033[0m退出脚本\033[0m"
|
||||
read -p "请输入对应数字 > " num
|
||||
while true; do
|
||||
ckstatus
|
||||
|
||||
case "$num" in
|
||||
0)
|
||||
exit
|
||||
;;
|
||||
1)
|
||||
start_service
|
||||
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
|
||||
main_menu
|
||||
;;
|
||||
3)
|
||||
[ "$bot_tg_service" = ON ] && . "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_stop
|
||||
"$CRASHDIR"/start.sh stop
|
||||
sleep 1
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m$corename服务已停止!\033[0m"
|
||||
main_menu
|
||||
;;
|
||||
4)
|
||||
. "$CRASHDIR"/menus/4_setboot.sh && setboot
|
||||
main_menu
|
||||
;;
|
||||
5)
|
||||
. "$CRASHDIR"/menus/5_task.sh && task_menu
|
||||
main_menu
|
||||
;;
|
||||
6)
|
||||
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
|
||||
main_menu
|
||||
;;
|
||||
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
|
||||
main_menu
|
||||
;;
|
||||
8)
|
||||
. "$CRASHDIR"/menus/8_tools.sh && tools
|
||||
main_menu
|
||||
;;
|
||||
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
|
||||
main_menu
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
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 "$1" in
|
||||
"")
|
||||
main_menu
|
||||
;;
|
||||
-t)
|
||||
shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash
|
||||
$shtype -x "$CRASHDIR"/menu.sh
|
||||
;;
|
||||
-s)
|
||||
"$CRASHDIR"/start.sh $2 $3 $4 $5 $6
|
||||
;;
|
||||
-i)
|
||||
. "$CRASHDIR"/init.sh 2>/dev/null
|
||||
;;
|
||||
-st)
|
||||
shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash
|
||||
$shtype -x "$CRASHDIR"/start.sh $2 $3 $4 $5 $6
|
||||
;;
|
||||
-d)
|
||||
shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash
|
||||
echo -e "正在测试运行!如发现错误请截图后前往\033[32;4mt.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
|
||||
echo -----------------------------------------
|
||||
cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug
|
||||
if [ -s "$TMPDIR"/sh_bug ]; then
|
||||
while read line; do
|
||||
echo -e "发现错误:\033[33;4m$line\033[0m"
|
||||
grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log
|
||||
echo -----------------------------------------
|
||||
done <"$TMPDIR"/sh_bug
|
||||
rm -rf "$TMPDIR"/sh_bug
|
||||
echo -e "\033[32m测试完成!\033[0m完整执行记录请查看:\033[36m$TMPDIR/debug_sh.log\033[0m"
|
||||
else
|
||||
echo -e "\033[32m测试完成!没有发现问题,请重新启动服务~\033[0m"
|
||||
rm -rf "$TMPDIR"/debug_sh.log
|
||||
fi
|
||||
"$CRASHDIR"/start.sh stop
|
||||
;;
|
||||
-u)
|
||||
. "$CRASHDIR"/menus/uninstall.sh && uninstall
|
||||
;;
|
||||
*)
|
||||
echo -----------------------------------------
|
||||
echo "欢迎使用ShellCrash"
|
||||
echo -----------------------------------------
|
||||
echo " -t 测试模式"
|
||||
echo " -h 帮助列表"
|
||||
echo " -u 卸载脚本"
|
||||
echo " -i 初始化脚本"
|
||||
echo " -d 测试运行"
|
||||
echo -----------------------------------------
|
||||
echo " crash -s start 启动服务"
|
||||
echo " crash -s stop 停止服务"
|
||||
echo " $CRASHDIR/start.sh init 开机初始化"
|
||||
echo -----------------------------------------
|
||||
echo "在线求助:t.me/ShellClash"
|
||||
echo "官方博客:juewuy.github.io"
|
||||
echo "发布页面:github.com/juewuy/ShellCrash"
|
||||
echo -----------------------------------------
|
||||
;;
|
||||
"")
|
||||
main_menu
|
||||
;;
|
||||
-l)
|
||||
main_menu
|
||||
;;
|
||||
-t)
|
||||
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"
|
||||
;;
|
||||
-i)
|
||||
. "$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
|
||||
;;
|
||||
-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
|
||||
;;
|
||||
-u)
|
||||
. "$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
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -3,49 +3,65 @@
|
||||
|
||||
[ -n "$__IS_MODULE_1_START_LOADED" ] && return
|
||||
__IS_MODULE_1_START_LOADED=1
|
||||
load_lang 1_start
|
||||
|
||||
#启动相关
|
||||
# ===== 启动完成提示 =====
|
||||
startover() {
|
||||
echo -ne " \r"
|
||||
echo -e "\033[32m服务已启动!\033[0m"
|
||||
echo -e "请使用 \033[4;36mhttp://$host$hostdir\033[0m 管理内置规则"
|
||||
if [ "$redir_mod" = "纯净模式" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "其他设备可以使用PAC配置连接:\033[4;32mhttp://$host:$db_port/ui/pac\033[0m"
|
||||
echo -e "或者使用HTTP/SOCK5方式连接:IP{\033[36m$host\033[0m}端口{\033[36m$mix_port\033[0m}"
|
||||
top_box "\033[32m$START_SERVICE_OK\033[0m" \
|
||||
"$START_WEB_HINT \033[4;36mhttp://$host$hostdir\033[0m"
|
||||
if [ "$firewall_area" = 4 ]; then
|
||||
content_line ""
|
||||
content_line "$START_PAC_HINT \033[4;32mhttp://$host:$db_port/ui/pac\033[0m"
|
||||
content_line "$START_PROXY_HINT IP{\033[36m$host\033[0m} Port{\033[36m$mix_port\033[0m}"
|
||||
fi
|
||||
separator_line "="
|
||||
line_break
|
||||
sleep 1
|
||||
return 0
|
||||
}
|
||||
|
||||
# ===== 启动核心 =====
|
||||
start_core() {
|
||||
if echo "$crashcore" | grep -q 'singbox'; then
|
||||
core_config="$CRASHDIR"/jsons/config.json
|
||||
core_config="$CRASHDIR/jsons/config.json"
|
||||
else
|
||||
core_config="$CRASHDIR"/yamls/config.yaml
|
||||
core_config="$CRASHDIR/yamls/config.yaml"
|
||||
fi
|
||||
echo "-----------------------------------------------"
|
||||
if [ ! -s $core_config -a -s "$CRASHDIR"/configs/providers.cfg ]; then
|
||||
echo -e "\033[33m没有找到${crashcore}配置文件,尝试生成providers配置文件!\033[0m"
|
||||
[ "$crashcore" = singboxr ] && coretype=singbox
|
||||
[ "$crashcore" = meta -o "$crashcore" = clashpre ] && coretype=clash
|
||||
. "$CRASHDIR"/menus/6_core_config.sh && gen_${coretype}_providers
|
||||
elif [ -s $core_config -o -n "$Url" -o -n "$Https" ]; then
|
||||
"$CRASHDIR"/start.sh start
|
||||
#设置循环检测以判定服务启动是否成功
|
||||
. "$CRASHDIR"/libs/start_wait.sh
|
||||
[ -n "$test" -o -n "$(pidof CrashCore)" ] && {
|
||||
#启动TG机器人
|
||||
[ "$bot_tg_service" = ON ] && . "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_start
|
||||
startover
|
||||
}
|
||||
|
||||
if [ ! -s "$core_config" ] && [ -s "$CRASHDIR/configs/providers.cfg" ]; then
|
||||
if [ "$crashcore" = singboxr ]; then
|
||||
CORE_TYPE=singbox
|
||||
else
|
||||
CORE_TYPE=clash
|
||||
fi
|
||||
. "$CRASHDIR/menus/providers_$CORE_TYPE.sh" && gen_providers
|
||||
|
||||
comp_box "\033[33m$START_NO_CORE_CFG_TRY_GEN\033[0m"
|
||||
elif [ -s "$core_config" ] || [ -n "$Url" ] || [ -n "$Https" ]; then
|
||||
"$CRASHDIR/start.sh" start
|
||||
|
||||
# 循环检测服务启动状态
|
||||
. "$CRASHDIR/libs/start_wait.sh"
|
||||
|
||||
[ -n "$test" ] || pidof CrashCore >/dev/null && {
|
||||
# 启动 TG 机器人
|
||||
if [ "$bot_tg_service" = ON ]; then
|
||||
. "$CRASHDIR/menus/bot_tg_service.sh" && bot_tg_start
|
||||
fi
|
||||
startover
|
||||
}
|
||||
else
|
||||
echo -e "\033[31m没有找到${crashcore}配置文件,请先导入配置文件!\033[0m"
|
||||
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
|
||||
comp_box "\033[31m$START_NO_CORE_CFG_IMPORT_FIRST\033[0m"
|
||||
. "$CRASHDIR/menus/6_core_config.sh" && set_core_config
|
||||
fi
|
||||
}
|
||||
|
||||
# ===== 启动服务入口 =====
|
||||
start_service() {
|
||||
if [ "$firewall_area" = 5 ]; then
|
||||
"$CRASHDIR"/start.sh start
|
||||
echo -e "\033[32m已完成防火墙设置!\033[0m"
|
||||
"$CRASHDIR/start.sh" start
|
||||
comp_box "\033[32m$START_FIREWALL_DONE\033[0m"
|
||||
line_break
|
||||
else
|
||||
start_core
|
||||
fi
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,10 @@
|
||||
__IS_MODULE_4_SETBOOT_LOADED=1
|
||||
|
||||
allow_autostart() {
|
||||
[ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ] && /etc/init.d/shellcrash enable
|
||||
if [ -f /etc/rc.common ] && [ "$(cat /proc/1/comm)" = "procd" ]; then
|
||||
/etc/init.d/shellcrash enable
|
||||
fi
|
||||
|
||||
ckcmd systemctl && systemctl enable shellcrash.service >/dev/null 2>&1
|
||||
grep -q 's6' /proc/1/comm && touch /etc/s6-overlay/s6-rc.d/user/contents.d/afstart
|
||||
rc-status -r >/dev/null 2>&1 && rc-update add shellcrash default >/dev/null 2>&1
|
||||
@@ -24,160 +27,225 @@ disable_autostart() {
|
||||
setboot() {
|
||||
while true; do
|
||||
[ -z "$start_old" ] && start_old=OFF
|
||||
[ -z "$start_delay" -o "$start_delay" = 0 ] && delay=未设置 || delay="${start_delay}秒"
|
||||
check_autostart && auto_set="\033[33m禁止" || auto_set="\033[32m允许"
|
||||
|
||||
if [ -z "$start_delay" ] || [ "$start_delay" = 0 ]; then
|
||||
delay=未设置
|
||||
else
|
||||
delay="${start_delay}秒"
|
||||
fi
|
||||
|
||||
check_autostart && auto_set="ON" || auto_set="OFF"
|
||||
[ "${BINDIR}" = "$CRASHDIR" ] && mini_clash=OFF || mini_clash=ON
|
||||
[ -z "$network_check" ] && network_check=ON
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[30;47m欢迎使用启动设置菜单:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 ${auto_set}\033[0mShellCrash开机启动"
|
||||
echo -e " 2 使用保守模式: \033[36m$start_old\033[0m ————基于定时任务(每分钟检测)"
|
||||
echo -e " 3 设置自启延时: \033[36m$delay\033[0m ————用于解决自启后服务受限"
|
||||
echo -e " 4 启用小闪存模式: \033[36m$mini_clash\033[0m ————用于闪存空间不足的设备"
|
||||
[ "${BINDIR}" != "$CRASHDIR" ] && echo -e " 5 设置小闪存目录: \033[36m${BINDIR}\033[0m"
|
||||
echo -e " 6 自启网络检查: \033[36m$network_check\033[0m ————禁用则跳过自启时网络检查"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 \033[0m返回上级菜单\033[0m"
|
||||
read -p "请输入对应数字 > " num
|
||||
echo "-----------------------------------------------"
|
||||
comp_box "\033[30;47m启动设置菜单\033[0m"
|
||||
content_line "1) 开机自启动: \033[36m$(printf '%-4s' "$auto_set")\033[0m"
|
||||
content_line "2) 使用保守模式: \033[36m$(printf '%-4s' "$start_old")\033[0m ———基于定时任务(每分钟检测)"
|
||||
content_line "3) 设置自启延时: \033[36m$(printf '%-7s' "$delay")\033[0m ———用于解决自启后服务受限"
|
||||
content_line "4) 启用小闪存模式: \033[36m$(printf '%-4s' "$mini_clash")\033[0m ———用于闪存空间不足的设备"
|
||||
[ "${BINDIR}" != "$CRASHDIR" ] && content_line "5) 设置小闪存目录: \033[36m${BINDIR}\033[0m"
|
||||
btm_box "6) 自启网络检查: \033[36m$(printf '%-4s' "$network_check")\033[0m ———禁用则跳过自启时网络检查" \
|
||||
"7) 查看启动日志" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
|
||||
if check_autostart; then
|
||||
# 禁止自启动:删除各系统的启动项
|
||||
disable_autostart
|
||||
echo -e "\033[33m已禁止ShellCrash开机启动!\033[0m"
|
||||
msg_alert "\033[33m已禁止ShellCrash开机自启动!\033[0m"
|
||||
else
|
||||
# 允许自启动:配置各系统的启动项
|
||||
allow_autostart
|
||||
echo -e "\033[32m已设置ShellCrash开机启动!\033[0m"
|
||||
msg_alert "\033[32m已设置ShellCrash开机自启动!\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
if [ "$start_old" = "OFF" ] >/dev/null 2>&1; then
|
||||
echo -e "\033[33m改为使用保守模式启动服务!!\033[0m"
|
||||
disable_autostart
|
||||
start_old=ON
|
||||
setconfig start_old "$start_old"
|
||||
"$CRASHDIR"/start.sh stop
|
||||
msg_alert "\033[33m改为使用保守模式启动服务!\033[0m"
|
||||
else
|
||||
if grep -qE 'procd|systemd|s6' /proc/1/comm || rc-status -r >/dev/null 2>&1; then
|
||||
echo -e "\033[32m改为使用系统守护进程启动服务!!\033[0m"
|
||||
"$CRASHDIR"/start.sh cronset "ShellCrash初始化"
|
||||
start_old=OFF
|
||||
setconfig start_old "$start_old"
|
||||
"$CRASHDIR"/start.sh stop
|
||||
|
||||
msg_alert "\033[32m改为使用系统守护进程启动服务!\033[0m"
|
||||
else
|
||||
echo -e "\033[31m当前设备不支持以其他模式启动!!\033[0m"
|
||||
msg_alert "\033[31m当前设备不支持以其他模式启动!\033[0m"
|
||||
fi
|
||||
fi
|
||||
sleep 1
|
||||
;;
|
||||
3)
|
||||
echo -e "\033[33m如果你的设备启动后可以正常使用,则无需设置!!\033[0m"
|
||||
echo -e "\033[36m推荐设置为30~120秒之间,请根据设备问题自行试验\033[0m"
|
||||
read -p "请输入启动延迟时间(0~300秒) > " sec
|
||||
comp_box "\033[33m如果你的设备启动后可以正常使用,则无需设置!\033[0m" \
|
||||
"\033[36m推荐设置为30~120秒之间,请根据设备问题自行试验\033[0m"
|
||||
read -r -p "请输入启动延迟时间(0~300秒)> " sec
|
||||
case "$sec" in
|
||||
[0-9] | [0-9][0-9] | [0-2][0-9][0-9] | 300)
|
||||
start_delay=$sec
|
||||
setconfig start_delay $sec
|
||||
echo -e "\033[32m设置成功!\033[0m"
|
||||
setconfig start_delay "$sec"
|
||||
msg_alert "\033[32m设置成功!\033[0m"
|
||||
;;
|
||||
*)
|
||||
echo -e "\033[31m输入有误,或超过300秒,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m输入有误,或超过300秒,请重新输入!\033[0m"
|
||||
;;
|
||||
esac
|
||||
sleep 1
|
||||
;;
|
||||
4)
|
||||
dir_size=$(df "$CRASHDIR" | awk '{ for(i=1;i<=NF;i++){ if(NR==1){ arr[i]=$i; }else{ arr[i]=arr[i]" "$i; } } } END{ for(i=1;i<=NF;i++){ print arr[i]; } }' | grep Ava | awk '{print $2}')
|
||||
if [ "$mini_clash" = "OFF" ]; then
|
||||
if [ "$dir_size" -gt 20480 ]; then
|
||||
echo -e "\033[33m您的设备空间充足(>20M),无需开启!\033[0m"
|
||||
elif [ "$start_old" != 'ON' -a "$(cat /proc/1/comm)" = "systemd" ]; then
|
||||
echo -e "\033[33m不支持systemd启动模式,请先启用保守模式!\033[0m"
|
||||
msg_alert "\033[33m您的设备空间充足(>20M),无需开启!\033[0m"
|
||||
elif [ "$start_old" != 'ON' ] && [ "$(cat /proc/1/comm)" = "systemd" ]; then
|
||||
msg_alert "\033[33m不支持systemd启动模式,请先启用保守模式!\033[0m"
|
||||
else
|
||||
[ "$BINDIR" = "$CRASHDIR" ] && BINDIR="$TMPDIR"
|
||||
echo -e "\033[32m已经启用小闪存功能!\033[0m"
|
||||
echo -e "如需更换目录,请使用【设置小闪存目录】功能\033[0m"
|
||||
msg_alert "\033[32m已经启用小闪存功能!\033[0m" \
|
||||
"如需更换目录,请使用【设置小闪存目录】功能\033[0m"
|
||||
fi
|
||||
else
|
||||
if [ "$dir_size" -lt 8192 ]; then
|
||||
echo -e "\033[31m您的设备剩余空间不足8M,停用后可能无法正常运行!\033[0m"
|
||||
read -p "确认停用此功能?(1/0) > " res
|
||||
[ "$res" = 1 ] && BINDIR="$CRASHDIR" && echo -e "\033[33m已经停用小闪存功能!\033[0m"
|
||||
comp_box "\033[31m您的设备剩余空间不足8M,停用后可能无法正常运行!\033[0m" \
|
||||
"是否确认停用此功能?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
BINDIR="$CRASHDIR"
|
||||
msg_alert "\033[33m已经停用小闪存功能!\033[0m"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
rm -rf /tmp/ShellCrash
|
||||
BINDIR="$CRASHDIR"
|
||||
echo -e "\033[33m已经停用小闪存功能!\033[0m"
|
||||
msg_alert "\033[33m已经停用小闪存功能!\033[0m"
|
||||
fi
|
||||
fi
|
||||
setconfig BINDIR "$BINDIR" "$CRASHDIR"/configs/command.env
|
||||
sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/command.env
|
||||
sleep 1
|
||||
;;
|
||||
5)
|
||||
echo -e "\033[33m如设置到内存,则每次开机后都自动重新下载相关文件\033[0m"
|
||||
echo -e "\033[33m请确保安装源可用裸连,否则会导致启动失败\033[0m"
|
||||
echo " 1 使用内存(/tmp)"
|
||||
echo " 2 选择U盘目录"
|
||||
echo " 3 自定义目录"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
1)
|
||||
BINDIR="$TMPDIR"
|
||||
;;
|
||||
2)
|
||||
set_usb_dir() {
|
||||
echo "请选择安装目录"
|
||||
du -hL /mnt | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "请输入相应数字 > " num
|
||||
BINDIR=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ -z "$BINDIR" ]; then
|
||||
echo "\033[31m输入错误!请重新设置!\033[0m"
|
||||
set_usb_dir
|
||||
while true; do
|
||||
comp_box "\033[33m如设置到内存,则每次开机后都自动重新下载相关文件\033[0m" \
|
||||
"\033[33m请确保安装源可用裸连,否则会导致启动失败\033[0m"
|
||||
btm_box "1) 使用内存(/tmp)" \
|
||||
"2) 选择U盘目录" \
|
||||
"3) 自定义目录" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
BINDIR="$TMPDIR"
|
||||
;;
|
||||
2)
|
||||
set_usb_dir() {
|
||||
while true; do
|
||||
comp_box "请选择安装目录:"
|
||||
du -hL /mnt |
|
||||
awk '{print NR") "$2" (已占用的储存空间:"$1")"}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
BINDIR=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ "$num" = 0 ]; then
|
||||
return 1
|
||||
elif [ -z "$BINDIR" ]; then
|
||||
msg_alert "\033[31m输入错误!请重新设置!\033[0m"
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
}
|
||||
set_usb_dir
|
||||
if [ $? -eq 1 ]; then
|
||||
continue
|
||||
fi
|
||||
}
|
||||
set_usb_dir
|
||||
;;
|
||||
3)
|
||||
input_dir() {
|
||||
read -p "请输入自定义目录 > " BINDIR
|
||||
if [ ! -d "$BINDIR" ]; then
|
||||
echo "\033[31m输入错误!请重新设置!\033[0m"
|
||||
input_dir
|
||||
;;
|
||||
3)
|
||||
input_dir() {
|
||||
while true; do
|
||||
comp_box "\033[36m请直接输入命令语句\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " BINDIR
|
||||
if [ "$BINDIR" = 0 ]; then
|
||||
return 1
|
||||
elif [ ! -d "$BINDIR" ]; then
|
||||
msg_alert "\033[31m输入错误!请重新设置!\033[0m"
|
||||
fi
|
||||
return 0
|
||||
done
|
||||
}
|
||||
input_dir
|
||||
if [ $? -eq 1 ]; then
|
||||
continue
|
||||
fi
|
||||
}
|
||||
input_dir
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
setconfig BINDIR "$BINDIR" "$CRASHDIR"/configs/command.env
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/command.env
|
||||
break
|
||||
done
|
||||
;;
|
||||
6)
|
||||
echo -e "\033[33m如果你的设备启动后可以正常使用,则无需变更设置!!\033[0m"
|
||||
echo -e "\033[36m禁用时,如果使用了小闪存模式或者rule-set等在线规则,则可能会因无法联网而导致启动失败!\033[0m"
|
||||
echo -e "\033[32m启用时,会导致部分性能较差或者拨号较慢的设备可能会因查询超时导致启动失败!\033[0m"
|
||||
read -p "是否切换?(1/0) > " res
|
||||
[ "$res" = '1' ] && {
|
||||
comp_box "\033[33m如果你的设备启动后可以正常使用,则无需变更设置!\033[0m" \
|
||||
"\033[36m禁用时,如果使用了小闪存模式或者rule-set等在线规则,则可能会因无法联网而导致启动失败!\033[0m" \
|
||||
"\033[32m启用时,会导致部分性能较差或者拨号较慢的设备可能会因查询超时导致启动失败!\033[0m"
|
||||
|
||||
if [ "$network_check" = "OFF" ]; then
|
||||
content_line "当前\033[33m已禁用\033[0m自启网络检查,是否确认启用?"
|
||||
else
|
||||
content_line "当前\033[33m已启用\033[0m自启网络检查,是否确认禁用?"
|
||||
fi
|
||||
separator_line "-"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = '1' ]; then
|
||||
if [ "$network_check" = "OFF" ]; then
|
||||
network_check=ON
|
||||
else
|
||||
network_check=OFF
|
||||
fi
|
||||
setconfig network_check "$network_check"
|
||||
}
|
||||
sleep 1
|
||||
if setconfig network_check "$network_check"; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
7)
|
||||
if [ -s "$TMPDIR"/ShellCrash.log ]; then
|
||||
line_break
|
||||
echo "==========================================================="
|
||||
grep -v '任务' "$TMPDIR"/ShellCrash.log
|
||||
echo "==========================================================="
|
||||
line_break
|
||||
exit
|
||||
else
|
||||
msg_alert "\033[31m未找到相关日志!\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
@@ -4,344 +4,381 @@
|
||||
[ -n "$__IS_MODULE_5_TASK_LOADED" ] && return
|
||||
__IS_MODULE_5_TASK_LOADED=1
|
||||
|
||||
#通用工具
|
||||
# 通用工具
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/set_cron.sh
|
||||
#任务工具
|
||||
set_cron(){
|
||||
[ -z $week ] && week=*
|
||||
[ -z $hour ] && hour=*
|
||||
[ -z $min ] && min=0
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m$cron_time\033[0m执行任务:\033[36m$task_name\033[0m"
|
||||
read -p "是否确认添加定时任务?(1/0) > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
task_txt="$min $hour * * $week $CRASHDIR/task/task.sh $task_id $cron_time$task_name"
|
||||
cronset "$cron_time$task_name" "$task_txt"
|
||||
echo -e "任务【$cron_time$task_name】\033[32m已添加!\033[0m"
|
||||
fi
|
||||
unset week hour min
|
||||
sleep 1
|
||||
}
|
||||
set_service(){
|
||||
# 参数1代表要任务类型,参数2代表任务ID,参数3代表任务描述,参数4代表running任务cron时间
|
||||
task_file="$CRASHDIR"/task/$1
|
||||
[ -s $task_file ] && sed -i "/$3/d" $task_file
|
||||
#运行时每分钟执行的任务特殊处理
|
||||
if [ "$1" = "running" ];then
|
||||
task_txt="$4 $CRASHDIR/task/task.sh $2 $3"
|
||||
echo "$task_txt" >> $task_file
|
||||
[ -n "$(pidof CrashCore)" ] && cronset "$3" "$task_txt"
|
||||
else
|
||||
echo "$CRASHDIR/task/task.sh $2 $3" >> $task_file
|
||||
fi
|
||||
echo -e "任务【$3】\033[32m添加成功!\033[0m"
|
||||
sleep 1
|
||||
}
|
||||
#任务界面
|
||||
task_user_add(){ #自定义命令添加
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m命令可包含空格,请确保命令可执行!\033[0m"
|
||||
echo -e "\033[36m此处不要添加执行条件,请在添加完成后返回添加具体执行条件!\033[0m"
|
||||
echo -e "也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m添加"
|
||||
read -p "请输入命令语句 > " script
|
||||
if [ -n "$script" ];then
|
||||
task_command=$script
|
||||
echo -e "请检查输入:\033[32m$task_command\033[0m"
|
||||
#获取本任务ID
|
||||
task_max_id=$(awk -F '#' '{print $1}' "$CRASHDIR"/task/task.user 2>/dev/null | sort -n | tail -n 1)
|
||||
[ -z "$task_max_id" ] && task_max_id=200
|
||||
task_id=$((task_max_id + 1))
|
||||
read -p "请输入任务备注 > " txt
|
||||
[ -n "$txt" ] && task_name=$txt || task_name=自定义任务$task_id
|
||||
echo "$task_id#$task_command#$task_name" >> "$CRASHDIR"/task/task.user
|
||||
echo -e "\033[32m自定义任务已添加!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
}
|
||||
task_user_del(){ #自定义命令删除
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "请输入对应ID移除对应自定义任务(不会影响内置任务)"
|
||||
echo -e "也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
cat "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^#' | awk -F '#' '{print $1" "$3}'
|
||||
echo "-----------------------------------------------"
|
||||
echo "0 返回上级菜单"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -n "$num" ];then
|
||||
sed -i "/^$num#/d" "$CRASHDIR"/task/task.user 2>/dev/null
|
||||
[ "$num" != 0 ] && task_user_del
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
}
|
||||
task_add(){ #任务添加
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m请选择需要添加的任务\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
#输出任务列表
|
||||
cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print " "NR" "$3}'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
;;
|
||||
[1-9]|[1-9][0-9])
|
||||
if [ "$num" -le "$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | 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_type
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
task_del(){ #任务删除
|
||||
#删除定时任务
|
||||
croncmd -l > "$TMPDIR"/cron
|
||||
sed -i "/$1/d" "$TMPDIR"/cron && croncmd "$TMPDIR"/cron
|
||||
rm -f "$TMPDIR"/cron
|
||||
#删除条件任务
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/cron 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/bfstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/afstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/running 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/affirewall 2>/dev/null
|
||||
}
|
||||
task_type(){ #任务条件选择菜单
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "请选择任务\033[36m【$task_name】\033[0m执行条件:"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 定时任务\033[32m每周执行\033[0m"
|
||||
echo -e " 2 定时任务\033[32m每日执行\033[0m"
|
||||
echo -e " 3 定时任务\033[32m每小时执行\033[0m"
|
||||
echo -e " 4 定时任务\033[32m每分钟执行\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m逻辑水平不及格的请勿使用下方触发条件!"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 5 服务\033[33m启动前执行\033[0m"
|
||||
echo -e " 6 服务\033[33m启动后执行\033[0m"
|
||||
echo -e " 7 服务\033[33m运行时每分钟执行\033[0m"
|
||||
echo -e " 8 防火墙服务\033[33m重启后执行\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
|
||||
0)
|
||||
return 1
|
||||
;;
|
||||
1)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 输入 1-7 对应\033[33m每周的指定某天\033[0m运行(7=周日)"
|
||||
echo -e " 输入 1,4,0 代表\033[36m每周一、周四、周日\033[0m运行"
|
||||
echo -e " 输入 1-5 代表\033[36m周一至周五\033[0m运行"
|
||||
read -p "在每周哪天执行? > " week
|
||||
week=`echo ${week/7/0}` #把7换成0
|
||||
echo "-----------------------------------------------"
|
||||
read -p "想在该日的具体哪个小时执行?(0-23) > " hour
|
||||
cron_time="在每周$week的$hour点整"
|
||||
cron_time=`echo ${cron_time/周0/周日}` #把0换成日
|
||||
[ -n "$week" ] && [ -n "$hour" ] && set_cron
|
||||
;;
|
||||
2)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 输入 1,7,15 代表\033[36m每到1,7,15点\033[0m运行"
|
||||
echo -e " 输入 6-18 代表\033[36m早6点至晚18点间每小时\033[0m运行"
|
||||
read -p "想在每日的具体哪个小时执行?(0-23) > " hour
|
||||
echo "-----------------------------------------------"
|
||||
read -p "想在具体哪分钟执行?(0-59的整数) > " min
|
||||
cron_time="在每日的$hour点$min分"
|
||||
[ -n "$min" ] && [ -n "$hour" ] && set_cron
|
||||
;;
|
||||
3)
|
||||
echo "-----------------------------------------------"
|
||||
read -p "想每隔多少小时执行一次?(1-23的整数) > " num
|
||||
hour="*/$num"
|
||||
cron_time="每隔$num小时"
|
||||
[ -n "$hour" ] && set_cron
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
read -p "想每隔多少分钟执行一次?(1-59的整数) > " num
|
||||
min="*/$num"
|
||||
cron_time="每隔$num分钟"
|
||||
[ -n "$min" ] && set_cron
|
||||
;;
|
||||
5)
|
||||
set_service bfstart "$task_id" "服务启动前$task_name"
|
||||
;;
|
||||
6)
|
||||
set_service afstart "$task_id" "服务启动后$task_name"
|
||||
;;
|
||||
7)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 输入10即每隔10分钟运行一次,1440即每隔24小时运行一次"
|
||||
echo -e " 大于60分钟的数值将按小时取整,且按当前时区记时"
|
||||
read -p "想每隔多少分钟执行一次?(1-1440的整数) > " num
|
||||
if [ "$num" -lt 60 ];then
|
||||
min="$num"
|
||||
cron_time="*/$min * * * *"
|
||||
time_des="$min分钟"
|
||||
else
|
||||
hour="$((num / 60))"
|
||||
cron_time="0 */$hour * * *"
|
||||
time_des="$hour小时"
|
||||
fi
|
||||
[ -n "$cron_time" ] && set_service running "$task_id" "运行时每$time_des$task_name" "$cron_time"
|
||||
;;
|
||||
8)
|
||||
echo -e "该功能会将相关启动代码注入到/etc/init.d/firewall中"
|
||||
read -p "是否继续?(1/0) > " res
|
||||
[ "$res" = 1 ] && set_service affirewall "$task_id" "防火墙重启后$task_name"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
task_manager(){ #任务管理列表
|
||||
echo "-----------------------------------------------"
|
||||
#抽取并生成临时列表
|
||||
croncmd -l > "$TMPDIR"/task_cronlist
|
||||
cat "$TMPDIR"/task_cronlist "$CRASHDIR"/task/running 2>/dev/null | sort -u | grep -oE "task/task.sh .*" | awk -F ' ' '{print $2" "$3}' > "$TMPDIR"/task_list
|
||||
cat "$CRASHDIR"/task/bfstart "$CRASHDIR"/task/afstart "$CRASHDIR"/task/affirewall 2>/dev/null | awk -F ' ' '{print $2" "$3}' >> "$TMPDIR"/task_list
|
||||
cat "$TMPDIR"/task_cronlist 2>/dev/null | sort -u | grep -oE " #.*" | grep -v "守护" | awk -F '#' '{print "0 旧版任务-"$2}' >> "$TMPDIR"/task_list
|
||||
sed -i '/^ *$/d' "$TMPDIR"/task_list
|
||||
rm -rf "$TMPDIR"/task_cronlist
|
||||
#判断为空则返回
|
||||
if [ ! -s "$TMPDIR"/task_list ];then
|
||||
echo -e "\033[31m当前没有可供管理的任务!\033[36m"
|
||||
sleep 1
|
||||
else
|
||||
echo -e "\033[33m已添加的任务:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
cat "$TMPDIR"/task_list | awk '{print " " NR " " $2}'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " a 清空旧版任务"
|
||||
echo -e " d 清空任务列表"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
;;
|
||||
a)
|
||||
task_del "#"
|
||||
echo -e "\033[31m旧版任务已清空!\033[36m"
|
||||
sleep 1
|
||||
;;
|
||||
d)
|
||||
task_del "task.sh"
|
||||
echo -e "\033[31m全部任务已清空!\033[36m"
|
||||
sleep 1
|
||||
;;
|
||||
[1-9]|[1-9][0-9])
|
||||
load_lang 5_task
|
||||
|
||||
task_txt=$(sed -n "$num p" "$TMPDIR"/task_list)
|
||||
task_id=$(echo $task_txt | awk '{print $1}')
|
||||
if [ "$task_id" = 0 ];then
|
||||
read -p "旧版任务不支持管理,是否移除?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
cronname=$(echo $task_txt | awk -F '-' '{print $2}')
|
||||
croncmd -l > $TMPDIR/conf && sed -i "/$cronname/d" $TMPDIR/conf && croncmd $TMPDIR/conf
|
||||
sed -i "/$cronname/d" $clashdir/tools/cron 2>/dev/null
|
||||
rm -f $TMPDIR/conf
|
||||
}
|
||||
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}')
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "当前任务为:\033[36m $task_des\033[0m"
|
||||
echo -e " 1 \033[33m修改\033[0m当前任务"
|
||||
echo -e " 2 \033[31m删除\033[0m当前任务"
|
||||
echo -e " 3 \033[32m立即执行\033[0m一次"
|
||||
echo -e " 4 查看\033[33m执行记录\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请选择需要执行的操作 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
;;
|
||||
1)
|
||||
task_type && task_del $task_des
|
||||
;;
|
||||
2)
|
||||
task_del $task_des
|
||||
;;
|
||||
3)
|
||||
task_command=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $2}')
|
||||
eval $task_command && task_res='执行成功!' || task_res='执行失败!'
|
||||
echo -e "\033[33m任务【$task_des】$task_res\033[0m"
|
||||
sleep 1
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
if [ -n "$(cat "$TMPDIR"/ShellCrash.log | grep "$task_name")" ];then
|
||||
cat "$TMPDIR"/ShellCrash.log | grep "$task_name"
|
||||
else
|
||||
echo -e "\033[31m未找到相关执行记录!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
task_manager
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
# 任务工具
|
||||
set_cron() {
|
||||
[ -z "$week" ] && week=*
|
||||
[ -z "$hour" ] && hour=*
|
||||
[ -z "$min" ] && min=0
|
||||
comp_box "\033[33m$cron_time\033[0m执行任务:\033[36m$task_name\033[0m" \
|
||||
"" \
|
||||
"是否确认添加定时任务?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = '1' ]; then
|
||||
task_txt="$min $hour * * $week $CRASHDIR/task/task.sh $task_id $cron_time$task_name"
|
||||
cronset "$cron_time$task_name" "$task_txt"
|
||||
msg_alert -t 0 "任务【$cron_time$task_name】\033[32m已添加!\033[0m"
|
||||
fi
|
||||
unset week hour min
|
||||
sleep 1
|
||||
}
|
||||
task_recom(){ #任务推荐
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m启用推荐的自动任务配置?这包括:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "每隔10分钟自动保存面板配置"
|
||||
echo -e "服务启动后自动同步ntp时间"
|
||||
echo -e "在每日的3点0分重启服务"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "是否启用?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
set_service running "106" "运行时每10分钟自动保存面板配置" "*/10 * * * *"
|
||||
set_service afstart "107" "服务启动后自动同步ntp时间"
|
||||
cronset "在每日的3点0分重启服务" "0 3 * * * ${CRASHDIR}/task/task.sh 103 在每日的3点0分重启服务" && \
|
||||
echo -e "任务【在每日的3点0分重启服务】\033[32m添加成功!\033[0m"
|
||||
}
|
||||
|
||||
set_service() {
|
||||
# 参数1代表要任务类型,参数2代表任务ID,参数3代表任务描述,参数4代表running任务cron时间
|
||||
task_file="$CRASHDIR"/task/$1
|
||||
[ -s "$task_file" ] && sed -i "/$3/d" "$task_file"
|
||||
# 运行时每分钟执行的任务特殊处理
|
||||
if [ "$1" = "running" ]; then
|
||||
task_txt="$4 $CRASHDIR/task/task.sh $2 $3"
|
||||
echo "$task_txt" >>"$task_file"
|
||||
[ -n "$(pidof CrashCore)" ] && cronset "$3" "$task_txt"
|
||||
else
|
||||
echo "$CRASHDIR/task/task.sh $2 $3" >>"$task_file"
|
||||
fi
|
||||
content_line "【$3】\033[32m$COMMON_SUCCESS\033[0m"
|
||||
sleep 1
|
||||
}
|
||||
|
||||
# 任务界面
|
||||
#
|
||||
# 自定义命令添加
|
||||
task_user_add() {
|
||||
while true; do
|
||||
comp_box "\033[33m命令可包含空格,请确保命令可执行!\033[0m" \
|
||||
"\033[36m请勿附带执行条件,执行条件请在命令添加完成后再返回设置!\033[0m" \
|
||||
"亦可手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m以添加命令"
|
||||
btm_box "\033[36m请直接输入命令语句\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " script
|
||||
if [ "$script" = 0 ]; then
|
||||
break
|
||||
elif [ -n "$script" ]; then
|
||||
task_command=$script
|
||||
comp_box "请检查输入:\033[32m$task_command\033[0m"
|
||||
# 获取本任务ID
|
||||
task_max_id=$(awk -F '#' '{print $1}' "$CRASHDIR"/task/task.user 2>/dev/null | sort -n | tail -n 1)
|
||||
[ -z "$task_max_id" ] && task_max_id=200
|
||||
task_id=$((task_max_id + 1))
|
||||
read -r -p "请输入任务备注> " txt
|
||||
[ -n "$txt" ] && task_name=$txt || task_name=自定义任务$task_id
|
||||
echo "$task_id#$task_command#$task_name" >>"$CRASHDIR"/task/task.user
|
||||
msg_alert "\033[32m自定义任务已添加!\033[0m"
|
||||
break
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# 自定义命令删除
|
||||
task_user_del() {
|
||||
while true; do
|
||||
if grep -Evq '^#' "$CRASHDIR/task/task.user" 2>/dev/null; then
|
||||
comp_box "请输入对应ID移除对应自定义任务(不会影响内置任务)" \
|
||||
"也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m"
|
||||
grep -Ev '^#' "$CRASHDIR/task/task.user" 2>/dev/null |
|
||||
awk -F '#' '{print $1") "$3}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
if [ "$num" = 0 ]; then
|
||||
break
|
||||
elif [ -n "$num" ]; then
|
||||
sed -i "/^$num#/d" "$CRASHDIR"/task/task.user 2>/dev/null
|
||||
common_success
|
||||
else
|
||||
msg_alert "\033[31m输入错误,请重新输入!\033[0m"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[33m你暂未添加任何自定义任务\033[0m"
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# 任务添加
|
||||
task_add() {
|
||||
while true; do
|
||||
comp_box "\033[36m请选择需要添加的任务:\033[0m"
|
||||
# 输出任务列表
|
||||
list=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print $3}')
|
||||
list_box "$list"
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0)
|
||||
break
|
||||
;;
|
||||
[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_type
|
||||
break
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 任务删除
|
||||
task_del() {
|
||||
# 删除定时任务
|
||||
cronset "$1"
|
||||
# 删除条件任务
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/cron 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/bfstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/afstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/running 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/affirewall 2>/dev/null
|
||||
}
|
||||
|
||||
# 任务条件选择菜单
|
||||
task_type() {
|
||||
comp_box "请选择任务\033[36m【$task_name】\033[0m执行条件:"
|
||||
btm_box "1) 定时任务\033[32m每周执行\033[0m" \
|
||||
"2) 定时任务\033[32m每日执行\033[0m" \
|
||||
"3) 定时任务\033[32m每小时执行\033[0m" \
|
||||
"4) 定时任务\033[32m每分钟执行\033[0m" \
|
||||
" - - - - - - - - -\033[31m注意\033[0m- - - - - - - - -" \
|
||||
" 逻辑水平不及格的请勿使用下方触发条件!" \
|
||||
" - - - - - - - - - - - - - - - - - - - -" \
|
||||
"5) 服务\033[33m启动前执行\033[0m" \
|
||||
"6) 服务\033[33m启动后执行\033[0m" \
|
||||
"7) 服务\033[33m运行时每分钟执行\033[0m" \
|
||||
"8) 防火墙服务\033[33m重启后执行\033[0m" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0)
|
||||
return 1
|
||||
;;
|
||||
1)
|
||||
|
||||
comp_box "输入 1~7 对应\033[33m每周的指定某天\033[0m运行(7=周日)" \
|
||||
"输入 1,4,0 代表\033[36m每周一、周四、周日\033[0m运行" \
|
||||
"输入 1~5 代表\033[36m周一至周五\033[0m运行"
|
||||
read -r -p "在每周哪天执行?> " week
|
||||
# week=`echo ${week/7/0}` # 把7换成0
|
||||
read -r -p "想在该日的具体哪个小时执行?(0~23)> " hour
|
||||
cron_time="在每周$week的$hour点整"
|
||||
# cron_time=`echo ${cron_time/周0/周日}` # 把0换成日
|
||||
[ -n "$week" ] && [ -n "$hour" ] && set_cron
|
||||
;;
|
||||
2)
|
||||
comp_box "输入 1,7,15 代表\033[36m每到1,7,15点\033[0m运行" \
|
||||
"输入 6~18 代表\033[36m早6点至晚18点间每小时\033[0m运行"
|
||||
read -r -p "想在每日的具体哪个小时执行?(0~23)> " hour
|
||||
read -r -p "想在具体哪分钟执行?(0~59的整数)> " min
|
||||
cron_time="在每日的$hour点$min分"
|
||||
[ -n "$min" ] && [ -n "$hour" ] && set_cron
|
||||
;;
|
||||
3)
|
||||
line_break
|
||||
read -r -p "想每隔多少小时执行一次?(1~23的整数)> " num
|
||||
hour="*/$num"
|
||||
cron_time="每隔$num小时"
|
||||
[ -n "$hour" ] && set_cron
|
||||
;;
|
||||
4)
|
||||
line_break
|
||||
read -r -p "想每隔多少分钟执行一次?(1~59的整数)> " num
|
||||
min="*/$num"
|
||||
cron_time="每隔$num分钟"
|
||||
[ -n "$min" ] && set_cron
|
||||
;;
|
||||
5)
|
||||
set_service bfstart "$task_id" "服务启动前$task_name"
|
||||
;;
|
||||
6)
|
||||
set_service afstart "$task_id" "服务启动后$task_name"
|
||||
;;
|
||||
7)
|
||||
comp_box "输入10即每隔10分钟运行一次,1440即每隔24小时运行一次" \
|
||||
"大于60分钟的数值将按小时取整,且按当前时区记时"
|
||||
read -r -p "想每隔多少分钟执行一次?(1~1440的整数)> " num
|
||||
if [ "$num" -lt 60 ]; then
|
||||
min="$num"
|
||||
cron_time="*/$min * * * *"
|
||||
time_des="$min分钟"
|
||||
else
|
||||
hour="$((num / 60))"
|
||||
cron_time="0 */$hour * * *"
|
||||
time_des="$hour小时"
|
||||
fi
|
||||
[ -n "$cron_time" ] && set_service running "$task_id" "运行时每$time_des$task_name" "$cron_time"
|
||||
;;
|
||||
8)
|
||||
comp_box "该功能会将相关启动代码注入到/etc/init.d/firewall中"
|
||||
"是否确认继续?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "请输入对应标号> " res
|
||||
[ "$res" = 1 ] && set_service affirewall "$task_id" "防火墙重启后$task_name"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 任务管理列表
|
||||
task_manager() {
|
||||
while true; do
|
||||
# 抽取并生成临时列表
|
||||
cronload >"$TMPDIR"/task_cronlist
|
||||
cat "$TMPDIR"/task_cronlist "$CRASHDIR"/task/running 2>/dev/null | sort -u | grep -oE "task/task.sh .*" | cut -d ' ' -f 2- >"$TMPDIR"/task_list
|
||||
cat "$CRASHDIR"/task/bfstart "$CRASHDIR"/task/afstart "$CRASHDIR"/task/affirewall 2>/dev/null | cut -d ' ' -f 2- >>"$TMPDIR"/task_list
|
||||
cat "$TMPDIR"/task_cronlist 2>/dev/null | sort -u | grep -oE " #.*" | grep -v "守护" | awk -F '#' '{print "0 旧版任务-"$2}' >>"$TMPDIR"/task_list
|
||||
sed -i '/^ *$/d' "$TMPDIR"/task_list
|
||||
rm -rf "$TMPDIR"/task_cronlist
|
||||
# 判断为空则返回
|
||||
if [ ! -s "$TMPDIR"/task_list ]; then
|
||||
msg_alert "\033[31m当前没有可供管理的任务!\033[36m"
|
||||
break
|
||||
else
|
||||
comp_box "\033[33m已添加的任务:\033[0m"
|
||||
list_box "$(cat "$TMPDIR"/task_list)"
|
||||
separator_line "-"
|
||||
btm_box "a) 清空旧版任务" \
|
||||
"d) 清空任务列表" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
a)
|
||||
task_del "#"
|
||||
msg_alert "\033[31m旧版任务已清空!\033[36m"
|
||||
;;
|
||||
d)
|
||||
task_del "task.sh"
|
||||
msg_alert "\033[31m全部任务已清空!\033[36m"
|
||||
;;
|
||||
[1-9] | [1-9][0-9])
|
||||
task_txt=$(sed -n "$num p" "$TMPDIR"/task_list)
|
||||
task_id=$(echo "$task_txt" | awk '{print $1}')
|
||||
|
||||
if [ "$task_id" = 0 ]; then
|
||||
comp_box "旧版任务不支持管理,是否移除?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
cronname=$(echo "$task_txt" | awk -F '-' '{print $2}')
|
||||
cronset "$cronname"
|
||||
sed -i "/$cronname/d" "$CRASHDIR"/task/cron 2>/dev/null
|
||||
|
||||
break
|
||||
fi
|
||||
else
|
||||
task_des=$(echo "$task_txt" | awk '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $3}')
|
||||
comp_box "当前任务为:\033[36m$task_des\033[0m"
|
||||
btm_box "1) \033[33m修改\033[0m当前任务" \
|
||||
"2) \033[31m删除\033[0m当前任务" \
|
||||
"3) \033[32m立即执行\033[0m一次" \
|
||||
"4) 查看\033[33m执行记录\033[0m" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
continue
|
||||
;;
|
||||
1)
|
||||
task_type && task_del "$task_des"
|
||||
;;
|
||||
2)
|
||||
task_del "$task_des"
|
||||
common_success
|
||||
;;
|
||||
3)
|
||||
task_command=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $2}')
|
||||
eval "$task_command" && task_res='执行成功!' || task_res='执行失败!'
|
||||
msg_alert "\033[33m任务【$task_des】$task_res\033[0m"
|
||||
;;
|
||||
4)
|
||||
if cat "$TMPDIR"/ShellCrash.log | grep -q "$task_name"; then
|
||||
line_break
|
||||
echo "==========================================================="
|
||||
cat "$TMPDIR"/ShellCrash.log | grep "$task_name"
|
||||
echo "==========================================================="
|
||||
else
|
||||
msg_alert "\033[31m未找到相关执行记录!\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# 任务推荐
|
||||
task_recom() {
|
||||
comp_box "\033[36m$TASK_RECOM_TITLE\033[0m" \
|
||||
"" \
|
||||
"$TASK_RECOM_ITEM_1" \
|
||||
"$TASK_RECOM_ITEM_2" \
|
||||
"$TASK_RECOM_ITEM_3"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "$COMMON_INPUT>" res
|
||||
|
||||
[ "$res" = 1 ] && {
|
||||
line_break
|
||||
separator_line "="
|
||||
set_service running "106" "$TASK_RECOM_ITEM_1" "*/10 * * * *"
|
||||
set_service afstart "107" "$TASK_RECOM_ITEM_2"
|
||||
cronset "$TASK_RECOM_ITEM_3" "0 3 * * * ${CRASHDIR}/task/task.sh 103 $TASK_RECOM_ITEM_3" &&
|
||||
content_line "【$TASK_RECOM_ITEM_3】\033[32m$COMMON_SUCCESS\033[0m"
|
||||
separator_line "="
|
||||
}
|
||||
}
|
||||
|
||||
# 任务菜单
|
||||
task_menu() {
|
||||
while true; do
|
||||
#检测并创建自定义任务文件
|
||||
# 检测并创建自定义任务文件
|
||||
[ -f "$CRASHDIR"/task/task.user ] || echo '#任务ID(必须>200并顺序排列)#任务命令#任务说明(#号隔开,任务命令和说明中都不允许包含#号)' >"$CRASHDIR"/task/task.user
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[30;47m欢迎使用自动任务功能:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 添加\033[32m自动任务\033[0m"
|
||||
echo -e " 2 管理\033[33m任务列表\033[0m"
|
||||
echo -e " 3 查看\033[36m任务日志\033[0m"
|
||||
echo -e " 4 配置\033[36m日志推送\033[0m"
|
||||
echo -e " 5 添加\033[33m自定义任务\033[0m"
|
||||
echo -e " 6 删除\033[33m自定义任务\033[0m"
|
||||
echo -e " 7 使用\033[32m推荐设置\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
comp_box "\033[30;47m自动任务菜单\033[0m"
|
||||
btm_box "1) 添加\033[32m自动任务\033[0m" \
|
||||
"2) 管理\033[33m任务列表\033[0m" \
|
||||
"3) 查看\033[36m任务日志\033[0m" \
|
||||
"4) 配置\033[36m日志推送\033[0m" \
|
||||
"5) 添加\033[33m自定义任务\033[0m" \
|
||||
"6) 删除\033[33m自定义任务\033[0m" \
|
||||
"7) 使用\033[32m推荐设置\033[0m" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -354,17 +391,17 @@ task_menu() {
|
||||
rm -rf "$TMPDIR"/task_list
|
||||
;;
|
||||
3)
|
||||
if [ -n "$(cat "$TMPDIR"/ShellCrash.log | grep '任务【')" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
if cat "$TMPDIR"/ShellCrash.log | grep -q '任务【'; then
|
||||
line_break
|
||||
echo "==========================================================="
|
||||
cat "$TMPDIR"/ShellCrash.log | grep '任务【'
|
||||
echo "==========================================================="
|
||||
else
|
||||
echo -e "\033[31m未找到任务相关执行日志!\033[0m"
|
||||
msg_alert "\033[31m未找到任务相关执行日志!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m请在日志工具中配置相关推送通道及推送开关\033[0m"
|
||||
msg_alert "\033[36m请在日志工具中配置相关推送通道及推送开关\033[0m"
|
||||
. "$CRASHDIR"/menus/8_tools.sh && log_pusher
|
||||
;;
|
||||
5)
|
||||
@@ -378,8 +415,6 @@ task_menu() {
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2,6 +2,7 @@
|
||||
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$( cd $(dirname $0);cd ..;pwd)
|
||||
. "$CRASHDIR"/libs/web_json.sh
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/web_get_lite.sh
|
||||
. "$CRASHDIR"/menus/running_status.sh
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
@@ -155,12 +156,10 @@ download_file(){
|
||||
else
|
||||
send_msg "文件格式不匹配,上传失败!"
|
||||
fi
|
||||
OFFSET=$((OFFSET + 1))
|
||||
continue
|
||||
}
|
||||
### --- 具体操作函数 --- ###
|
||||
do_start_fw(){
|
||||
[ -z "$redir_mod_bf" ] && redir_mod_bf='Redir模式'
|
||||
[ -z "$redir_mod_bf" ] && redir_mod_bf='Redir'
|
||||
redir_mod=$redir_mod_bf
|
||||
setconfig redir_mod $redir_mod
|
||||
"$CRASHDIR"/start.sh start_firewall
|
||||
@@ -168,8 +167,8 @@ do_start_fw(){
|
||||
}
|
||||
do_stop_fw(){
|
||||
redir_mod_bf=$redir_mod
|
||||
redir_mod='纯净模式'
|
||||
setconfig redir_mod $redir_mod
|
||||
firewall_area=4
|
||||
setconfig firewall_area 4
|
||||
"$CRASHDIR"/start.sh stop_firewall
|
||||
echo "ShellCrash 已切换到纯净模式!" > "$LOGFILE"
|
||||
}
|
||||
@@ -231,14 +230,21 @@ polling(){
|
||||
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
|
||||
[ -n "$FILE_ID" ] && {
|
||||
download_file
|
||||
continue
|
||||
}
|
||||
[ -n "$CALLBACK" ] && case "$CALLBACK" in
|
||||
"start_redir")
|
||||
if [ "$redir_mod" = '纯净模式' ];then
|
||||
if [ "$firewall_area" = 4 ];then
|
||||
do_start_fw
|
||||
send_msg "已切换到$redir_mod_bf!"
|
||||
else
|
||||
@@ -248,7 +254,7 @@ polling(){
|
||||
continue
|
||||
;;
|
||||
"stop_redir")
|
||||
if [ "$redir_mod" != '纯净模式' ];then
|
||||
if [ "$firewall_area" != 4 ];then
|
||||
do_stop_fw
|
||||
send_msg "已切换到纯净模式"
|
||||
else
|
||||
@@ -303,6 +309,9 @@ polling(){
|
||||
/crash)
|
||||
send_menu
|
||||
;;
|
||||
/"$my_alias")
|
||||
send_menu
|
||||
;;
|
||||
/help)
|
||||
send_help
|
||||
;;
|
||||
@@ -311,7 +320,7 @@ polling(){
|
||||
done
|
||||
}
|
||||
|
||||
#send_menu
|
||||
[ "$TG_menupush" = ON ] && send_menu
|
||||
|
||||
polling
|
||||
|
||||
|
||||
@@ -3,57 +3,56 @@
|
||||
. "$CRASHDIR"/libs/web_get_lite.sh
|
||||
|
||||
private_bot() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入你获取到的API TOKEN > " TOKEN
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m"
|
||||
url_tg=https://api.telegram.org/bot${TOKEN}/getUpdates
|
||||
}
|
||||
public_bot() {
|
||||
echo -e "请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m"
|
||||
TOKEN=publictoken
|
||||
url_tg=https://tgbot.jwsc.eu.org/publictoken/getUpdates
|
||||
}
|
||||
tg_push_token(){
|
||||
push_TG="$TOKEN"
|
||||
setconfig push_TG "$TOKEN"
|
||||
setconfig chat_ID "$chat_ID"
|
||||
"$CRASHDIR"/start.sh logger "已完成Telegram日志推送设置!" 32
|
||||
}
|
||||
get_chatid(){
|
||||
i=1
|
||||
chat_ID=''
|
||||
while [ $i -le 3 ] && [ -z "$chat_ID" ]; do
|
||||
sleep 1
|
||||
echo -e "\033[33m第 $i 次尝试获取对话ID失败,正在重试...\033[0m"
|
||||
chat=$(web_get_lite "$url_tg" 2>/dev/null)
|
||||
if [ -n "$chat" ];then
|
||||
chat_ID=$(echo $chat | sed 's/"update_id":/{\n"update_id":/g' | grep "$public_key" | head -n1 | grep -oE '"id":.*,"is_bot' | sed s'/"id"://' | sed s'/,"is_bot//')
|
||||
fi
|
||||
i=$((i + 1))
|
||||
done
|
||||
}
|
||||
set_bot() {
|
||||
public_key=$(cat /proc/sys/kernel/random/boot_id | sed 's/.*-//')
|
||||
echo -e "发送此秘钥: \033[30;46m$public_key\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "我已经发送完成(1/0) > " res
|
||||
if [ "$res" = 1 ]; then
|
||||
get_chatid
|
||||
[ -z "$chat_ID" ] && [ "$TOKEN" != 'publictoken' ] && {
|
||||
echo -e "\033[31m无法获取对话ID,请返回重新设置或手动输入ChatID!\033[0m"
|
||||
echo -e "通常访问 \033[32;4m$url_tg\033[0m \n\033[36m即可看到ChatID\033[0m"
|
||||
read -p "请手动输入ChatID > " chat_ID
|
||||
}
|
||||
if echo "$chat_ID" | grep -qE '^[0-9]{8,}$'; then
|
||||
return 0
|
||||
else
|
||||
echo -e "\033[31m无法获取对话ID,请重新配置!\033[0m"
|
||||
sleep 1
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
comp_box "请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m"
|
||||
read -r -p "请输入你获取到的API TOKEN> " TOKEN
|
||||
url_tg=https://api.telegram.org/bot${TOKEN}/getUpdates
|
||||
|
||||
top_box "请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m"
|
||||
}
|
||||
|
||||
public_bot() {
|
||||
comp_box "请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m"
|
||||
TOKEN=publictoken
|
||||
url_tg=https://tgbot.jwsc.eu.org/publictoken/getUpdates
|
||||
}
|
||||
|
||||
tg_push_token() {
|
||||
push_TG="$TOKEN"
|
||||
setconfig push_TG "$TOKEN"
|
||||
setconfig chat_ID "$chat_ID"
|
||||
. "$CRASHDIR"/libs/logger.sh && logger "已完成Telegram日志推送设置!" 32
|
||||
}
|
||||
|
||||
get_chatid() {
|
||||
i=1
|
||||
chat_ID=''
|
||||
while [ $i -le 3 ] && [ -z "$chat_ID" ]; do
|
||||
sleep 1
|
||||
comp_box "\033[33m第 $i 次尝试获取对话ID失败,正在重试...\033[0m"
|
||||
chat=$(web_get_lite "$url_tg" 2>/dev/null)
|
||||
if [ -n "$chat" ]; then
|
||||
chat_ID=$(echo "$chat" | sed 's/"update_id":/{\n"update_id":/g' | grep "$public_key" | head -n1 | grep -oE '"id":.*,"is_bot' | sed s'/"id"://' | sed s'/,"is_bot//')
|
||||
fi
|
||||
i=$((i + 1))
|
||||
done
|
||||
}
|
||||
|
||||
set_bot() {
|
||||
public_key=$(cat /proc/sys/kernel/random/boot_id | sed 's/.*-//')
|
||||
btm_box "发送此秘钥: \033[30;46m$public_key\033[0m"
|
||||
read -r -p "我已经发送完成(1/0)> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
get_chatid
|
||||
[ -z "$chat_ID" ] && [ "$TOKEN" != 'publictoken' ] && {
|
||||
comp_box "\033[31m无法获取对话ID,请返回重新设置或手动输入ChatID!\033[0m" \
|
||||
"通常访问 \033[32;4m$url_tg\033[0m \n\033[36m即可看到ChatID\033[0m"
|
||||
read -r -p "请手动输入ChatID> " chat_ID
|
||||
}
|
||||
if echo "$chat_ID" | grep -qE '^[0-9]{8,}$'; then
|
||||
return 0
|
||||
else
|
||||
msg_alert "\033[31m无法获取对话ID,请重新配置!\033[0m"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -2,18 +2,15 @@
|
||||
. "$CRASHDIR"/libs/set_cron.sh
|
||||
|
||||
bot_tg_start(){
|
||||
bot_tg_stop
|
||||
. "$CRASHDIR"/starts/start_legacy.sh
|
||||
start_legacy "$CRASHDIR/menus/bot_tg.sh" 'bot_tg'
|
||||
bot_tg_cron
|
||||
}
|
||||
bot_tg_stop(){
|
||||
cronset 'TG_BOT守护进程'
|
||||
[ -f "$TMPDIR/bot_tg.pid" ] && kill -TERM "$(cat "$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 'TG_BOT守护进程'
|
||||
cronset 'TG_BOT守护进程' "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程"
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
check_port(){
|
||||
if [ "$1" -gt 65535 -o "$1" -le 1 ]; then
|
||||
echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
return 1
|
||||
elif [ -n "$(echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep "|$1|")" ]; then
|
||||
echo -e "\033[31m输入错误!请不要输入重复的端口!\033[0m"
|
||||
return 1
|
||||
elif [ -n "$(netstat -ntul | grep -E ":$1[[:space:]]")" ]; then
|
||||
echo -e "\033[31m当前端口已被其他进程占用,请重新输入!\033[0m"
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
check_port() {
|
||||
if [ "$1" -gt 65535 ] || [ "$1" -le 1 ]; then
|
||||
msg_alert "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
return 1
|
||||
elif echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep -q "|$1|"; then
|
||||
msg_alert "\033[31m输入错误!请不要输入重复的端口!\033[0m"
|
||||
return 1
|
||||
elif netstat -ntul | grep -q ":$1[[:space:]]"; then
|
||||
msg_alert "\033[31m当前端口已被其他进程占用,请重新输入!\033[0m"
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
87
scripts/menus/common.sh
Normal file
87
scripts/menus/common.sh
Normal file
@@ -0,0 +1,87 @@
|
||||
msg_alert() {
|
||||
# Default sleep time
|
||||
_sleep_time=1
|
||||
|
||||
if [ "$1" = "-t" ] && [ -n "$2" ]; then
|
||||
_sleep_time="$2"
|
||||
shift 2
|
||||
fi
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
for line in "$@"; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
sleep "$_sleep_time"
|
||||
}
|
||||
|
||||
# complete box
|
||||
comp_box() {
|
||||
line_break
|
||||
separator_line "="
|
||||
for line in "$@"; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
}
|
||||
|
||||
top_box() {
|
||||
line_break
|
||||
separator_line "="
|
||||
for line in "$@"; do
|
||||
content_line "$line"
|
||||
done
|
||||
}
|
||||
|
||||
# bottom box
|
||||
btm_box() {
|
||||
for line in "$@"; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
}
|
||||
|
||||
list_box() {
|
||||
i=1
|
||||
printf '%s\n' "$1" | while IFS= read -r f; do
|
||||
content_line "$i) $f$2"
|
||||
i=$((i + 1))
|
||||
done
|
||||
}
|
||||
|
||||
common_success() {
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
}
|
||||
|
||||
common_failed() {
|
||||
msg_alert "\033[32m$COMMON_FAILED\033[0m"
|
||||
}
|
||||
|
||||
# =================================================
|
||||
common_back() {
|
||||
content_line "0) $COMMON_BACK"
|
||||
separator_line "="
|
||||
}
|
||||
|
||||
errornum() {
|
||||
msg_alert "\033[31m$COMMON_ERR_NUM\033[0m"
|
||||
}
|
||||
|
||||
error_letter() {
|
||||
msg_alert "\033[31m$COMMON_ERR_LETTER\033[0m"
|
||||
}
|
||||
|
||||
error_input() {
|
||||
msg_alert "\033[31m$COMMON_ERR_INPUT\033[0m"
|
||||
}
|
||||
|
||||
error_cancel() {
|
||||
error_report "\033[31m$COMMON_ERR_CANCEL\033[0m"
|
||||
}
|
||||
|
||||
cancel_back() {
|
||||
separator_line "-"
|
||||
content_line "$COMMON_CANCEL"
|
||||
sleep 1
|
||||
}
|
||||
@@ -1,15 +1,14 @@
|
||||
#! /bin/bash
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
|
||||
ddns_menu(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;46m欢迎使用DDNS!\033[0m"
|
||||
load_ddns
|
||||
ddns_menu() {
|
||||
top_box "\033[30;46m欢迎使用DDNS!\033[0m"
|
||||
load_ddns
|
||||
}
|
||||
|
||||
add_ddns() {
|
||||
cat >>"$ddns_dir" <<EOF
|
||||
|
||||
cat >>"$ddns_dir" <<EOF
|
||||
|
||||
config service '$service'
|
||||
option enabled '1'
|
||||
option force_unit 'hours'
|
||||
@@ -27,152 +26,199 @@ config service '$service'
|
||||
option interface 'wan'
|
||||
option bind_network 'wan'
|
||||
EOF
|
||||
/usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
|
||||
sleep 3
|
||||
echo 服务已经添加!
|
||||
/usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
|
||||
sleep 3
|
||||
msg_alert "服务已经添加!"
|
||||
}
|
||||
|
||||
set_ddns() {
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入你的域名 > " str
|
||||
[ -z "$str" ] && domain="$domain" || domain="$str"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入用户名或邮箱 > " str
|
||||
[ -z "$str" ] && username="$username" || username="$str"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入密码或令牌秘钥 > " str
|
||||
[ -z "$str" ] && password="$password" || password="$str"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入检测更新间隔(单位:分钟;默认为10) > " check_interval
|
||||
[ -z "$check_interval" ] || [ "$check_interval" -lt 1 -o "$check_interval" -gt 1440 ] && check_interval=10
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入强制更新间隔(单位:小时;默认为24) > " force_interval
|
||||
[ -z "$force_interval" ] || [ "$force_interval" -lt 1 -o "$force_interval" -gt 240 ] && force_interval=24
|
||||
echo -----------------------------------------------
|
||||
echo -e "请核对如下信息:"
|
||||
echo -e "服务商: \033[32m$service\033[0m"
|
||||
echo -e "域名: \033[32m$domain\033[0m"
|
||||
echo -e "用户名: \033[32m$username\033[0m"
|
||||
echo -e "检测间隔: \033[32m$check_interval\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "确认添加?(1/0) > " res
|
||||
[ "$res" = 1 ] && add_ddns || set_ddns
|
||||
while true; do
|
||||
line_break
|
||||
read -r -p "请输入你的域名> " str
|
||||
[ -z "$str" ] && domain="$domain" || domain="$str"
|
||||
echo ""
|
||||
read -r -p "请输入用户名或邮箱> " str
|
||||
[ -z "$str" ] && username="$username" || username="$str"
|
||||
echo ""
|
||||
read -r -p "请输入密码或令牌秘钥> " str
|
||||
[ -z "$str" ] && password="$password" || password="$str"
|
||||
echo ""
|
||||
read -r -p "请输入检测更新间隔(单位:分钟;默认为10)> " check_interval
|
||||
[ -z "$check_interval" ] || [ "$check_interval" -lt 1 -o "$check_interval" -gt 1440 ] && check_interval=10
|
||||
echo ""
|
||||
read -r -p "请输入强制更新间隔(单位:小时;默认为24)> " force_interval
|
||||
[ -z "$force_interval" ] || [ "$force_interval" -lt 1 -o "$force_interval" -gt 240 ] && force_interval=24
|
||||
|
||||
comp_box "请核对如下信息:" \
|
||||
"" \
|
||||
"服务商: \033[32m$service\033[0m" \
|
||||
"域名: \033[32m$domain\033[0m" \
|
||||
"用户名: \033[32m$username\033[0m" \
|
||||
"检测间隔: \033[32m$check_interval\033[0m"
|
||||
btm_box "是否确认添加:"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,重新輸入"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
add_ddns
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
set_ddns_service() {
|
||||
services_dir=/etc/ddns/"$serv"
|
||||
[ -s "$services_dir" ] || services_dir=/usr/share/ddns/list
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m请选择服务提供商\033[0m"
|
||||
cat "$services_dir" | grep -v '^#' | awk '{print " "NR" " $1}'
|
||||
nr=$(cat "$services_dir" | grep -v '^#' | wc -l)
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" ]; then
|
||||
i=
|
||||
elif [ "$num" -gt 0 -a "$num" -lt $nr ]; then
|
||||
service_name=$(cat "$services_dir" | grep -v '^#' | awk '{print $1}' | sed -n "$num"p | sed 's/"//g')
|
||||
service=$(echo $service_name | sed 's/\./_/g')
|
||||
set_ddns
|
||||
else
|
||||
echo "输入错误,请重新输入!"
|
||||
sleep 1
|
||||
set_ddns_service
|
||||
fi
|
||||
while true; do
|
||||
services_dir=/etc/ddns/"$serv"
|
||||
[ -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列表文件,尝试在线获取……\033[0m"
|
||||
ddns service update >/dev/null || msg_alert "\033[31m下载失败,请重试!\033[0m"
|
||||
}
|
||||
comp_box "\033[32m请选择服务提供商:\033[0m"
|
||||
|
||||
list=$(awk '/^#/ || !NF {next} {print $1}' "$services_dir")
|
||||
list_box "$list"
|
||||
|
||||
nr=$(echo "$list" | wc -l)
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
break
|
||||
elif [ "$num" -gt 0 ] && [ "$num" -lt "$nr" ]; then
|
||||
service_name=$(echo "$list" | sed -n "$num"p | sed 's/"//g')
|
||||
service=$(echo "$service_name" | sed 's/\./_/g')
|
||||
set_ddns
|
||||
break
|
||||
else
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
set_ddns_type() {
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m请选择网络模式\033[0m"
|
||||
echo -e " 1 \033[36mIPV4\033[0m"
|
||||
echo -e " 2 \033[36mIPV6\033[0m"
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" ]; then
|
||||
i=
|
||||
elif [ "$num" = 1 ]; then
|
||||
use_ipv6=0
|
||||
serv=services
|
||||
set_ddns_service
|
||||
elif [ "$num" = 2 ]; then
|
||||
use_ipv6=1
|
||||
serv=services_ipv6
|
||||
set_ddns_service
|
||||
else
|
||||
echo "输入错误,请重新输入!"
|
||||
sleep 1
|
||||
set_ddns_type
|
||||
fi
|
||||
while true; do
|
||||
comp_box "\033[32m请选择网络模式:\033[0m"
|
||||
btm_box "1) \033[36mIPV4\033[0m" \
|
||||
"2) \033[36mIPV6\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
use_ipv6=0
|
||||
serv=services
|
||||
set_ddns_service
|
||||
break
|
||||
;;
|
||||
2)
|
||||
use_ipv6=1
|
||||
serv=services_ipv6
|
||||
set_ddns_service
|
||||
break
|
||||
;;
|
||||
*)
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
rev_ddns_service() {
|
||||
enabled=$(uci get ddns."$service".enabled)
|
||||
[ "$enabled" = 1 ] && enabled_b="停用" || enabled_b="启用"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 \033[32m立即更新\033[0m"
|
||||
echo -e " 2 编辑当前服务\033[0m"
|
||||
echo -e " 3 $enabled_b当前服务"
|
||||
echo -e " 4 移除当前服务"
|
||||
echo -e " 5 查看运行日志"
|
||||
echo -e " 0 返回上级菜单"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" -o "$num" = 0 ]; then
|
||||
i=
|
||||
elif [ "$num" = 1 ]; then
|
||||
/usr/lib/ddns/dynamic_dns_updater.sh -S $service start >/dev/null 2>&1 &
|
||||
sleep 3
|
||||
elif [ "$num" = 2 ]; then
|
||||
domain=$(uci get ddns."$service".domain 2>/dev/null)
|
||||
username=$(uci get ddns."$service".username 2>/dev/null)
|
||||
password=$(uci get ddns."$service".password 2>/dev/null)
|
||||
service_name=$(uci get ddns."$service".service_name 2>/dev/null)
|
||||
uci delete ddns."$service"
|
||||
set_ddns
|
||||
elif [ "$num" = 3 ]; then
|
||||
[ "$enabled" = 1 ] && uci set ddns."$service".enabled='0' || uci set ddns."$service".enabled='1' && sleep 3
|
||||
uci commit ddns."$service"
|
||||
elif [ "$num" = 4 ]; then
|
||||
uci delete ddns."$service"
|
||||
uci commit ddns."$service"
|
||||
elif [ "$num" = 5 ]; then
|
||||
echo -----------------------------------------------
|
||||
cat /var/log/ddns/"$service".log 2>/dev/null
|
||||
sleep 1
|
||||
fi
|
||||
while true; do
|
||||
enabled=$(uci get ddns."$service".enabled)
|
||||
[ "$enabled" = 1 ] && enabled_b="停用" || enabled_b="启用"
|
||||
comp_box "1) \033[32m立即更新\033[0m" \
|
||||
"2) 编辑当前服务" \
|
||||
"3) $enabled_b当前服务" \
|
||||
"4) 移除当前服务" \
|
||||
"5) 查看运行日志" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
/usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
|
||||
sleep 3
|
||||
break
|
||||
;;
|
||||
2)
|
||||
domain=$(uci get ddns."$service".domain 2>/dev/null)
|
||||
username=$(uci get ddns."$service".username 2>/dev/null)
|
||||
password=$(uci get ddns."$service".password 2>/dev/null)
|
||||
service_name=$(uci get ddns."$service".service_name 2>/dev/null)
|
||||
uci delete ddns."$service"
|
||||
set_ddns
|
||||
break
|
||||
;;
|
||||
3)
|
||||
[ "$enabled" = 1 ] && uci set ddns."$service".enabled='0' || uci set ddns."$service".enabled='1' && sleep 3
|
||||
uci commit ddns."$service"
|
||||
break
|
||||
;;
|
||||
4)
|
||||
uci delete ddns."$service"
|
||||
uci commit ddns."$service"
|
||||
break
|
||||
;;
|
||||
5)
|
||||
line_break
|
||||
echo "==========================================================="
|
||||
cat /var/log/ddns/"$service".log 2>/dev/null
|
||||
echo "==========================================================="
|
||||
break
|
||||
;;
|
||||
*)
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
load_ddns() {
|
||||
ddns_dir=/etc/config/ddns
|
||||
tmp_dir="$TMPDIR"/ddns
|
||||
[ ! -f "$ddns_dir" ] && {
|
||||
echo -e "\033[31m本脚本依赖OpenWrt内置的DDNS服务,当前设备无法运行,已退出!\033[0m"
|
||||
sleep 1
|
||||
return 1
|
||||
}
|
||||
nr=0
|
||||
cat "$ddns_dir" | grep 'config service' | awk '{print $3}' | sed "s/'//g" | sed 's/"//g' >"$tmp_dir"
|
||||
echo -----------------------------------------------
|
||||
echo -e "列表 域名 启用 IP地址"
|
||||
echo -----------------------------------------------
|
||||
[ -s "$tmp_dir" ] && for service in $(cat "$tmp_dir"); do
|
||||
#echo $service >>$tmp_dir
|
||||
nr=$((nr + 1))
|
||||
enabled=$(uci get ddns."$service".enabled 2>/dev/null)
|
||||
domain=$(uci get ddns."$service".domain 2>/dev/null)
|
||||
local_ip=$(sed '1!G;h;$!d' /var/log/ddns/$service.log 2>/dev/null | grep -E 'Registered IP' | tail -1 | awk -F "'" '{print $2}' | tr -d "'\"")
|
||||
echo -e " $nr $domain $enabled $local_ip"
|
||||
done
|
||||
echo -e " $((nr + 1)) 添加DDNS服务"
|
||||
echo -e " 0 退出"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应序号 > " num
|
||||
if [ -z "$num" -o "$num" = 0 ]; then
|
||||
i=
|
||||
elif [ "$num" -gt $nr ]; then
|
||||
set_ddns_type
|
||||
load_ddns
|
||||
elif [ "$num" -gt 0 -a "$num" -le $nr ]; then
|
||||
service=$(cat $tmp_dir | sed -n "$num"p)
|
||||
rev_ddns_service
|
||||
load_ddns
|
||||
else
|
||||
echo "请输入正确数字!" && load_ddns
|
||||
fi
|
||||
rm -rf "$tmp_dir"
|
||||
while true; do
|
||||
ddns_dir=/etc/config/ddns
|
||||
tmp_dir="$TMPDIR"/ddns
|
||||
[ ! -f "$ddns_dir" ] && {
|
||||
btm_box "\033[31m本脚本依赖OpenWrt内置的DDNS服务,当前设备无法运行,已退出!\033[0m"
|
||||
sleep 1
|
||||
return 1
|
||||
}
|
||||
nr=0
|
||||
cat "$ddns_dir" | grep 'config service' | awk '{print $3}' | sed "s/'//g" | sed 's/"//g' >"$tmp_dir"
|
||||
separator_line "="
|
||||
content_line " 列表 域名 启用 IP地址"
|
||||
content_line ""
|
||||
[ -s "$tmp_dir" ] && for service in $(cat "$tmp_dir"); do
|
||||
# echo $service >>$tmp_dir
|
||||
nr=$((nr + 1))
|
||||
enabled=$(uci get ddns."$service".enabled 2>/dev/null)
|
||||
domain=$(uci get ddns."$service".domain 2>/dev/null)
|
||||
local_ip=$(sed '1!G;h;$!d' /var/log/ddns/"$service".log 2>/dev/null | grep -E 'Registered IP' | tail -1 | awk -F "'" '{print $2}' | tr -d "'\"")
|
||||
content_line "$nr) $domain $enabled $local_ip"
|
||||
done
|
||||
content_line "$((nr + 1))) 添加DDNS服务"
|
||||
content_line "0) 退出"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应序号> " num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
rm -rf "$tmp_dir"
|
||||
break
|
||||
elif [ "$num" -gt $nr ]; then
|
||||
set_ddns_type
|
||||
elif [ "$num" -gt 0 ] && [ "$num" -le $nr ]; then
|
||||
service=$(cat "$tmp_dir" | sed -n "$num"p)
|
||||
rev_ddns_service
|
||||
else
|
||||
msg_alert "\033[33m请输入正确数字!\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -4,231 +4,392 @@
|
||||
[ -n "$__IS_MODULE_DNS_LOADED" ] && return
|
||||
__IS_MODULE_DNS_LOADED=1
|
||||
|
||||
set_dns_mod() { #DNS模式设置
|
||||
[ -z "$hosts_opt" ] && hosts_opt=ON
|
||||
[ -z "$dns_protect" ] && dns_protect=ON
|
||||
[ -z "$ecs_subnet" ] && ecs_subnet=OFF
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "当前DNS运行模式为:\033[47;30m $dns_mod \033[0m"
|
||||
echo -e "\033[33m切换模式后需要手动重启服务以生效!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 MIX模式: \033[32mCN域名realip其他fake-ip分流\033[0m"
|
||||
echo -e " 2 Route模式:\033[32mCN域名realip其他dns2proxy分流\033[0m"
|
||||
echo -e " 3 Redir模式:\033[33m不安全,需搭配第三方DNS服务使用\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 4 DNS防泄漏: \033[36m$dns_protect\033[0m ———启用时少量网站可能连接卡顿"
|
||||
echo -e " 5 Hosts优化: \033[36m$hosts_opt\033[0m ———调用本机hosts并劫持NTP服务"
|
||||
echo -e " 6 ECS优化: \033[36m$ecs_subnet\033[0m ———解决CDN下载浪费流量等问题"
|
||||
echo -e " 7 DNS劫持端口:\033[36m$dns_redir_port\033[0m ———用于兼容第三方DNS服务"
|
||||
[ "$dns_mod" = "mix" ] &&
|
||||
echo -e " 8 管理MIX模式\033[33mFake-ip过滤列表\033[0m"
|
||||
echo -e " 9 修改\033[36mDNS服务器\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
1)
|
||||
if echo "$crashcore" | grep -q 'singbox' || [ "$crashcore" = meta ]; then
|
||||
dns_mod=mix
|
||||
setconfig dns_mod $dns_mod
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m已设为 $dns_mod 模式!!\033[0m"
|
||||
else
|
||||
echo -e "\033[31m当前内核不支持的功能!!!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
set_dns_mod
|
||||
;;
|
||||
2)
|
||||
if echo "$crashcore" | grep -q 'singbox' || [ "$crashcore" = meta ]; then
|
||||
dns_mod=route
|
||||
setconfig dns_mod $dns_mod
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m已设为 $dns_mod 模式!!\033[0m"
|
||||
else
|
||||
echo -e "\033[31m当前内核不支持的功能!!!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
set_dns_mod
|
||||
;;
|
||||
3)
|
||||
dns_mod=redir_host
|
||||
setconfig dns_mod $dns_mod
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m已设为 $dns_mod 模式!!\033[0m"
|
||||
set_dns_mod
|
||||
;;
|
||||
4)
|
||||
[ "$dns_protect" = "ON" ] && dns_protect=OFF || dns_protect=ON
|
||||
setconfig dns_protect $dns_protect
|
||||
set_dns_mod
|
||||
;;
|
||||
5)
|
||||
[ "$hosts_opt" = "ON" ] && hosts_opt=OFF || hosts_opt=ON
|
||||
setconfig hosts_opt $hosts_opt
|
||||
set_dns_mod
|
||||
;;
|
||||
6)
|
||||
[ "$ecs_subnet" = "ON" ] && ecs_subnet=OFF || ecs_subnet=ON
|
||||
setconfig ecs_subnet "$ecs_subnet"
|
||||
set_dns_mod
|
||||
;;
|
||||
7)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m仅限搭配第三方DNS服务(AdGuard、SmartDNS……)使用!\033[0m"
|
||||
echo -e "\033[33m设置为第三方DNS服务的监听端口即可修改防火墙劫持!\n建议在第三方DNS服务中将上游DNS指向【localhost:$dns_port】\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入第三方DNS服务的监听端口(0重置端口) > " num
|
||||
if [ "$num" = 0 ];then
|
||||
dns_redir_port="$dns_port"
|
||||
setconfig dns_redir_port
|
||||
elif [ "$num" -lt 65535 -a "$num" -ge 1 ];then
|
||||
if ckcmd netstat;then
|
||||
port_test=$(netstat -ntul | grep -E ":$num[[:space:]]")
|
||||
else
|
||||
port_test=0
|
||||
fi
|
||||
if [ -n "$port_test" ];then
|
||||
dns_redir_port="$num"
|
||||
setconfig dns_redir_port "$dns_redir_port"
|
||||
else
|
||||
echo -e "\033[33m此端口未检测到已运行的DNS服务!\033[0m"
|
||||
fi
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_mod
|
||||
;;
|
||||
8)
|
||||
echo "-----------------------------------------------"
|
||||
fake_ip_filter
|
||||
set_dns_mod
|
||||
;;
|
||||
9)
|
||||
set_dns_adv
|
||||
set_dns_mod
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
load_lang dns
|
||||
|
||||
# DNS 模式设置
|
||||
set_dns_mod() {
|
||||
while true; do
|
||||
[ -z "$hosts_opt" ] && hosts_opt=ON
|
||||
[ -z "$dns_protect" ] && dns_protect=ON
|
||||
[ -z "$ecs_subnet" ] && ecs_subnet=OFF
|
||||
comp_box "$DNS_CURRENT_MODE\033[47;30m $dns_mod \033[0m" \
|
||||
"\033[33m$DNS_RESTART_NOTICE\033[0m"
|
||||
content_line "1) 设为MIX$COMMON_MOD:\t\033[32m$DNS_MODE_MIX_DESC\033[0m"
|
||||
content_line "2) 设为Route$COMMON_MOD:\t\033[32m$DNS_MODE_ROUTE_DESC\033[0m"
|
||||
content_line "3) 设为Redir$COMMON_MOD:\t\033[33m$DNS_MODE_REDIR_DESC\033[0m"
|
||||
content_line ""
|
||||
content_line "4) $DNS_MENU_PROTECT:\t \033[36m$dns_protect\033[0m\t$DNS_PROTECT_DESC"
|
||||
content_line "5) $DNS_MENU_HOSTS:\t \033[36m$hosts_opt\033[0m\t$DNS_HOSTS_DESC"
|
||||
content_line "6) $DNS_MENU_ECS:\t \033[36m$ecs_subnet\033[0m\t$DNS_ECS_DESC"
|
||||
content_line "7) $DNS_MENU_REDIR:\033[36m$dns_redir_port\033[0m\t$DNS_REDIR_PORT_DESC"
|
||||
[ "$dns_mod" = "mix" ] &&
|
||||
content_line "8) \033[33m$DNS_FAKEIP_MENU\033[0m"
|
||||
content_line "9) \033[36m$DNS_ADV_MENU\033[0m"
|
||||
content_line ""
|
||||
content_line "0) $COMMON_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1 | 2)
|
||||
if echo "$crashcore" | grep -q 'singbox' || [ "$crashcore" = meta ]; then
|
||||
[ "$num" = 1 ] && dns_mod=mix || dns_mod=route
|
||||
setconfig dns_mod "$dns_mod"
|
||||
msg_alert "\033[36m$DNS_SET_OK:$dns_mod\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$DNS_CORE_UNSUPPORTED\033[0m"
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
dns_mod=redir_host
|
||||
setconfig dns_mod "$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 "当前\033[33m已启用\033[0mDNS防泄漏,是否确认禁用?"
|
||||
else
|
||||
content_line "当前\033[33m已禁用\033[0mDNS防泄漏,是否确认启用?"
|
||||
fi
|
||||
separator_line "="
|
||||
btm_box "1) 是" \
|
||||
"2) 重置为默认值" \
|
||||
"0) 否,返回上级菜单"
|
||||
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
|
||||
;;
|
||||
5)
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ "$hosts_opt" = ON ]; then
|
||||
content_line "当前\033[33m已启用\033[0mHosts优化,是否确认禁用?"
|
||||
else
|
||||
content_line "当前\033[33m已禁用\033[0mHosts优化,是否确认启用?"
|
||||
fi
|
||||
separator_line "="
|
||||
btm_box "1) 是" \
|
||||
"2) 重置为默认值" \
|
||||
"0) 否,返回上级菜单"
|
||||
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
|
||||
;;
|
||||
6)
|
||||
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ "$ecs_subnet" = ON ]; then
|
||||
content_line "当前\033[33m已启用\033[0mHosts优化,是否确认禁用?"
|
||||
else
|
||||
content_line "当前\033[33m已禁用\033[0mHosts优化,是否确认启用?"
|
||||
fi
|
||||
separator_line "="
|
||||
btm_box "1) 是" \
|
||||
"2) 重置为默认值" \
|
||||
"0) 否,返回上级菜单"
|
||||
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
|
||||
;;
|
||||
7)
|
||||
while true; do
|
||||
comp_box "\033[31m$DNS_REDIR_WARN\033[0m" \
|
||||
"\033[33m$DNS_REDIR_HINT 127.0.0.1:$dns_port\033[0m" \
|
||||
"" \
|
||||
"\033[36m请直接输入旁路由IPV4地址\033[0m" \
|
||||
"或输入 r 重置DNS劫持端口" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " num
|
||||
case "$num" in
|
||||
0)
|
||||
break
|
||||
;;
|
||||
r)
|
||||
dns_redir_port="$dns_port"
|
||||
setconfig dns_redir_port
|
||||
common_success
|
||||
break
|
||||
;;
|
||||
*)
|
||||
if [ "$num" -ge 1 ] && [ "$num" -lt 65535 ]; then
|
||||
if ckcmd netstat && netstat -ntul | grep -q ":$num "; then
|
||||
dns_redir_port="$num"
|
||||
setconfig dns_redir_port "$dns_redir_port"
|
||||
common_success
|
||||
break
|
||||
else
|
||||
msg_alert
|
||||
fi
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
8)
|
||||
fake_ip_filter
|
||||
;;
|
||||
9)
|
||||
set_dns_adv
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
fake_ip_filter() {
|
||||
echo -e "\033[32m用于解决Fake-ip模式下部分地址或应用无法连接的问题\033[0m"
|
||||
echo -e "\033[31m脚本已经内置了大量地址,你只需要添加出现问题的地址!\033[0m"
|
||||
echo -e "\033[36m示例:a.b.com"
|
||||
echo -e "示例:*.b.com"
|
||||
echo -e "示例:*.*.b.com\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
if [ -s ${CRASHDIR}/configs/fake_ip_filter ]; then
|
||||
echo -e "\033[33m已添加Fake-ip过滤地址:\033[0m"
|
||||
cat ${CRASHDIR}/configs/fake_ip_filter | awk '{print NR" "$1}'
|
||||
else
|
||||
echo -e "\033[33m你还未添加Fake-ip过滤地址\033[0m"
|
||||
fi
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m输入数字直接移除对应地址,输入地址直接添加!\033[0m"
|
||||
read -p "请输入数字或地址 > " input
|
||||
case "$input" in
|
||||
0) ;;
|
||||
'') ;;
|
||||
*)
|
||||
if [ $input -ge 1 ] 2>/dev/null; then
|
||||
sed -i "${input}d" ${CRASHDIR}/configs/fake_ip_filter 2>/dev/null
|
||||
echo -e "\033[32m移除成功!\033[0m"
|
||||
while true; do
|
||||
comp_box "\033[32m$DNS_FAKEIP_DESC\033[0m" \
|
||||
"\033[31m$DNS_FAKEIP_TIP\033[0m" \
|
||||
"\033[36m$DNS_FAKEIP_EXAMPLE\033[0m"
|
||||
if [ -s "$CRASHDIR/configs/fake_ip_filter" ]; then
|
||||
content_line "\033[33m$DNS_FAKEIP_EXIST\033[0m"
|
||||
content_line ""
|
||||
awk '{print NR") "$1}' "$CRASHDIR/configs/fake_ip_filter" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
else
|
||||
echo -e "你输入的地址是:\033[32m$input\033[0m"
|
||||
read -p "确认添加?(1/0) > " res
|
||||
[ "$res" = 1 ] && echo $input >>${CRASHDIR}/configs/fake_ip_filter
|
||||
content_line "\033[33m$DNS_FAKEIP_EMPTY\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
fake_ip_filter
|
||||
;;
|
||||
esac
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "$DNS_FAKEIP_EDIT> " input
|
||||
case "$input" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
*)
|
||||
if [ "$input" -ge 1 ] 2>/dev/null; then
|
||||
if sed -i "${input}d" "$CRASHDIR/configs/fake_ip_filter"; then
|
||||
msg_alert "\033[32m移除成功\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m移除失败\033[0m"
|
||||
fi
|
||||
else
|
||||
comp_box "请确认需要添加的地址:\033[32m$input\033[0m"
|
||||
btm_box "1) 确认无误" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT>" res
|
||||
if [ "$res" = 1 ]; then
|
||||
if echo "$input" >>"$CRASHDIR/configs/fake_ip_filter"; then
|
||||
msg_alert "\033[32m添加成功\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m添加失败\033[0m"
|
||||
fi
|
||||
else
|
||||
break
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
set_dns_adv() { #DNS详细设置
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "当前基础DNS:\033[32m$dns_nameserver\033[0m"
|
||||
echo -e "PROXY-DNS:\033[36m$dns_fallback\033[0m"
|
||||
echo -e "解析DNS:\033[33m$dns_resolver\033[0m"
|
||||
echo -e "多个DNS地址请用\033[30;47m“|”\033[0m或者\033[30;47m“, ”\033[0m分隔输入"
|
||||
echo -e "\033[33m必须拥有本地根证书文件才能使用dot/doh类型的加密dns\033[0m"
|
||||
echo -e "\033[31m注意singbox内核只有首个dns会被加载!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 修改\033[32m基础DNS\033[0m"
|
||||
echo -e " 2 修改\033[36mPROXY-DNS\033[0m(该DNS查询会经过节点)"
|
||||
echo -e " 3 修改\033[33m解析DNS\033[0m(必须是IP,用于解析其他DNS)"
|
||||
echo -e " 4 一键配置\033[32m加密DNS\033[0m"
|
||||
echo -e " 9 \033[33m重置\033[0m默认DNS配置"
|
||||
echo -e " 0 返回上级菜单"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
1)
|
||||
read -p "请输入新的DNS > " dns_nameserver
|
||||
dns_nameserver=$(echo $dns_nameserver | sed 's#|#\,\ #g')
|
||||
if [ -n "$dns_nameserver" ]; then
|
||||
setconfig dns_nameserver "'$dns_nameserver'"
|
||||
echo -e "\033[32m设置成功!!!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
2)
|
||||
read -p "请输入新的DNS > " dns_fallback
|
||||
dns_fallback=$(echo $dns_fallback | sed 's/|/\,\ /g')
|
||||
if [ -n "$dns_fallback" ]; then
|
||||
setconfig dns_fallback "'$dns_fallback'"
|
||||
echo -e "\033[32m设置成功!!!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
3)
|
||||
read -p "请输入新的DNS > " text
|
||||
if echo "$text" | grep -qE '://.*::'; then
|
||||
echo -e "\033[31m此选项暂不支持ipv6加密DNS!!!\033[0m"
|
||||
elif [ -n "$text" ]; then
|
||||
dns_resolver=$(echo $text | sed 's/|/\,\ /g')
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
echo -e "\033[32m设置成功!!!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
openssldir="$(openssl version -d 2>&1 | awk -F '"' '{print $2}')"
|
||||
if [ -s "$openssldir/certs/ca-certificates.crt" ] || [ -s "/etc/ssl/certs/ca-certificates.crt" ] ||
|
||||
echo "$crashcore" | grep -qE 'meta|singbox'; then
|
||||
dns_nameserver='https://dns.alidns.com/dns-query, https://doh.pub/dns-query'
|
||||
dns_fallback='https://cloudflare-dns.com/dns-query, https://dns.google/dns-query, https://doh.opendns.com/dns-query'
|
||||
dns_resolver='https://223.5.5.5/dns-query, 2400:3200::1'
|
||||
setconfig dns_nameserver "'$dns_nameserver'"
|
||||
setconfig dns_fallback "'$dns_fallback'"
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
echo -e "\033[32m已设置加密DNS,如出现DNS解析问题,请尝试重置DNS配置!\033[0m"
|
||||
else
|
||||
echo -e "\033[31m找不到根证书文件,无法启用加密DNS,Linux系统请自行搜索安装OpenSSL的方式!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
9)
|
||||
setconfig dns_nameserver
|
||||
setconfig dns_fallback
|
||||
setconfig dns_resolver
|
||||
. "$CRASHDIR"/libs/get_config.sh
|
||||
echo -e "\033[33mDNS配置已重置!!!\033[0m"
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# DNS详细设置
|
||||
set_dns_adv() {
|
||||
while true; do
|
||||
comp_box "\033[31m$DNS_ADV_SINGBOX_LIMIT\033[0m" \
|
||||
"$DNS_ADV_SPLIT" \
|
||||
"\033[33m$DNS_ADV_CERT\033[0m" \
|
||||
"" \
|
||||
"DIRECT-DNS:" \
|
||||
"\033[32m$dns_nameserver\033[0m" \
|
||||
"" \
|
||||
"PROXY-DNS:" \
|
||||
"\033[36m$dns_fallback\033[0m" \
|
||||
"" \
|
||||
"DEFAULT-DNS:" \
|
||||
"\033[33m$dns_resolver\033[0m" \
|
||||
""
|
||||
btm_box "1) $DNS_ADV_EDIT_DIRECT" \
|
||||
"2) $DNS_ADV_EDIT_PROXY" \
|
||||
"3) $DNS_ADV_EDIT_DEFAULT" \
|
||||
"4) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m" \
|
||||
"9) \033[33m$DNS_ADV_RESET\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
comp_box "当前DIRECT-DNS:\033[32m$dns_nameserver\033[0m"
|
||||
btm_box "\033[36m请直接输入新的DIRECT-DNS地址\033[0m" \
|
||||
"或输入 r 重置DIRECT-DNS地址" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " res
|
||||
case "$res" in
|
||||
0)
|
||||
continue
|
||||
;;
|
||||
r)
|
||||
dns_nameserver="127.0.0.1"
|
||||
setconfig dns_nameserver "'$dns_nameserver'"
|
||||
common_success
|
||||
;;
|
||||
*)
|
||||
dns_nameserver=$(echo "$res" | sed 's#|#,\ #g')
|
||||
if [ -n "$dns_nameserver" ]; then
|
||||
setconfig dns_nameserver "'$dns_nameserver'"
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
2)
|
||||
comp_box "当前PROXY-DNS:\033[32m$dns_fallback\033[0m"
|
||||
btm_box "\033[36m请直接输入新的PROXY-DNS地址\033[0m" \
|
||||
"或输入 r 重置PROXY-DNS地址" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " res
|
||||
case "$res" in
|
||||
0)
|
||||
continue
|
||||
;;
|
||||
r)
|
||||
dns_fallback="1.1.1.1, 8.8.8.8"
|
||||
setconfig dns_fallback "'$dns_fallback'"
|
||||
common_success
|
||||
;;
|
||||
*)
|
||||
dns_fallback=$(echo "$res" | sed 's#|#,\ #g')
|
||||
if [ -n "$dns_fallback" ]; then
|
||||
setconfig dns_fallback "'$dns_fallback'"
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
comp_box "当前DEFAULT-DNS:\033[32m$dns_resolver\033[0m"
|
||||
btm_box "\033[36m请直接输入新的DEFAULT-DNS地址\033[0m" \
|
||||
"或输入 r 重置DEFAULT-DNS地址" \
|
||||
"或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入> " res
|
||||
case "$res" in
|
||||
0)
|
||||
continue
|
||||
;;
|
||||
"r")
|
||||
dns_resolver="223.5.5.5, 2400:3200::1"
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
common_failed
|
||||
;;
|
||||
*)
|
||||
if echo "$res" | grep -qE '://.*::'; then
|
||||
msg_alert "\033[31m$DNS_IPV6_NOT_SUPPORT\033[0m"
|
||||
else
|
||||
dns_resolver=$(echo "$res" | sed 's#|#,\ #g')
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
4)
|
||||
line_break
|
||||
separator_line "="
|
||||
if echo "$crashcore" | grep -qE 'meta|singbox'; then
|
||||
dns_nameserver='https://dns.alidns.com/dns-query, https://doh.pub/dns-query'
|
||||
dns_fallback='https://cloudflare-dns.com/dns-query, https://dns.google/dns-query, https://doh.opendns.com/dns-query'
|
||||
dns_resolver='https://223.5.5.5/dns-query, 2400:3200::1'
|
||||
setconfig dns_nameserver "'$dns_nameserver'"
|
||||
setconfig dns_fallback "'$dns_fallback'"
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
content_line "\033[32m$DNS_ENCRYPT_OK\033[0m"
|
||||
else
|
||||
content_line "\033[31m$DNS_CORE_REQUIRE\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
;;
|
||||
9)
|
||||
setconfig dns_nameserver
|
||||
setconfig dns_fallback
|
||||
setconfig dns_resolver
|
||||
. "$CRASHDIR/libs/get_config.sh"
|
||||
common_success
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
502
scripts/menus/fw_filter.sh
Normal file
502
scripts/menus/fw_filter.sh
Normal file
@@ -0,0 +1,502 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_MODULE_FW_FILTER_LOADED" ] && return
|
||||
__IS_MODULE_FW_FILTER_LOADED=1
|
||||
|
||||
# 流量过滤
|
||||
set_fw_filter() {
|
||||
while true; do
|
||||
[ -z "$common_ports" ] && common_ports=ON
|
||||
[ -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网段:需要以保留地址为访问目标的环境" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ -n "$(pidof CrashCore)" ] && [ "$firewall_mod" = 'iptables' ]; then
|
||||
comp_box "切换时将停止服务,是否继续:"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && "$CRASHDIR"/start.sh stop && set_common_ports
|
||||
else
|
||||
set_common_ports
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
checkcfg_mac=$(cat "$CRASHDIR"/configs/mac)
|
||||
fw_filter_lan
|
||||
if [ -n "$PID" ]; then
|
||||
checkcfg_mac_new=$(cat "$CRASHDIR"/configs/mac)
|
||||
[ "$checkcfg_mac" != "$checkcfg_mac_new" ] && checkrestart
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
if [ "$quic_rj" = "OFF" ]; then
|
||||
quic_rj=ON
|
||||
msg_alert "\033[33m已禁止QUIC流量通过ShellCrash内核!\033[0m"
|
||||
else
|
||||
quic_rj=OFF
|
||||
msg_alert "\033[33m已取消禁止QUIC协议流量!\033[0m"
|
||||
fi
|
||||
setconfig quic_rj $quic_rj
|
||||
;;
|
||||
4)
|
||||
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"
|
||||
else
|
||||
cn_ip_route=OFF
|
||||
msg_alert "\033[33m已禁用CN_IP绕过内核功能!\033[0m"
|
||||
fi
|
||||
setconfig cn_ip_route $cn_ip_route
|
||||
else
|
||||
msg_alert "\033[31m当前设备缺少ipset模块或未使用nftables模式,无法启用绕过功能!\033[0m"
|
||||
fi
|
||||
;;
|
||||
5)
|
||||
set_cust_host_ipv4
|
||||
;;
|
||||
6)
|
||||
set_reserve_ipv4
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
set_common_ports() {
|
||||
while true; do
|
||||
[ -z "$multiport" ] && multiport='22,80,443,8080,8443'
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\n\033[0mMIX模式下,所有fake-ip来源的非常用端口流量不会被过滤"
|
||||
if [ -n "$common_ports" ]; then
|
||||
content_line ""
|
||||
content_line "当前已放行端口:\033[36m$multiport\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
btm_box "1) 启用/关闭端口过滤: \033[36m$common_ports\033[0m" \
|
||||
"2) 添加放行端口" \
|
||||
"3) 移除指定放行端口" \
|
||||
"4) 重置默认放行端口" \
|
||||
"5) 重置为旧版放行端口" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ "$common_ports" = ON ]; then
|
||||
common_ports=OFF
|
||||
else
|
||||
common_ports=ON
|
||||
fi
|
||||
|
||||
if setconfig common_ports "$common_ports"; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
while true; do
|
||||
port_count=$(echo "$multiport" | awk -F',' '{print NF}')
|
||||
if [ "$port_count" -ge 15 ]; then
|
||||
comp_box "\033[31m最多支持设置放行15个端口,请先减少一些!\033[0m"
|
||||
else
|
||||
comp_box "当前已放行端口:\033[36m$multiport\033[0m"
|
||||
btm_box "\033[36m请直接输入要放行的端口号\033[0m\n(每次只能输入一个端口号,切勿一次添加多个端口号)" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " port
|
||||
if [ "$port" = 0 ]; then
|
||||
break
|
||||
elif echo ",$multiport," | grep -q ",$port,"; then
|
||||
msg_alert "\033[31m输入错误!请勿重复添加!\033[0m"
|
||||
elif [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
msg_alert "\033[31m输入错误!请输入正确的数值(1~65535)!\033[0m"
|
||||
else
|
||||
multiport=$(echo "$multiport,$port" | sed "s/^,//")
|
||||
|
||||
if setconfig multiport "$multiport"; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
;;
|
||||
3)
|
||||
while true; do
|
||||
comp_box "当前已放行端口:\033[36m$multiport\033[0m"
|
||||
btm_box "\033[36m请直接输入要移除的端口号\033[0m\n(每次只能输入一个端口号,切勿一次添加多个端口号)" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " 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"
|
||||
else
|
||||
multiport=$(echo ",$multiport," | sed "s/,$port//; s/^,//; s/,$//")
|
||||
if setconfig multiport "$multiport"; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入错误!请输入已添加过的端口!\033[0m"
|
||||
fi
|
||||
done
|
||||
;;
|
||||
4)
|
||||
multiport=''
|
||||
if setconfig multiport; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
;;
|
||||
5)
|
||||
multiport='22,80,143,194,443,465,587,853,993,995,5222,8080,8443'
|
||||
if setconfig multiport "$multiport"; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 自定义ipv4透明路由、保留地址网段
|
||||
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" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应的序号或需要额外添加的网段> " text
|
||||
case "$text" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
unset cust_host_ipv4
|
||||
if setconfig cust_host_ipv4; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
if [ "$replace_default_host_ipv4" = "OFF" ]; then
|
||||
replace_default_host_ipv4="ON"
|
||||
else
|
||||
replace_default_host_ipv4="OFF"
|
||||
fi
|
||||
|
||||
if setconfig replace_default_host_ipv4 "$replace_default_host_ipv4"; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if echo "$text" | grep -Eq '^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}' && [ -z "$(echo $cust_host_ipv4 | grep "$text")" ]; then
|
||||
cust_host_ipv4="$cust_host_ipv4 $text"
|
||||
if setconfig cust_host_ipv4 "'$cust_host_ipv4'"; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m请输入正确的网段地址!\033[0m"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
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" \
|
||||
"" \
|
||||
"当前网段:" \
|
||||
"\033[36m$reserve_ipv4\033[0m"
|
||||
btm_box "\033[36m请直接输入自定义保留地址ipv4网段\033[0m" \
|
||||
"或输入 1 重置默认网段" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " text
|
||||
case "$text" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
unset reserve_ipv4
|
||||
if setconfig reserve_ipv4; then
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
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"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\033[0m"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 局域网设备过滤
|
||||
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='未知设备'
|
||||
}
|
||||
add_mac() {
|
||||
while true; do
|
||||
comp_box "手动输入mac地址时仅支持\033[32mxx:xx:xx:xx:xx:xx\033[0m的形式"
|
||||
content_line "已添加的mac地址:"
|
||||
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地址"
|
||||
fi
|
||||
separator_line "="
|
||||
content_line "序号 \033[33m设备IP 设备mac地址 设备名称\033[0m"
|
||||
if [ -s "$dhcpdir" ]; then
|
||||
awk '{print NR") "$3,$2,$4}' "$dhcpdir" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
else
|
||||
content_line "无纪录"
|
||||
fi
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应序号或直接输入mac地址> " num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
break
|
||||
elif echo "$num" | grep -aEq '^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$'; then
|
||||
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"
|
||||
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"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\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地址(段):"
|
||||
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地址(段)"
|
||||
fi
|
||||
|
||||
separator_line "="
|
||||
content_line "\033[33m序号 设备IP 设备名称\033[32m"
|
||||
if [ -s "$dhcpdir" ]; then
|
||||
awk '{print NR") "$3, $4}' "$dhcpdir" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
else
|
||||
content_line "无纪录"
|
||||
fi
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应序号或直接输入IP地址段> " num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
break
|
||||
elif echo "$num" | grep -aEq '^((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]))?$'; then
|
||||
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"
|
||||
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"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
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"
|
||||
break
|
||||
else
|
||||
comp_box "请选择需要移除的设备:"
|
||||
content_line " \033[32m设备IP \033[36m设备mac地址 \033[35m设备名称\033[0m"
|
||||
i=1
|
||||
for dev in $(cat "$CRASHDIR"/configs/mac "$CRASHDIR"/configs/ip_filter 2>/dev/null); do
|
||||
get_devinfo
|
||||
content_line "$(printf "%s) \033[32m%-18s \033[36m%-18s \033[35m%s\033[0m" \
|
||||
"$i" "$dev_ip" "$dev_mac" "$dev_name")"
|
||||
i=$((i + 1))
|
||||
done
|
||||
btm_box "" \
|
||||
"0) $COMMON_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)
|
||||
if [ -z "$num" ] || [ "$num" -le 0 ]; then
|
||||
n=
|
||||
break
|
||||
elif [ "$num" -le "$mac_filter_rows" ]; then
|
||||
sed -i "${num}d" "$CRASHDIR"/configs/mac
|
||||
msg_alert "\033[32m对应设备已移除!\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"
|
||||
else
|
||||
msg_alert "\033[31m输入有误,请重新输入!\033[0m"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
while true; do
|
||||
[ -z "$dhcpdir" ] && [ -f /var/lib/dhcp/dhcpd.leases ] && dhcpdir='/var/lib/dhcp/dhcpd.leases'
|
||||
[ -z "$dhcpdir" ] && [ -f /var/lib/dhcpd/dhcpd.leases ] && dhcpdir='/var/lib/dhcpd/dhcpd.leases'
|
||||
[ -z "$dhcpdir" ] && [ -f /tmp/dhcp.leases ] && dhcpdir='/tmp/dhcp.leases'
|
||||
[ -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='不'
|
||||
else
|
||||
fw_filter_lan_over='黑名单'
|
||||
fw_filter_lan_scrip=''
|
||||
fi
|
||||
|
||||
comp_box "\033[30;47m请在此添加或移除设备\033[0m" \
|
||||
"" \
|
||||
"当前过滤方式为:\033[33m$macfilter_type模式\033[0m" \
|
||||
"仅列表内设备流量\033[36m$fw_filter_lan_scrip经过\033[0m内核"
|
||||
if [ -n "$(cat "$CRASHDIR"/configs/mac)" ]; then
|
||||
content_line "当前已过滤设备为:"
|
||||
content_line ""
|
||||
content_line " \033[36m设备mac/ip地址\033[0m \033[35m设备名称\033[0m"
|
||||
for dev in $(cat "$CRASHDIR"/configs/mac 2>/dev/null); do
|
||||
get_devinfo
|
||||
content_line "$(printf "\033[36m%-20s \033[35m%s\033[0m" \
|
||||
"$dev_mac" "$dev_name")"
|
||||
done
|
||||
for dev in $(cat "$CRASHDIR"/configs/ip_filter 2>/dev/null); do
|
||||
get_devinfo
|
||||
content_line "$(printf "\033[36m%-20s \033[35m%s\033[0m" \
|
||||
"$dev_ip" "$dev_name")"
|
||||
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" \
|
||||
"" \
|
||||
"0) $COMMON_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"
|
||||
else
|
||||
msg_alert "\033[31m$COMMON_FAILED\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
add_mac
|
||||
;;
|
||||
3)
|
||||
add_ip
|
||||
;;
|
||||
4)
|
||||
del_all
|
||||
;;
|
||||
9)
|
||||
: >"$CRASHDIR"/configs/mac
|
||||
: >"$CRASHDIR"/configs/ip_filter
|
||||
msg_alert "\033[31m设备列表已清空!\033[0m"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
550
scripts/menus/override.sh
Normal file
550
scripts/menus/override.sh
Normal file
@@ -0,0 +1,550 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_MODULE_OVERRIDE" ] && return
|
||||
__IS_MODULE_OVERRIDE=1
|
||||
|
||||
YAMLSDIR="$CRASHDIR"/yamls
|
||||
JSONSDIR="$CRASHDIR"/jsons
|
||||
|
||||
# 配置文件覆写
|
||||
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"
|
||||
echo "$crashcore" | grep -q 'singbox' || {
|
||||
content_line "3) 管理\033[33m自定义节点\033[0m"
|
||||
content_line "4) 管理\033[36m自定义策略组\033[0m"
|
||||
}
|
||||
content_line "5) \033[32m自定义\033[0m高级功能"
|
||||
[ "$disoverride" != 1 ] && content_line "9) \033[33m禁用\033[0m配置文件覆写"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
2)
|
||||
setrules
|
||||
;;
|
||||
3)
|
||||
setproxies
|
||||
;;
|
||||
4)
|
||||
setgroups
|
||||
;;
|
||||
5)
|
||||
if echo "$crashcore" | grep -q 'singbox'; then
|
||||
set_singbox_adv
|
||||
else
|
||||
set_clash_adv
|
||||
fi
|
||||
sleep 3
|
||||
;;
|
||||
9)
|
||||
comp_box "\033[33m此功能可能会导致严重问题!启用后脚本中大部分功能都将禁用!!!\033[0m" \
|
||||
"如果你不是非常了解$crashcore的运行机制,切勿开启!\033[0m" \
|
||||
"\033[33m继续后如出现任何问题,请务必自行解决,一切提问恕不受理!\033[0m"
|
||||
sleep 2
|
||||
btm_box "1) 我确认遇到问题可以自行解决" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = '1' ] && {
|
||||
disoverride=1
|
||||
if setconfig disoverride $disoverride; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
}
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 自定义规则
|
||||
setrules() {
|
||||
set_rule_type() {
|
||||
comp_box "\033[33m请选择规则类型:\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
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
[0-9]*)
|
||||
if [ "$num" -gt $(echo $rule_type | awk -F " " '{print NF}') ]; then
|
||||
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
|
||||
if [ -n "$rule_state_set" ]; then
|
||||
set_group_type
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
set_group_type() {
|
||||
comp_box "\033[36m请选择具体规则\033[0m" \
|
||||
"\033[33m此处规则读取自现有配置文件,如果你后续更换配置文件时运行出错,请尝试重新添加\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
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
[0-9]*)
|
||||
if [ "$num" -gt "$(echo "$rule_group" | awk -F "#" '{print NF}')" ]; then
|
||||
errornum
|
||||
else
|
||||
rule_group_set=$(echo "$rule_group" | cut -d'#' -f"$num")
|
||||
rule_all="- ${rule_type_set},${rule_state_set},${rule_group_set}"
|
||||
echo "IP-CIDR SRC-IP-CIDR IP-CIDR6" | grep -q -- "$rule_type_set" && rule_all="${rule_all},no-resolve"
|
||||
echo "$rule_all" >>"$YAMLSDIR"/rules.yaml
|
||||
msg_alert "\033[32m添加成功!\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
del_rule_type() {
|
||||
while true; do
|
||||
comp_box "输入对应数字即可移除相应规则:"
|
||||
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
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
*)
|
||||
if [ "$num" -le "$(wc -l <"$YAMLSDIR"/rules.yaml)" ]; then
|
||||
if sed -i "${num}d" "$YAMLSDIR"/rules.yaml; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
sleep 1
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
get_rule_group() {
|
||||
. "$CRASHDIR"/libs/web_save.sh
|
||||
get_save http://127.0.0.1:${db_port}/proxies | sed 's/:{/!/g' | awk -F '!' '{for(i=1;i<=NF;i++) print $i}' | grep -aE '"Selector|URLTest|LoadBalance"' | grep -aoE '"name":.*"now":".*",' | awk -F '"' '{print "#"$4}' | tr -d '\n'
|
||||
}
|
||||
|
||||
while true; do
|
||||
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"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
rule_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN PROCESS-NAME"
|
||||
rule_group="DIRECT#REJECT$(get_rule_group)"
|
||||
set_rule_type
|
||||
;;
|
||||
2)
|
||||
if [ -s "$YAMLSDIR"/rules.yaml ]; then
|
||||
del_rule_type
|
||||
else
|
||||
msg_alert "请先添加自定义规则!"
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
comp_box "是否确认清空全部自定义规则?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if sed -i '/^\s*[^#]/d' "$YAMLSDIR"/rules.yaml; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
if [ "$proxies_bypass" = "OFF" ]; then
|
||||
comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" \
|
||||
"\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" \
|
||||
"" \
|
||||
"是否启用节点绕过?"
|
||||
btm_box
|
||||
"1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
proxies_bypass=ON
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
proxies_bypass=OFF
|
||||
fi
|
||||
|
||||
if setconfig proxies_bypass "$proxies_bypass"; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 自定义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[32m请选择策略组【$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
|
||||
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
|
||||
[ -z "$new_group_url" ] && new_group_url=https://www.gstatic.com/generate_204
|
||||
new_group_url="url: '$new_group_url'"
|
||||
interval="interval: 300"
|
||||
fi
|
||||
set_group_add
|
||||
# 添加自定义策略组
|
||||
cat >>"$YAMLSDIR"/proxy-groups.yaml <<EOF
|
||||
- name: $new_group_name
|
||||
type: $new_group_type
|
||||
$new_group_url
|
||||
$interval
|
||||
proxies:
|
||||
- DIRECT
|
||||
EOF
|
||||
sed -i "/^ *$/d" "$YAMLSDIR"/proxy-groups.yaml
|
||||
msg_alert "\033[32m添加成功!\033[0m"
|
||||
|
||||
}
|
||||
|
||||
set_group_add() {
|
||||
comp_box "\033[36m请选择想要将本策略添加到的策略组\033[0m" \
|
||||
"\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\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) 跳过添加"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应数字(多个用空格分隔)> " char
|
||||
case "$char" in
|
||||
"" | 0) ;;
|
||||
*)
|
||||
for num in $char; do
|
||||
rule_group_set=$(echo "$proxy_group" | cut -d'#' -f"$num")
|
||||
rule_group_add="${rule_group_add}#${rule_group_set}"
|
||||
done
|
||||
if [ -n "$rule_group_add" ]; then
|
||||
new_group_name="$new_group_name$rule_group_add"
|
||||
unset rule_group_add
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
while true; do
|
||||
comp_box "\033[33m你可以在这里快捷管理自定义策略组\033[0m" \
|
||||
"\033[36m如需修改或批量操作,请手动编辑:$YAMLSDIR/proxy-groups.yaml\033[0m"
|
||||
btm_box "1) 添加自定义策略组" \
|
||||
"2) 查看自定义策略组" \
|
||||
"3) 清空自定义策略组" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
group_type="select url-test fallback load-balance"
|
||||
group_type_cn="手动选择 自动选择 故障转移 负载均衡"
|
||||
proxy_group="$(cat "$YAMLSDIR"/proxy-groups.yaml "$YAMLSDIR"/config.yaml 2>/dev/null | sed "/#自定义策略组开始/,/#自定义策略组结束/d" | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/#.*//' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')"
|
||||
set_group_type
|
||||
;;
|
||||
2)
|
||||
line_break
|
||||
echo "==========================================================="
|
||||
cat "$YAMLSDIR"/proxy-groups.yaml
|
||||
echo ""
|
||||
echo "==========================================================="
|
||||
;;
|
||||
3)
|
||||
comp_box "是否确认清空全部自定义策略组?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if echo '#用于添加自定义策略组' >"$YAMLSDIR"/proxy-groups.yaml; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 自定义clash节点
|
||||
setproxies() {
|
||||
|
||||
set_proxy_type() {
|
||||
while true; do
|
||||
comp_box "\033[33m注意\n节点格式必须是单行、不包括括号、“name:”为开头,例如:\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
|
||||
if [ "$proxy_state_set" = 0 ]; then
|
||||
break
|
||||
elif echo "$proxy_state_set" | grep -q "#"; then
|
||||
msg_alert "\033[33m绝对禁止包含【#】号!\033[0m"
|
||||
elif echo "$proxy_state_set" | grep -Eq "^name:"; then
|
||||
set_group_add
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
set_group_add() {
|
||||
comp_box "\033[36m请选择想要将节点添加到的策略组\033[0m" \
|
||||
"\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m" \
|
||||
"\033[33m如需自定义策略组,请先使用【管理自定义策略组功能】添加\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
|
||||
case "$char" in
|
||||
"" | 0) ;;
|
||||
*)
|
||||
for num in $char; do
|
||||
rule_group_set=$(echo "$proxy_group" | cut -d'#' -f"$num")
|
||||
rule_group_add="${rule_group_add}#${rule_group_set}"
|
||||
done
|
||||
if [ -n "$rule_group_add" ]; then
|
||||
echo "- {$proxy_state_set}$rule_group_add" >>"$YAMLSDIR"/proxies.yaml
|
||||
msg_alert "\033[32m添加成功!\033[0m"
|
||||
unset rule_group_add
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
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" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
proxy_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN MATCH"
|
||||
proxy_group="$(cat "$YAMLSDIR"/proxy-groups.yaml "$YAMLSDIR"/config.yaml 2>/dev/null | sed "/#自定义策略组开始/,/#自定义策略组结束/d" | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/#.*//' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')"
|
||||
set_proxy_type
|
||||
;;
|
||||
2)
|
||||
sed -i '/^ *$/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null
|
||||
if [ -s "$YAMLSDIR"/proxies.yaml ]; then
|
||||
comp_box "\033[33m输入节点对应数字可以移除对应节点\033[0m" \
|
||||
"当前已添加的自定义节点为:"
|
||||
grep -Ev '^#' "$YAMLSDIR/proxies.yaml" |
|
||||
awk -F '[,}]' '{print NR") " $1 " " $NF}' |
|
||||
sed 's/- {//g' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
btm_box "" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
if [ "$num" = 0 ]; then
|
||||
continue
|
||||
elif [ "$num" -le $(cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | wc -l) ]; then
|
||||
if sed -i "$num{/^\s*[^#]/d}" "$YAMLSDIR"/proxies.yaml; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
else
|
||||
msg_alert "请先添加自定义节点!"
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
comp_box "是否确认清空全部自定义节点?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if sed -i '/^\s*[^#]/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
if [ "$proxies_bypass" = "OFF" ]; then
|
||||
comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m" \
|
||||
"\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m" \
|
||||
"" \
|
||||
"是否确定启用节点绕过:"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,返回上级菜单"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
proxies_bypass=ON
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
proxies_bypass=OFF
|
||||
fi
|
||||
setconfig proxies_bypass "$proxies_bypass"
|
||||
sleep 1
|
||||
setrules
|
||||
break
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 自定义clash高级规则
|
||||
set_clash_adv() {
|
||||
[ ! -f "$YAMLSDIR"/user.yaml ] && cat >"$YAMLSDIR"/user.yaml <<EOF
|
||||
#用于编写自定义设定(可参考https://lancellc.gitbook.io/clash/clash-config-file/general 或 https://docs.metacubex.one/function/general)
|
||||
#端口之类请在脚本中修改,否则不会加载
|
||||
#port: 7890
|
||||
EOF
|
||||
[ ! -f "$YAMLSDIR"/others.yaml ] && cat >"$YAMLSDIR"/others.yaml <<EOF
|
||||
#用于编写自定义的锚点、入站、proxy-providers、sub-rules、rule-set、script等功能
|
||||
#可参考 https://github.com/MetaCubeX/Clash.Meta/blob/Meta/docs/config.yaml 或 https://lancellc.gitbook.io/clash/clash-config-file/an-example-configuration-file
|
||||
#此处内容会被添加在配置文件的“proxy-group:”模块的末尾与“rules:”模块之前的位置
|
||||
#例如:
|
||||
#proxy-providers:
|
||||
#rule-providers:
|
||||
#sub-rules:
|
||||
#tunnels:
|
||||
#script:
|
||||
#listeners:
|
||||
EOF
|
||||
|
||||
comp_box "\033[32m已经创建自定义设定文件:$YAMLSDIR/user.yaml !\033[0m" \
|
||||
"\033[33m可用于编写自定义的DNS等功能\033[0m" \
|
||||
"" \
|
||||
"\033[32m已经创建自定义功能文件:$YAMLSDIR/others.yaml !\033[0m" \
|
||||
"\033[33m可用于编写自定义的锚点、入站、proxy-providers、rule-set、sub-rules、script等功能\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"
|
||||
}
|
||||
|
||||
# s自定义singbox配置文件
|
||||
set_singbox_adv() {
|
||||
comp_box "支持覆盖脚本设置的模块有:\033[0m" \
|
||||
"\033[36mlog dns ntp certificate experimental\033[0m" \
|
||||
"支持与内置功能合并(但不可冲突)的模块有:\033[0m" \
|
||||
"\033[36mendpoints inbounds outbounds providers route services\033[0m" \
|
||||
"将相应json文件放入\033[33m$JSONSDIR\033[0m目录后即可在启动时自动加载" \
|
||||
"" \
|
||||
"使用前请务必参考配置教程:\033[32;4m https://juewuy.github.io/nWTjEpkSK \033[0m"
|
||||
}
|
||||
103
scripts/menus/providers.sh
Normal file
103
scripts/menus/providers.sh
Normal file
@@ -0,0 +1,103 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_MODULE_PROVIDERS" ] && return
|
||||
__IS_MODULE_PROVIDERS=1
|
||||
|
||||
if [ "$crashcore" = singboxr ]; then
|
||||
CORE_TYPE=singbox
|
||||
else
|
||||
CORE_TYPE=clash
|
||||
fi
|
||||
|
||||
providers() {
|
||||
while true; do
|
||||
# 获取模版名称
|
||||
if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ]; then
|
||||
provider_temp_des=$(sed -n "1 p" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list | awk '{print $1}')
|
||||
else
|
||||
provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}')
|
||||
provider_temp_des=$(grep "$provider_temp_file" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list | awk '{print $1}')
|
||||
[ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file
|
||||
fi
|
||||
|
||||
comp_box "1) \033[32m生成\033[0m包含全部提供者的配置文件" \
|
||||
"2) 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" \
|
||||
"3) \033[33m清理\033[0mproviders目录文件" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应字母或数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ]; then
|
||||
. "$CRASHDIR/menus/providers_$CORE_TYPE.sh"
|
||||
gen_providers
|
||||
else
|
||||
msg_alert "\033[31m你还未添加链接或本地配置文件,请先添加!\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
list=$(cat "$CRASHDIR/configs/${CORE_TYPE}_providers.list" | awk '{print $1}')
|
||||
|
||||
comp_box "当前规则模版为:\033[32m$provider_temp_des\033[0m" \
|
||||
"\033[33m请选择在线模版:\033[0m"
|
||||
list_box "$list"
|
||||
btm_box "" \
|
||||
"a) 使用\033[36m本地模版\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应字母或数字> " num
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
a)
|
||||
line_break
|
||||
read -r -p "请输入模版的路径(绝对路径)> " dir
|
||||
if [ -s "$dir" ]; then
|
||||
provider_temp_file=$dir
|
||||
if setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入错误,找不到对应模版文件!\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list 2>/dev/null | awk '{print $2}')
|
||||
if [ -z "$provider_temp_file" ]; then
|
||||
errornum
|
||||
else
|
||||
if setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
comp_box "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" \
|
||||
"" \
|
||||
"是否继续?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if rm -rf "$CRASHDIR"/providers; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
125
scripts/menus/providers_clash.sh
Normal file
125
scripts/menus/providers_clash.sh
Normal file
@@ -0,0 +1,125 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_PROVIDERS_CLASH" ] && return
|
||||
__IS_PROVIDERS_CLASH=1
|
||||
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
|
||||
# 生成clash的providers配置文件
|
||||
gen_providers() {
|
||||
if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ]; then
|
||||
provider_temp_file="$(sed -n "1 p" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list | awk '{print $2}')"
|
||||
else
|
||||
provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}')
|
||||
fi
|
||||
|
||||
if [ -s "$provider_temp_file" ]; then
|
||||
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
|
||||
else
|
||||
msg_alert "\033[33m正在获取在线模版......\033[0m"
|
||||
get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file"
|
||||
[ -z "$(grep -o 'rules' "$TMPDIR"/provider_temp_file)" ] && {
|
||||
msg_alert "\033[31m下载失败,请尝试更换安装源!\033[0m"
|
||||
. "$CRASHDIR"/menus/9_upgrade.sh && setserver
|
||||
setproviders
|
||||
}
|
||||
fi
|
||||
# 生成proxy_providers模块
|
||||
mkdir -p "$TMPDIR"/providers
|
||||
# 预创建文件并写入对应文件头
|
||||
echo 'proxy-providers:' >"$TMPDIR"/providers/providers.yaml
|
||||
# 切割模版文件
|
||||
sed -n '/^proxy-groups:/,/^[a-z]/ { /^rule/d; p; }' "$TMPDIR"/provider_temp_file >"$TMPDIR"/providers/proxy-groups.yaml
|
||||
sed -n '/^rule/,$p' "$TMPDIR"/provider_temp_file >"$TMPDIR"/providers/rules.yaml
|
||||
rm -rf "$TMPDIR"/provider_temp_file
|
||||
# 基于单订阅生成providers模块
|
||||
if [ -n "$1" ]; then
|
||||
gen_providers_txt "$@"
|
||||
providers_tags=$1
|
||||
else
|
||||
# 基于全部订阅/本地文件生成
|
||||
[ -s "$CRASHDIR"/configs/providers.cfg ] && {
|
||||
providers_tags=''
|
||||
while read -r line; do
|
||||
gen_providers_txt $line
|
||||
providers_tags=$(echo "$providers_tags, $tag" | sed 's/^, //')
|
||||
done <"$CRASHDIR"/configs/providers.cfg
|
||||
}
|
||||
# 基于全部节点分享链接生成
|
||||
[ -s "$CRASHDIR"/configs/providers_uri.cfg ] && {
|
||||
mkdir -p "$CRASHDIR"/providers
|
||||
awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' "$CRASHDIR"/configs/providers_uri.cfg >"$CRASHDIR"/providers/uri_group
|
||||
gen_providers_txt "Uri_group" "./providers/uri_group" "3" "12"
|
||||
providers_tags=$(echo "$providers_tags, Uri_group" | sed 's/^, //')
|
||||
}
|
||||
fi
|
||||
# 修饰模版文件并合并
|
||||
sed -i "s/{providers_tags}/$providers_tags/g" "$TMPDIR"/providers/proxy-groups.yaml
|
||||
cut -c 1- "$TMPDIR"/providers/providers.yaml "$TMPDIR"/providers/proxy-groups.yaml "$TMPDIR"/providers/rules.yaml >"$TMPDIR"/config.yaml
|
||||
rm -rf "$TMPDIR"/providers
|
||||
# 调用内核测试
|
||||
. "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml
|
||||
if [ "$?" = 0 ]; then
|
||||
msg_alert "\033[32m配置文件生成成功!\033[0m"
|
||||
mkdir -p "$CRASHDIR"/yamls
|
||||
mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml
|
||||
comp_box "是否立即启动/重启服务?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && {
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
|
||||
exit
|
||||
}
|
||||
else
|
||||
rm -rf "$TMPDIR"/CrashCore
|
||||
rm -rf "$TMPDIR"/config.yaml
|
||||
msg_alert "\033[31m生成配置文件出错,请仔细检查输入!\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
gen_providers_txt() {
|
||||
if [ -n "$(echo "$2" | grep -E '^./')" ]; then
|
||||
type=file
|
||||
path=$2
|
||||
download_url=
|
||||
else
|
||||
type=http
|
||||
path="./providers/$1.yaml"
|
||||
download_url=$2
|
||||
fi
|
||||
tag=$1
|
||||
interval=${3:-3}
|
||||
interval2=${4:-12}
|
||||
ua=${5:-clash.meta}
|
||||
exclude=${6#\#}
|
||||
include=${7#\#}
|
||||
|
||||
cat >>"$TMPDIR"/providers/providers.yaml <<EOF
|
||||
${1}:
|
||||
type: $type
|
||||
url: "$download_url"
|
||||
path: "$path"
|
||||
interval: $((interval2 * 3600))
|
||||
health-check:
|
||||
enable: true
|
||||
lazy: true
|
||||
url: "https://www.gstatic.com/generate_204"
|
||||
interval: $((interval * 60))
|
||||
EOF
|
||||
[ "$crashcore" = 'meta' ] && {
|
||||
[ "$skip_cert" != "OFF" ] && skip_cert_verify='skip-cert-verify: true'
|
||||
cat >>"$TMPDIR"/providers/providers.yaml <<EOF
|
||||
header:
|
||||
User-Agent: ["$ua"]
|
||||
override:
|
||||
udp: true
|
||||
$skip_cert_verify
|
||||
filter: "$include"
|
||||
exclude-filter: "$exclude"
|
||||
EOF
|
||||
}
|
||||
# 写入提供者
|
||||
echo ' - {name: '"$tag"', type: url-test, tolerance: 100, lazy: true, use: ['"$tag"']}' >>"$TMPDIR"/providers/proxy-groups.yaml
|
||||
}
|
||||
133
scripts/menus/providers_singbox.sh
Normal file
133
scripts/menus/providers_singbox.sh
Normal file
@@ -0,0 +1,133 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_PROVIDERS_SINGBOX" ] && return
|
||||
__IS_PROVIDERS_SINGBOX=1
|
||||
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
|
||||
# 生成singbox的providers配置文件
|
||||
gen_providers() {
|
||||
if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ]; then
|
||||
provider_temp_file="$(sed -n "1 p" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list | awk '{print $2}')"
|
||||
else
|
||||
provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}')
|
||||
fi
|
||||
if [ -s "$provider_temp_file" ]; then
|
||||
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
|
||||
else
|
||||
msg_alert "\033[33m正在获取在线模版......\033[0m"
|
||||
get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file"
|
||||
[ -z "$(grep -o 'route' "$TMPDIR"/provider_temp_file)" ] && {
|
||||
msg_alert "\033[31m下载失败,请尝试更换安装源!\033[0m"
|
||||
. "$CRASHDIR"/menus/9_upgrade.sh && setserver
|
||||
setproviders
|
||||
}
|
||||
fi
|
||||
# 生成outbound_providers模块
|
||||
mkdir -p "$TMPDIR"/providers
|
||||
# 预创建文件并写入对应文件头
|
||||
cat >"$TMPDIR"/providers/providers.json <<EOF
|
||||
{
|
||||
"providers": [
|
||||
EOF
|
||||
cat >"$TMPDIR"/providers/outbounds_add.json <<EOF
|
||||
{
|
||||
"outbounds": [
|
||||
EOF
|
||||
# 基于单订阅生成providers模块
|
||||
if [ -n "$1" ]; then
|
||||
gen_providers_txt "$@"
|
||||
providers_tags=\"$1\"
|
||||
else
|
||||
# 基于全部订阅/本地文件生成
|
||||
[ -s "$CRASHDIR"/configs/providers.cfg ] && {
|
||||
providers_tags=''
|
||||
while read -r line; do
|
||||
gen_providers_txt $line
|
||||
providers_tags=$(echo "$providers_tags, \"$tag\"" | sed 's/^, //')
|
||||
done <"$CRASHDIR"/configs/providers.cfg
|
||||
}
|
||||
# 基于全部节点分享链接生成
|
||||
[ -s "$CRASHDIR"/configs/providers_uri.cfg ] && {
|
||||
mkdir -p "$CRASHDIR"/providers
|
||||
awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' "$CRASHDIR"/configs/providers_uri.cfg >"$CRASHDIR"/providers/uri_group
|
||||
gen_providers_txt "Uri_group" "./providers/uri_group" "3" "12"
|
||||
providers_tags=$(echo "$providers_tags, \"Uri_group\"" | sed 's/^, //')
|
||||
}
|
||||
fi
|
||||
# 修复文件格式
|
||||
sed -i '$s/},/}]}/' "$TMPDIR"/providers/outbounds_add.json
|
||||
sed -i '$s/},/}]}/' "$TMPDIR"/providers/providers.json
|
||||
# 使用模版生成outbounds和rules模块
|
||||
cat "$TMPDIR"/provider_temp_file | sed "s/{providers_tags}/$providers_tags/g" | sed "s/\"providers_tags\"/$providers_tags/g" >"$TMPDIR"/providers/outbounds.json
|
||||
rm -rf "$TMPDIR"/provider_temp_file
|
||||
# 调用内核测试
|
||||
. "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers
|
||||
if [ "$?" = 0 ]; then
|
||||
msg_alert "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m"
|
||||
mkdir -p "$CRASHDIR"/jsons
|
||||
mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json
|
||||
rm -rf "$TMPDIR"/providerss
|
||||
comp_box "是否立即启动/重启服务?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && {
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
|
||||
exit
|
||||
}
|
||||
else
|
||||
rm -rf "$TMPDIR"/CrashCore
|
||||
msg_alert "\033[31m生成配置文件出错,请仔细检查输入!\033[0m"
|
||||
# rm -rf "$TMPDIR"/providers
|
||||
fi
|
||||
}
|
||||
|
||||
gen_providers_txt() {
|
||||
tag=$1
|
||||
interval=${3:-3}
|
||||
interval2=${4:-12}
|
||||
ua=${5:-clash.meta}
|
||||
exclude=${6#\#}
|
||||
include=${7#\#}
|
||||
[ -n "$exclude" ] && exclude_ele="\"exclude\": \"$exclude\","
|
||||
[ -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",
|
||||
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
|
||||
$include_ele
|
||||
EOF
|
||||
fi
|
||||
# 通用部分生成
|
||||
[ "$skip_cert" != "OFF" ] && override_tls='true' || override_tls='false'
|
||||
cat >>"$TMPDIR"/providers/providers.json <<EOF
|
||||
"health_check": {
|
||||
"enabled": true,
|
||||
"url": "https://www.gstatic.com/generate_204",
|
||||
"interval": "${interval}m",
|
||||
"timeout": "3s"
|
||||
},
|
||||
"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=$(cat /proc/$PID/status | grep -w VmRSS | awk 'unit="MB" {printf "%.2f %s\n", $2/1000, unit}')
|
||||
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="$day天"
|
||||
time=$(date -u -d @${time} +%H小时%M分%S秒)
|
||||
[ "$day" = "0" ] && day='' || day="$dayD"
|
||||
time=$(date -u -d @${time} +%H:%M:%S)
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -1,150 +1,187 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
. /tmp/SC_tmp/libs/check_dir_avail.sh
|
||||
[ -n "$(echo -e | grep e)" ] && echo=echo || echo='echo -e'
|
||||
[ -f /tmp/SC_tmp/libs/check_dir_avail.sh ] && . /tmp/SC_tmp/libs/check_dir_avail.sh
|
||||
|
||||
set_crashdir() {
|
||||
set_usb_dir() {
|
||||
echo -e "请选择安装目录"
|
||||
du -hL /mnt | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "请输入相应数字 > " num
|
||||
set_usb_dir() {
|
||||
while true; do
|
||||
comp_box "请选择安装目录:"
|
||||
du -hL /mnt |
|
||||
awk '{print NR") "$2 " " $1}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
read -r -p "请输入相应数字> " num
|
||||
dir=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ -z "$dir" ]; then
|
||||
echo -e "\033[31m输入错误!请重新设置!\033[0m"
|
||||
set_usb_dir
|
||||
msg_alert "\033[31m输入错误!请重新设置!\033[0m"
|
||||
continue
|
||||
fi
|
||||
}
|
||||
set_asus_dir() {
|
||||
echo -e "请选择U盘目录"
|
||||
du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "请输入相应数字 > " num
|
||||
break 1
|
||||
done
|
||||
}
|
||||
|
||||
set_xiaomi_dir() {
|
||||
comp_box "\033[33m检测到当前设备为小米官方系统,请选择安装位置:\033[0m"
|
||||
[ -d /data ] && content_line "1) /data目录,剩余空间:$(dir_avail /data -h) (支持软固化功能)"
|
||||
[ -d /userdisk ] && content_line "2) /userdisk目录,剩余空间:$(dir_avail /userdisk -h) (支持软固化功能)"
|
||||
[ -d /data/other_vol ] && content_line "3) /data/other_vol目录,剩余空间:$(dir_avail /data/other_vol -h) (支持软固化功能)"
|
||||
content_line "4) 自定义目录(不推荐,不明勿用!)"
|
||||
content_line ""
|
||||
content_line "0) 退出安装"
|
||||
separator_line "="
|
||||
read -r -p "请输入相应数字> " num
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/data
|
||||
;;
|
||||
2)
|
||||
dir=/userdisk
|
||||
;;
|
||||
3)
|
||||
dir=/data/other_vol
|
||||
;;
|
||||
4)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
line_break
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
set_asus_usb() {
|
||||
while true; do
|
||||
comp_box "请选择U盘目录:"
|
||||
du -hL /tmp/mnt |
|
||||
awk -F/ 'NF<=4 {print NR") "$2 " " $1}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
read -r -p "请输入相应数字> " num
|
||||
dir=$(du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ ! -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ]; then
|
||||
echo -e "\033[31m未找到下载大师自启文件:$dir/asusware.arm/etc/init.d/S50downloadmaster,请检查设置!\033[0m"
|
||||
msg_alert "\033[31m未找到下载大师自启文件:$dir/asusware.arm/etc/init.d/S50downloadmaster,请检查设置!\033[0m"
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
set_asus_dir() {
|
||||
separator_line "="
|
||||
btm_box "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m" \
|
||||
"1) 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)" \
|
||||
"2) 基于自启脚本安装(仅持部分梅林固件)" \
|
||||
"" \
|
||||
"0) 退出安装"
|
||||
read -r -p "请输入相应数字> " num
|
||||
case "$num" in
|
||||
1)
|
||||
msg_alert -t 2 "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!"
|
||||
set_asus_usb
|
||||
;;
|
||||
2)
|
||||
msg_alert -t 2 "如开机无法正常自启,请重新使用U盘+下载大师安装!"
|
||||
dir=/jffs
|
||||
;;
|
||||
*)
|
||||
line_break
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
set_cust_dir() {
|
||||
while true; do
|
||||
comp_box "路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!" \
|
||||
"" \
|
||||
"可用路径 剩余空间:"
|
||||
df -h |
|
||||
awk '{print $6, $4}' |
|
||||
sed '1d' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
read -r -p "请输入自定义路径> " dir
|
||||
if [ "$(dir_avail "$dir")" = 0 ] || [ -n "$(echo "$dir" | grep -Eq '^/(tmp|opt|sys)(/|$)')" ]; then
|
||||
msg_alert "\033[31m路径错误!请重新设置!\033[0m"
|
||||
continue
|
||||
fi
|
||||
break 1
|
||||
done
|
||||
}
|
||||
|
||||
set_crashdir() {
|
||||
while true; do
|
||||
top_box "\033[33m注意:安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m"
|
||||
case "$systype" in
|
||||
Padavan)
|
||||
dir=/etc/storage
|
||||
;;
|
||||
mi_snapshot)
|
||||
set_xiaomi_dir
|
||||
;;
|
||||
asusrouter)
|
||||
set_asus_dir
|
||||
fi
|
||||
}
|
||||
set_cust_dir() {
|
||||
echo "-----------------------------------------------"
|
||||
echo "可用路径 剩余空间:"
|
||||
df -h | awk '{print $6,$4}' | sed 1d
|
||||
echo "路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!!!"
|
||||
read -p "请输入自定义路径 > " dir
|
||||
if [ "$(dir_avail $dir)" = 0 ] || [ -n "$(echo $dir | grep -E 'tmp|opt|sys')" ]; then
|
||||
echo "\033[31m路径错误!请重新设置!\033[0m"
|
||||
set_cust_dir
|
||||
fi
|
||||
}
|
||||
echo "-----------------------------------------------"
|
||||
if [ -n "$systype" ]; then
|
||||
[ "$systype" = "Padavan" ] && dir=/etc/storage
|
||||
[ "$systype" = "mi_snapshot" ] && {
|
||||
echo -e "\033[33m检测到当前设备为小米官方系统,请选择安装位置\033[0m"
|
||||
[ -d /data ] && $echo " 1 安装到 /data 目录,剩余空间:$(dir_avail /data -h)(支持软固化功能)"
|
||||
[ -d /userdisk ] && $echo " 2 安装到 /userdisk 目录,剩余空间:$(dir_avail /userdisk -h)(支持软固化功能)"
|
||||
[ -d /data/other_vol ] && $echo " 3 安装到 /data/other_vol 目录,剩余空间:$(dir_avail /data/other_vol -h)(支持软固化功能)"
|
||||
$echo " 4 安装到自定义目录(不推荐,不明勿用!)"
|
||||
echo " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
;;
|
||||
ng_snapshot)
|
||||
dir=/tmp/mnt
|
||||
;;
|
||||
*)
|
||||
separator_line "="
|
||||
btm_box "1) 在\033[32m/etc目录\033[0m下安装(适合root用户)" \
|
||||
"2) 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)" \
|
||||
"3) 在\033[32m当前用户目录\033[0m下安装(适合非root用户)" \
|
||||
"4) 在\033[32m外置存储\033[0m中安装" \
|
||||
"5) 手动设置安装目录" \
|
||||
"" \
|
||||
"0) 退出安装"
|
||||
read -r -p "请输入相应数字> " num
|
||||
# 设置目录
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/data
|
||||
dir=/etc
|
||||
;;
|
||||
2)
|
||||
dir=/userdisk
|
||||
dir=/usr/share
|
||||
;;
|
||||
3)
|
||||
dir=/data/other_vol
|
||||
dir=~/.local/share
|
||||
mkdir -p ~/.config/systemd/user
|
||||
;;
|
||||
4)
|
||||
set_usb_dir
|
||||
;;
|
||||
5)
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
msg_alert "安装已取消"
|
||||
line_break
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
[ "$systype" = "asusrouter" ] && {
|
||||
echo -e "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m"
|
||||
echo -e " 1 基于USB设备安装(限23年9月之前固件,须插入\033[31m任意\033[0mUSB设备)"
|
||||
echo -e " 2 基于自启脚本安装(仅支持梅林及部分非koolshare官改固件)"
|
||||
echo -e " 3 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)"
|
||||
echo -e " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
case "$num" in
|
||||
1)
|
||||
read -p "将脚本安装到USB存储/系统闪存?(1/0) > " res
|
||||
[ "$res" = "1" ] && set_usb_dir || dir=/jffs
|
||||
usb_status=1
|
||||
;;
|
||||
2)
|
||||
echo -e "如无法正常开机启动,请重新使用USB方式安装!"
|
||||
sleep 2
|
||||
dir=/jffs
|
||||
;;
|
||||
3)
|
||||
echo -e "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!"
|
||||
sleep 2
|
||||
set_asus_dir
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
[ "$systype" = "ng_snapshot" ] && dir=/tmp/mnt
|
||||
else
|
||||
echo -e "\033[33m安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m"
|
||||
echo -e " 1 在\033[32m/etc目录\033[0m下安装(适合root用户)"
|
||||
echo -e " 2 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)"
|
||||
echo -e " 3 在\033[32m当前用户目录\033[0m下安装(适合非root用户)"
|
||||
echo -e " 4 在\033[32m外置存储\033[0m中安装"
|
||||
echo -e " 5 手动设置安装目录"
|
||||
echo -e " 0 退出安装"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入相应数字 > " num
|
||||
#设置目录
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/etc
|
||||
;;
|
||||
2)
|
||||
dir=/usr/share
|
||||
;;
|
||||
3)
|
||||
dir=~/.local/share
|
||||
mkdir -p ~/.config/systemd/user
|
||||
;;
|
||||
4)
|
||||
set_usb_dir
|
||||
;;
|
||||
5)
|
||||
echo "-----------------------------------------------"
|
||||
echo "可用路径 剩余空间:"
|
||||
df -h | awk '{print $6,$4}' | sed 1d
|
||||
echo "路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!!!"
|
||||
read -p "请输入自定义路径 > " dir
|
||||
if [ -z "$dir" ]; then
|
||||
echo -e "\033[31m路径错误!请重新设置!\033[0m"
|
||||
setdir
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "安装已取消"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if [ ! -w $dir ]; then
|
||||
echo -e "\033[31m没有$dir目录写入权限!请重新设置!\033[0m" && sleep 1 && setdir
|
||||
else
|
||||
echo -e "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail $dir -h)"
|
||||
read -p "确认安装?(1/0) > " res
|
||||
[ "$res" = "1" ] && CRASHDIR=$dir/ShellCrash || setdir
|
||||
fi
|
||||
if [ ! -w "$dir" ]; then
|
||||
msg_alert "\033[31m没有$dir目录写入权限!请重新设置!\033[0m"
|
||||
else
|
||||
comp_box "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail "$dir" -h)" \
|
||||
"" \
|
||||
"是否确认安装?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "请输入相应数字> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
CRASHDIR="$dir"/ShellCrash
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
219
scripts/menus/subconverter.sh
Normal file
219
scripts/menus/subconverter.sh
Normal file
@@ -0,0 +1,219 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_MODULE_SUBCONVERTER" ] && return
|
||||
__IS_MODULE_SUBCONVERTER=1
|
||||
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] && server_link=1
|
||||
|
||||
# Subconverter在线订阅转换
|
||||
subconverter() {
|
||||
while true; do
|
||||
comp_box "1) \033[32m生成\033[0m包含全部节点、订阅的配置文件"\
|
||||
"2) 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m"\
|
||||
"3) 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m"\
|
||||
"4) 选择\033[33m在线规则模版\033[0m"\
|
||||
"5) 选择\033[0mSubconverter服务器\033[0m"\
|
||||
"6) 自定义浏览器UA \033[32m$user_agent\033[0m"\
|
||||
""\
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
providers_link=$(grep -v '\./providers/' "$CRASHDIR"/configs/providers.cfg 2>/dev/null | awk '{print $2}' | tr '\n' '|')
|
||||
uri_link=$(grep -v '^#' "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null | awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' | tr '\n' '|')
|
||||
Url=$(echo "$providers_link|$uri_link" | sed 's/||*/|/g; s/^|//; s/|$//')
|
||||
setconfig Url "'$Url'"
|
||||
Https=''
|
||||
setconfig Https
|
||||
# 获取在线文件
|
||||
jump_core_config
|
||||
;;
|
||||
2)
|
||||
gen_link_flt
|
||||
;;
|
||||
3)
|
||||
gen_link_ele
|
||||
;;
|
||||
4)
|
||||
gen_link_config
|
||||
;;
|
||||
5)
|
||||
gen_link_server
|
||||
;;
|
||||
6)
|
||||
set_sub_ua
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 排除节点正则
|
||||
gen_link_flt() {
|
||||
comp_box "\033[33m匹配关键字的节点会在导入时被【屏蔽】!\033[0m" \
|
||||
"多个关键字可以用\033[30;47m | \033[0m号分隔" \
|
||||
"\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代"
|
||||
btm_box "\033[36m请直接输入节点过滤关键字\033[0m" \
|
||||
"或输入 d \033[31m清空\033[0m节点过滤关键字" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " res
|
||||
case "$res" in
|
||||
0)
|
||||
return 0
|
||||
;;
|
||||
d)
|
||||
exclude=''
|
||||
;;
|
||||
*)
|
||||
exclude="$res"
|
||||
;;
|
||||
esac
|
||||
|
||||
if setconfig exclude "'$exclude'"; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
}
|
||||
|
||||
# 包含节点正则
|
||||
gen_link_ele() {
|
||||
comp_box "\033[33m仅有匹配关键字的节点才会被【导入】!!!\033[0m" \
|
||||
"多个关键字可以用\033[30;47m | \033[0m号分隔" \
|
||||
"\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代"
|
||||
btm_box "\033[36m请直接输入节点匹配关键字\033[0m" \
|
||||
"或输入 d \033[31m清空\033[0m节点匹配关键字" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " res
|
||||
case "$res" in
|
||||
0)
|
||||
return 0
|
||||
;;
|
||||
d)
|
||||
include=""
|
||||
;;
|
||||
*)
|
||||
include="$res"
|
||||
;;
|
||||
esac
|
||||
|
||||
if setconfig include "'$include'"; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
}
|
||||
|
||||
# 选择在线规则模版
|
||||
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}')
|
||||
comp_box "当前使用规则为:\033[33m$now\033[0m"
|
||||
list_box "$list"
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
echo
|
||||
elif [ "$num" -le "$totalnum" ]; then
|
||||
# 将对应标记值写入配置
|
||||
rule_link=$num
|
||||
if setconfig rule_link "$rule_link"; then
|
||||
msg_alert "\033[32m设置成功!返回上级菜单\033[0m"
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 选择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}')
|
||||
|
||||
comp_box "\033[36m以下为互联网采集的第三方服务器,具体安全性请自行斟酌!\033[0m" \
|
||||
"\033[32m感谢以下作者的无私奉献!!!\033[0m" \
|
||||
"" \
|
||||
"当前使用后端为:\033[33m$now\033[0m"
|
||||
list_box "$list"
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
echo
|
||||
elif [ "$num" -le "$totalnum" ]; then
|
||||
# 将对应标记值写入配置
|
||||
server_link=$num
|
||||
if setconfig server_link "$server_link"; then
|
||||
content_line "\033[32m设置成功!返回上级菜单\033[0m"
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
set_sub_ua() {
|
||||
while true; do
|
||||
comp_box "\033[36m无法正确获取配置文件时可尝试使用\033[0m" \
|
||||
"" \
|
||||
"当前UA:$user_agent"
|
||||
btm_box "1) 使用自动UA(默认)"\
|
||||
"2) 不使用UA"\
|
||||
"3) 使用自定义UA"\
|
||||
"4) 清空UA"\
|
||||
""\
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
user_agent='auto'
|
||||
;;
|
||||
2)
|
||||
user_agent='none'
|
||||
;;
|
||||
3)
|
||||
comp_box "\033[33m注意:\n自定义UA不可包含空格或特殊符号!\033[0m"
|
||||
btm_box "\033[36m请直接输入自定义UA\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$text" ]; then
|
||||
user_agent="$text"
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
user_agent=''
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "$num" -ge 1 ] && [ "$num" -le 4 ]; then
|
||||
if setconfig user_agent "$user_agent"; then
|
||||
common_success
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
fi
|
||||
break
|
||||
done
|
||||
}
|
||||
@@ -14,8 +14,11 @@ 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 '(每隔|时每)([1-9]|[1-9][0-9])分钟' && push=off
|
||||
logger "$1" 0 "$push"
|
||||
echo "$1" |grep -qE '(每隔|时每)([1-9]|[1-9][0-9])分钟' && {
|
||||
push=off
|
||||
cover=on
|
||||
}
|
||||
logger "$1" 0 "$push" "$cover"
|
||||
}
|
||||
|
||||
#任务命令
|
||||
@@ -32,7 +35,7 @@ update_core(){ #自动更新内核
|
||||
task_logger "任务【自动更新内核】中止-未检测到版本更新"
|
||||
return 0
|
||||
else
|
||||
. "$CRASHDIR"/libs/core_webget.sh && core_webget #调用下载工具
|
||||
. "$CRASHDIR"/libs/core_tools.sh && core_webget #调用下载工具
|
||||
case "$?" in
|
||||
0)
|
||||
task_logger "任务【自动更新内核】下载完成,正在重启服务!"
|
||||
@@ -58,18 +61,18 @@ update_scripts(){ #自动更新脚本
|
||||
task_logger "任务【自动更新脚本】中止-未检测到版本更新"
|
||||
return 0
|
||||
else
|
||||
get_bin "$TMPDIR"/clashfm.tar.gz "bin/update.tar.gz"
|
||||
get_bin "$TMPDIR"/ShellCrash.tar.gz "ShellCrash.tar.gz"
|
||||
if [ "$?" != "0" ];then
|
||||
rm -rf "$TMPDIR"/clashfm.tar.gz
|
||||
rm -rf "$TMPDIR"/ShellCrash.tar.gz
|
||||
task_logger "任务【自动更新内核】出错-下载失败!"
|
||||
return 1
|
||||
else
|
||||
#停止服务
|
||||
"$CRASHDIR"/start.sh stop
|
||||
#解压
|
||||
tar -zxf "$TMPDIR"/clashfm.tar.gz ${tar_para} -C "$CRASHDIR"/
|
||||
tar -zxf "$TMPDIR"/ShellCrash.tar.gz ${tar_para} -C "$CRASHDIR"/
|
||||
if [ $? -ne 0 ];then
|
||||
rm -rf "$TMPDIR"/clashfm.tar.gz
|
||||
rm -rf "$TMPDIR"/ShellCrash.tar.gz
|
||||
task_logger "任务【自动更新内核】出错-解压失败!"
|
||||
"$CRASHDIR"/start.sh start
|
||||
return 1
|
||||
@@ -116,7 +119,7 @@ reset_firewall(){ #重设透明路由防火墙
|
||||
"$CRASHDIR"/start.sh afstart
|
||||
}
|
||||
ntp(){
|
||||
[ "$crashcore" != singbox ] && 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
|
||||
|
||||
148
scripts/menus/tui_layout.sh
Normal file
148
scripts/menus/tui_layout.sh
Normal file
@@ -0,0 +1,148 @@
|
||||
# tui/layout.sh
|
||||
# Terminal UI layout helpers
|
||||
# Provides menu/table formatting utilities
|
||||
|
||||
# set the total width of the menu
|
||||
# (adjusting this number will automatically change the entire menu, including the separator lines)
|
||||
# note: The number represents the number of columns that appear when the "||" appears on the right
|
||||
TABLE_WIDTH=60
|
||||
|
||||
# define two extra-long template strings in advance
|
||||
# (the length should be greater than the expected TABLE_WIDTH)
|
||||
FULL_EQ="===================================================================================================="
|
||||
FULL_DASH="- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "
|
||||
|
||||
# function to print content lines
|
||||
content_line() {
|
||||
raw_input="$1"
|
||||
|
||||
if [ -z "$raw_input" ]; then
|
||||
printf " \033[%dG||\n" "$TABLE_WIDTH"
|
||||
return
|
||||
fi
|
||||
|
||||
printf '%b' "$raw_input" | LC_ALL=C awk -v table_width="$TABLE_WIDTH" '
|
||||
BEGIN {
|
||||
textWidth = table_width - 3
|
||||
currentDisplayWidth = 0
|
||||
wordWidth = 0
|
||||
currentLine = ""
|
||||
wordBuffer = ""
|
||||
lastColor = ""
|
||||
savedColor = ""
|
||||
ESC = sprintf("%c", 27)
|
||||
}
|
||||
|
||||
{
|
||||
n = split($0, chars, "")
|
||||
for (i = 1; i <= n; i++) {
|
||||
r = chars[i]
|
||||
if (r == ESC && i+1 <= n && chars[i+1] == "[") {
|
||||
ansiSeq = ""
|
||||
for (j = i; j <= n; j++) {
|
||||
ansiSeq = ansiSeq chars[j]
|
||||
if (chars[j] == "m") {
|
||||
i = j
|
||||
break
|
||||
}
|
||||
}
|
||||
wordBuffer = wordBuffer ansiSeq
|
||||
lastColor = ansiSeq
|
||||
continue
|
||||
}
|
||||
|
||||
charWidth = 1
|
||||
if (r <= "\177") { charWidth = 1 }
|
||||
else if (r >= "\340" && r <= "\357" && i+2 <= n) {
|
||||
r = chars[i] chars[i+1] chars[i+2]
|
||||
i += 2
|
||||
charWidth = 2
|
||||
}
|
||||
else if (r >= "\300" && r <= "\337" && i+1 <= n) {
|
||||
r = chars[i] chars[i+1]
|
||||
i += 1
|
||||
charWidth = 1
|
||||
}
|
||||
|
||||
if (r == " " || charWidth == 2) {
|
||||
if (currentDisplayWidth + wordWidth + charWidth > textWidth) {
|
||||
printf " %s\033[0m\033[%dG||\n", currentLine, table_width
|
||||
currentLine = savedColor wordBuffer
|
||||
currentDisplayWidth = wordWidth
|
||||
wordBuffer = r
|
||||
wordWidth = charWidth
|
||||
savedColor = lastColor
|
||||
} else {
|
||||
currentLine = currentLine wordBuffer r
|
||||
currentDisplayWidth += wordWidth + charWidth
|
||||
wordBuffer = ""
|
||||
wordWidth = 0
|
||||
savedColor = lastColor
|
||||
}
|
||||
} else {
|
||||
wordBuffer = wordBuffer r
|
||||
wordWidth += charWidth
|
||||
if (wordWidth > textWidth) {
|
||||
printf " %s%s\033[0m\033[%dG||\n", currentLine, wordBuffer, table_width
|
||||
currentLine = savedColor
|
||||
currentDisplayWidth = 0
|
||||
wordBuffer = ""
|
||||
wordWidth = 0
|
||||
savedColor = lastColor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (wordWidth > 0) {
|
||||
if (currentDisplayWidth + wordWidth > textWidth) {
|
||||
printf " %s\033[0m\033[%dG||\n", currentLine, table_width
|
||||
currentLine = savedColor wordBuffer
|
||||
} else {
|
||||
currentLine = currentLine wordBuffer
|
||||
}
|
||||
}
|
||||
|
||||
printf " %s\033[0m\033[%dG||\n", currentLine, table_width
|
||||
|
||||
currentLine = lastColor
|
||||
currentDisplayWidth = 0
|
||||
wordBuffer = ""
|
||||
wordWidth = 0
|
||||
savedColor = lastColor
|
||||
}
|
||||
END {}
|
||||
'
|
||||
}
|
||||
|
||||
# function to print sub content lines
|
||||
# for printing accompanying instructions
|
||||
sub_content_line() {
|
||||
param="$1"
|
||||
if [ -z "$param" ]; then
|
||||
printf " \033[%dG||\n" "$TABLE_WIDTH"
|
||||
return
|
||||
fi
|
||||
content_line " $param"
|
||||
printf " \033[%dG||\n" "$TABLE_WIDTH"
|
||||
}
|
||||
|
||||
# function to print separators
|
||||
# (using string slicing)
|
||||
# parameter $1: pass in "=" or "-"
|
||||
separator_line() {
|
||||
separatorType="$1"
|
||||
lenLimit=$((TABLE_WIDTH - 1))
|
||||
outputLine=""
|
||||
if [ "$separatorType" = "=" ]; then
|
||||
outputLine=$(printf "%.${lenLimit}s" "$FULL_EQ")
|
||||
else
|
||||
outputLine=$(printf "%.${lenLimit}s" "$FULL_DASH")
|
||||
fi
|
||||
printf "%s||\n" "$outputLine"
|
||||
}
|
||||
|
||||
# increase the spacing between the front
|
||||
# and back forms to improve readability
|
||||
line_break() {
|
||||
printf "\n\n"
|
||||
}
|
||||
18
scripts/menus/tui_lite.sh
Normal file
18
scripts/menus/tui_lite.sh
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
TABLE_WIDTH=60
|
||||
|
||||
content_line() {
|
||||
printf '%b' " $1\n"
|
||||
}
|
||||
|
||||
sub_content_line() {
|
||||
content_line " $1"
|
||||
}
|
||||
|
||||
separator_line() {
|
||||
echo "-----------------------------------------------"
|
||||
}
|
||||
|
||||
line_break() {
|
||||
return
|
||||
}
|
||||
@@ -1,19 +1,27 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
#卸载
|
||||
# 卸载
|
||||
uninstall() {
|
||||
read -p "确认卸载ShellCrash?(警告:该操作不可逆!)[1/0] > " res
|
||||
comp_box "\033[31m警告:该操作不可逆!\033[0m" \
|
||||
"是否确认卸载ShellCrash?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = '1' ]; then
|
||||
#停止服务
|
||||
# 停止服务
|
||||
"$CRASHDIR"/start.sh stop 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "clash服务" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "订阅链接" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "ShellCrash初始化" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "task.sh" 2>/dev/null
|
||||
#移除安装目录
|
||||
|
||||
# 移除安装目录
|
||||
if [ -n "$CRASHDIR" ] && [ "$CRASHDIR" != '/' ]; then
|
||||
read -p "是否保留脚本配置及订阅文件?[1/0] > " res
|
||||
comp_box "是否保留脚本配置及订阅文件?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = '1' ]; then
|
||||
mv -f "$CRASHDIR"/configs /tmp/ShellCrash/configs_bak
|
||||
mv -f "$CRASHDIR"/yamls /tmp/ShellCrash/yamls_bak
|
||||
@@ -26,10 +34,10 @@ uninstall() {
|
||||
rm -rf "$CRASHDIR"
|
||||
fi
|
||||
else
|
||||
echo -e "\033[31m环境变量配置有误,请尝试手动移除安装目录!\033[0m"
|
||||
sleep 1
|
||||
msg_alert "\033[31m环境变量配置有误,请尝试手动移除安装目录!\033[0m"
|
||||
fi
|
||||
#移除其他内容
|
||||
|
||||
# 移除其他内容
|
||||
sed -i "/alias $my_alias=*/"d /etc/profile 2>/dev/null
|
||||
sed -i '/alias crash=*/'d /etc/profile 2>/dev/null
|
||||
sed -i '/export CRASHDIR=*/'d /etc/profile 2>/dev/null
|
||||
@@ -54,12 +62,12 @@ uninstall() {
|
||||
userdel -r shellcrash 2>/dev/null
|
||||
nvram set script_usbmount="" 2>/dev/null
|
||||
nvram commit 2>/dev/null
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m"
|
||||
echo -e "\033[33m请手动关闭当前窗口以重置环境变量!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
exit
|
||||
comp_box "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m" \
|
||||
"\033[33m请手动关闭当前窗口以重置环境变量!\033[0m"
|
||||
line_break
|
||||
sleep 1
|
||||
exit 0
|
||||
else
|
||||
echo -e "\033[31m操作已取消!\033[0m"
|
||||
msg_alert "\033[31m操作已取消!\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
126
scripts/menus/userguide.sh
Normal file
126
scripts/menus/userguide.sh
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_MODULE_USERGUIDE_LOADED" ] && return
|
||||
__IS_MODULE_USERGUIDE_LOADED=1
|
||||
|
||||
load_lang userguide
|
||||
|
||||
forwhat() {
|
||||
while true; do
|
||||
comp_box "\033[30;46m$UG_WELCOME\033[0m" \
|
||||
"" \
|
||||
"\033[33m$UG_CHOOSE_ENV\033[0m" \
|
||||
"\033[0m$UG_TIP_CONFIG\033[0m"
|
||||
|
||||
content_line "1) \033[32m$UG_OPTION_1\033[0m"
|
||||
content_line "2) \033[36m$UG_OPTION_2\033[0m"
|
||||
[ -s "$CRASHDIR"/configs.tar.gz ] && content_line "3) \033[33m$UG_OPTION_3\033[0m"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 1)
|
||||
# 设置运行模式
|
||||
redir_mod="Mix"
|
||||
content_line "$cputype" | grep -Eq 'linux.*mips.*' && {
|
||||
if grep -qE '^TPROXY$' /proc/net/ip_tables_targets || modprobe xt_TPROXY >/dev/null 2>&1; then
|
||||
redir_mod="Tproxy"
|
||||
else
|
||||
redir_mod="Redir"
|
||||
fi
|
||||
}
|
||||
|
||||
[ -z "$crashcore" ] && crashcore=meta
|
||||
setconfig crashcore "$crashcore"
|
||||
setconfig redir_mod "$redir_mod"
|
||||
setconfig dns_mod mix
|
||||
setconfig firewall_area '1'
|
||||
# 默认启用绕过CN-IP
|
||||
setconfig cn_ip_route ON
|
||||
# 自动识别IPV6
|
||||
[ -n "$(ip a 2>&1 | grep -w 'inet6' | grep -E 'global' | sed 's/.*inet6.//g' | sed 's/scope.*$//g')" ] && {
|
||||
setconfig ipv6_redir ON
|
||||
setconfig ipv6_support ON
|
||||
setconfig ipv6_dns ON
|
||||
setconfig cn_ipv6_route ON
|
||||
}
|
||||
# 设置开机启动
|
||||
if [ -f /etc/rc.common ] && [ "$(cat /proc/1/comm)" = "procd" ]; then
|
||||
/etc/init.d/shellcrash enable
|
||||
fi
|
||||
|
||||
ckcmd systemctl && [ "$(cat /proc/1/comm)" = "systemd" ] && systemctl enable shellcrash.service >/dev/null 2>&1
|
||||
rm -rf "$CRASHDIR"/.dis_startup
|
||||
autostart=enable
|
||||
# 检测IP转发
|
||||
if [ "$(cat /proc/sys/net/ipv4/ip_forward)" = "0" ]; then
|
||||
separator_line "-"
|
||||
content_line "\033[33m$UG_IP_FORWARD_WARN\033[0m"
|
||||
read -r -p "$COMMON_INPUT_R" res
|
||||
[ "$res" = 1 ] && {
|
||||
content_line 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
|
||||
sysctl -w net.ipv4.ip_forward=1
|
||||
}
|
||||
fi
|
||||
# 禁止docker启用的net.bridge.bridge-nf-call-iptables
|
||||
sysctl -w net.bridge.bridge-nf-call-iptables=0 >/dev/null 2>&1
|
||||
sysctl -w net.bridge.bridge-nf-call-ip6tables=0 >/dev/null 2>&1
|
||||
break
|
||||
;;
|
||||
2)
|
||||
setconfig redir_mod "Redir"
|
||||
content_line "$cputype" | grep -Eq "linux.*mips.*" && setconfig crashcore "clash"
|
||||
setconfig common_ports "OFF"
|
||||
setconfig firewall_area '2'
|
||||
break
|
||||
;;
|
||||
3)
|
||||
tar -zxf "$CRASHDIR"/configs.tar.gz -C "$CRASHDIR"/configs
|
||||
msg_alert "\033[32m$UG_RESTORE_OK\033[0m"
|
||||
line_break
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 新手引导
|
||||
userguide() {
|
||||
. "$CRASHDIR"/libs/check_dir_avail.sh
|
||||
forwhat
|
||||
|
||||
# 检测小内存模式
|
||||
dir_size=$(dir_avail "$CRASHDIR")
|
||||
if [ "$dir_size" -lt 10240 ]; then
|
||||
comp_box "\033[33m$UG_ENABLE_LOW_MEM\033[0m"
|
||||
read -r -p "$COMMON_INPUT_R" res
|
||||
[ "$res" = 1 ] && {
|
||||
BINDIR=/tmp/ShellCrash
|
||||
sed -i "s#BINDIR=.*#BINDIR=$BINDIR" "$CRASHDIR"/configs/command.env
|
||||
}
|
||||
fi
|
||||
|
||||
# 启用推荐的自动任务配置
|
||||
. "$CRASHDIR"/menus/5_task.sh && task_recom
|
||||
|
||||
# 提示导入订阅或者配置文件
|
||||
if [ ! -s "$CRASHDIR"/yamls/config.yaml ] && [ ! -s "$CRASHDIR"/jsons/config.json ]; then
|
||||
comp_box "\033[0m$UG_IMPORT_CONFIG\033[0m" \
|
||||
"\033[32m$UG_CONFIG_TIP\033[0m" \
|
||||
"$UG_CONFIG_RES"
|
||||
btm_box "1) 立即导入" \
|
||||
"0) 暂不导入"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && inuserguide=1 && {
|
||||
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
|
||||
inuserguide=""
|
||||
}
|
||||
fi
|
||||
|
||||
# 回到主界面
|
||||
msg_alert "\033[36m$UG_FINAL_TIP\033[0m"
|
||||
return 0
|
||||
}
|
||||
@@ -28,7 +28,7 @@ stop_firewall(){
|
||||
start_l(){
|
||||
bfstart && {
|
||||
. "$CRASHDIR"/starts/start_legacy.sh
|
||||
start_legacy "$COMMAND" 'shellcrash'
|
||||
start_legacy "$COMMAND" 'shellcrash'
|
||||
} && afstart &
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ 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 #主旁转发
|
||||
. "$CRASHDIR"/starts/fw_start.sh
|
||||
@@ -47,8 +47,8 @@ start)
|
||||
/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 ] && {
|
||||
setconfig ExecStart "$COMMAND >/dev/null" "$FragmentPath"
|
||||
[ -f "$FragmentPath" ] && {
|
||||
sed -i "s#^ExecStart=.*#ExecStart=$COMMAND >/dev/null#" "$FragmentPath"
|
||||
systemctl daemon-reload
|
||||
}
|
||||
systemctl start shellcrash.service || . "$CRASHDIR"/starts/start_error.sh
|
||||
@@ -65,16 +65,19 @@ start)
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
logger ShellCrash服务即将关闭……
|
||||
logger ShellCrash服务即将关闭......
|
||||
[ -n "$(pidof CrashCore)" ] && web_save #保存面板配置
|
||||
#删除守护进程&面板配置自动保存
|
||||
cronset '保守模式守护进程'
|
||||
cronset '运行时每'
|
||||
cronset '流媒体预解析'
|
||||
#清理定时任务
|
||||
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
|
||||
#多种方式结束进程
|
||||
if [ -f "$TMPDIR/shellcrash.pid" ];then
|
||||
kill -TERM "$(cat "$TMPDIR/shellcrash.pid")"
|
||||
rm -f "$TMPDIR/shellcrash.pid"
|
||||
if [ -f "$TMPDIR/shellcrash.pid" ];then
|
||||
kill -TERM "$(cat "$TMPDIR/shellcrash.pid")" 2>/dev/null
|
||||
rm -f "$TMPDIR/shellcrash.pid"
|
||||
stop_firewall
|
||||
elif [ "$USER" = "root" ] && grep -q 'systemd' /proc/1/comm; then
|
||||
systemctl stop shellcrash.service >/dev/null 2>&1
|
||||
elif [ -f /etc/rc.common ] && grep -q 'procd' /proc/1/comm; then
|
||||
@@ -85,7 +88,7 @@ stop)
|
||||
elif rc-status -r >/dev/null 2>&1; then
|
||||
rc-service shellcrash stop >/dev/null 2>&1
|
||||
else
|
||||
stop_firewall #清理路由策略
|
||||
stop_firewall
|
||||
fi
|
||||
killall CrashCore 2>/dev/null
|
||||
#清理缓存目录
|
||||
@@ -115,8 +118,8 @@ debug)
|
||||
else
|
||||
sed -i "s/log-level: info/log-level: $2/" "$TMPDIR"/config.yaml
|
||||
fi
|
||||
[ "$3" = flash ] && dir=$CRASHDIR || dir=$TMPDIR
|
||||
$COMMAND >${dir}/debug.log 2>&1 &
|
||||
[ "$3" = flash ] && dir="$CRASHDIR" || dir="$TMPDIR"
|
||||
$COMMAND >"$dir"/debug.log 2>&1 &
|
||||
sleep 2
|
||||
logger "已运行debug模式!如需停止,请使用重启/停止服务功能!" 33
|
||||
else
|
||||
|
||||
@@ -21,8 +21,6 @@ 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 #标记启动时间
|
||||
#TG机器人守护进程
|
||||
[ "$bot_tg_service" = ON ] && . "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_cron
|
||||
#后台还原面板配置
|
||||
[ -s "$CRASHDIR"/configs/web_save ] && {
|
||||
. "$CRASHDIR"/libs/web_restore.sh
|
||||
@@ -33,27 +31,26 @@ if [ -n "$test" -o -n "$(pidof CrashCore)" ]; then
|
||||
sleep 5
|
||||
logger ShellCrash服务已启动!
|
||||
} &
|
||||
ckcmd mtd_storage.sh && mtd_storage.sh save >/dev/null 2>&1 & #Padavan保存/etc/storage
|
||||
ckcmd mtd_storage.sh && mtd_storage.sh save >/dev/null 2>&1 #Padavan保存/etc/storage
|
||||
#加载定时任务
|
||||
[ -s "$CRASHDIR"/task/cron ] && croncmd "$CRASHDIR"/task/cron
|
||||
[ -s "$CRASHDIR"/task/running ] && {
|
||||
cronset '运行时每'
|
||||
while read line; do
|
||||
cronset '2fjdi124dd12s' "$line"
|
||||
done <"$CRASHDIR"/task/running
|
||||
}
|
||||
[ "$start_old" = "ON" ] && cronset '保守模式守护进程' "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh shellcrash #ShellCrash保守模式守护进程"
|
||||
cronload | grep -v '^$' > "$TMPDIR"/cron_tmp
|
||||
[ -s "$CRASHDIR"/task/cron ] && cat "$CRASHDIR"/task/cron >> "$TMPDIR"/cron_tmp
|
||||
[ -s "$CRASHDIR"/task/running ] && cat "$CRASHDIR"/task/running >> "$TMPDIR"/cron_tmp
|
||||
[ "$bot_tg_service" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程" >> "$TMPDIR"/cron_tmp
|
||||
[ "$start_old" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh shellcrash #ShellCrash保守模式守护进程" >> "$TMPDIR"/cron_tmp
|
||||
awk '!x[$0]++' "$TMPDIR"/cron_tmp > "$TMPDIR"/cron_tmp2 #删除重复行
|
||||
cronadd "$TMPDIR"/cron_tmp2
|
||||
rm -f "$TMPDIR"/cron_tmp "$TMPDIR"/cron_tmp2
|
||||
#加载条件任务
|
||||
[ -s "$CRASHDIR"/task/afstart ] && { . "$CRASHDIR"/task/afstart; } &
|
||||
[ -s "$CRASHDIR"/task/affirewall -a -s /etc/init.d/firewall -a ! -f /etc/init.d/firewall.bak ] && {
|
||||
#注入防火墙
|
||||
line=$(grep -En "fw.* restart" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i.bak "${line}a\\. "$CRASHDIR"/task/affirewall" /etc/init.d/firewall
|
||||
sed -i.bak "${line}a\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
line=$(grep -En "fw.* start" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i "${line}a\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
} &
|
||||
exit 0
|
||||
else
|
||||
. "$CRASHDIR"/starts/start_error.sh
|
||||
"$CRASHDIR"/start.sh stop
|
||||
fi
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
[ ! -f "$TMPDIR" ] && mkdir -p "$TMPDIR"
|
||||
|
||||
#当上次启动失败时终止自启动
|
||||
[ -f "CRASHDIR"/.start_error ] && exit 1
|
||||
[ -f "$CRASHDIR"/.start_error ] && exit 1
|
||||
#加载工具
|
||||
. "$CRASHDIR"/libs/check_cmd.sh
|
||||
. "$CRASHDIR"/libs/check_target.sh
|
||||
@@ -18,7 +18,7 @@
|
||||
. "$CRASHDIR"/starts/check_geo.sh
|
||||
. "$CRASHDIR"/starts/check_core.sh
|
||||
#缺省值
|
||||
[ -z "$redir_mod" ] && [ "$USER" = "root" -o "$USER" = "admin" ] && redir_mod='Redir模式'
|
||||
[ -z "$redir_mod" ] && [ "$USER" = "root" -o "$USER" = "admin" ] && redir_mod='Redir'
|
||||
[ -z "$dns_mod" ] && dns_mod='redir_host'
|
||||
[ -z "$redir_mod" ] && firewall_area='4'
|
||||
routing_mark=$((fwmark + 2))
|
||||
@@ -97,6 +97,10 @@ fi
|
||||
[ ! -s "$BINDIR"/ui/index.html ] && makehtml #如没有面板则创建跳转界面
|
||||
catpac #生成pac文件
|
||||
#内核及内核配置文件检查
|
||||
[ "$CRASHDIR" != "$BINDIR" ] && {
|
||||
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 #准备目录
|
||||
@@ -135,7 +139,7 @@ fi
|
||||
fi
|
||||
}
|
||||
#加载系统内核组件
|
||||
[ "$redir_mod" = "Tun模式" -o "$redir_mod" = "混合模式" ] && ckcmd modprobe && modprobe tun 2>/dev/null
|
||||
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" ] && ckcmd modprobe && modprobe tun 2>/dev/null
|
||||
#清理debug日志
|
||||
rm -rf /tmp/ShellCrash/debug.log
|
||||
rm -rf "$CRASHDIR"/debug.log
|
||||
|
||||
@@ -6,13 +6,12 @@
|
||||
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 2>/dev/null)" ] && {
|
||||
[ ! -f "$TMPDIR"/CrashCore ] && {
|
||||
logger "未找到【$crashcore】核心,正在下载!" 33
|
||||
[ -z "$cpucore" ] && . "$CRASHDIR"/libs/check_cpucore.sh && check_cpucore
|
||||
[ -z "$cpucore" ] && logger 找不到设备的CPU信息,请手动指定处理器架构类型! 31 && exit 1
|
||||
core_webget || logger "核心下载失败,请重新运行或更换安装源!" 31
|
||||
}
|
||||
[ ! -x "$TMPDIR"/CrashCore ] && chmod +x "$TMPDIR"/CrashCore 2>/dev/null #自动授权
|
||||
[ "$start_old" != "ON" -a "$(cat /proc/1/comm)" = "systemd" ] && restorecon -RF "$CRASHDIR" 2>/dev/null #修复SELinux权限问题
|
||||
[ "$start_old" != "ON" ] && [ "$(cat /proc/1/comm)" = "systemd" ] && restorecon -RF "$CRASHDIR" 2>/dev/null #修复SELinux权限问题
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -5,16 +5,16 @@ clash_check() { #clash启动前检查
|
||||
#检测是否存在高级版规则或者tun模式
|
||||
if [ "$crashcore" = "clash" ]; then
|
||||
[ -n "$(cat $core_config | grep -aiE '^script:|proxy-providers|rule-providers|rule-set')" ] ||
|
||||
[ "$redir_mod" = "混合模式" ] ||
|
||||
[ "$redir_mod" = "Tun模式" ] && core_exchange meta '当前内核不支持的配置'
|
||||
[ "$redir_mod" = "Mix" ] ||
|
||||
[ "$redir_mod" = "Tun" ] && core_exchange meta '当前内核不支持的配置'
|
||||
fi
|
||||
[ "$crashcore" = "clash" ] && [ "$firewall_area" = 2 -o "$firewall_area" = 3 ] && [ -z "$(grep '0:7890' /etc/passwd)" ] &&
|
||||
core_exchange meta '当前内核不支持非root用户启用本机代理'
|
||||
check_core
|
||||
#预下载GeoIP数据库并排除存在自定义数据库链接的情况
|
||||
[ -n "$(grep -oEi 'geoip:' "$CRASHDIR"/yamls/config.yaml)" ] && check_geo Country.mmdb cn_mini.mmdb
|
||||
#预下载GeoSite数据库并排除存在自定义数据库链接的情况
|
||||
[ -n "$(grep -oEi 'geosite:' "$CRASHDIR"/yamls/config.yaml)" ] && check_geo GeoSite.dat geosite.dat
|
||||
#预下载GeoIP数据库
|
||||
grep -qEi 'GEOIP,CN' "$CRASHDIR"/yamls/config.yaml && ! grep -Eq '^[[:space:]]*geodata-mode:' "$CRASHDIR"/yamls/*.yaml && check_geo Country.mmdb cn_mini.mmdb
|
||||
#预下载GeoSite数据库
|
||||
grep -qEi 'GEOSITE,' "$CRASHDIR"/yamls/config.yaml && ! grep -Eq '^[[:space:]]*geosite:' "$CRASHDIR"/yamls/*.yaml && check_geo GeoSite.dat geosite.dat
|
||||
#预下载cn.mrs数据库
|
||||
[ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && ! grep -Eq '^[[:space:]]*cn:' "$CRASHDIR"/yamls/*.yaml && check_geo ruleset/cn.mrs mrs_geosite_cn.mrs
|
||||
return 0
|
||||
|
||||
@@ -6,7 +6,7 @@ modify_yaml() {
|
||||
##########需要变更的配置###########
|
||||
[ "$ipv6_dns" != "OFF" ] && dns_v6='true' || dns_v6='false'
|
||||
external="external-controller: 0.0.0.0:$db_port"
|
||||
if [ "$redir_mod" = "混合模式" -o "$redir_mod" = "Tun模式" ]; then
|
||||
if [ "$redir_mod" = "Mix" -o "$redir_mod" = "Tun" ]; then
|
||||
[ "$crashcore" = 'meta' ] && tun_meta=', device: utun, auto-route: false, auto-detect-interface: false'
|
||||
tun="tun: {enable: true, stack: system$tun_meta}"
|
||||
else
|
||||
@@ -15,7 +15,7 @@ modify_yaml() {
|
||||
exper='experimental: {ignore-resolve-fail: true, interface-name: en0}'
|
||||
#Meta内核专属配置
|
||||
[ "$crashcore" = 'meta' ] && {
|
||||
[ "$redir_mod" != "纯净模式" ] && [ -z "$(grep 'PROCESS' "$CRASHDIR"/yamls/*.yaml)" ] && find_process='find-process-mode: "off"'
|
||||
[ -z "$(grep 'PROCESS' "$CRASHDIR"/yamls/*.yaml)" ] && find_process='find-process-mode: "off"'
|
||||
#ecs优化
|
||||
[ "$ecs_subnet" = ON ] && {
|
||||
. "$CRASHDIR"/libs/get_ecsip.sh
|
||||
@@ -36,6 +36,7 @@ dns:
|
||||
use-hosts: true
|
||||
ipv6: $dns_v6
|
||||
default-nameserver: [ $dns_resolver ]
|
||||
direct-nameserver: [ $dns_nameserver ]
|
||||
enhanced-mode: fake-ip
|
||||
fake-ip-range: 28.0.0.0/8
|
||||
fake-ip-range6: fc00::/16
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
. "$CRASHDIR"/libs/compare.sh
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/logger.sh
|
||||
|
||||
update_servers() { #更新servers.list
|
||||
get_bin "$TMPDIR"/servers.list public/servers.list
|
||||
@@ -14,9 +15,9 @@ update_servers() { #更新servers.list
|
||||
gen_ua(){ #自动生成ua
|
||||
[ -z "$user_agent" -o "$user_agent" = "auto" ] && {
|
||||
if echo "$crashcore" | grep -q 'singbox'; then
|
||||
user_agent="sing-box/singbox/$core_v"
|
||||
user_agent="sing-box/$core_v"
|
||||
elif [ "$crashcore" = meta ]; then
|
||||
user_agent="clash.meta/mihomo/$core_v"
|
||||
user_agent="clash.meta/mihomo"
|
||||
else
|
||||
user_agent="clash"
|
||||
fi
|
||||
@@ -41,10 +42,12 @@ get_core_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') #还原转义
|
||||
fi
|
||||
#输出
|
||||
echo "-----------------------------------------------"
|
||||
logger "正在连接服务器获取【$target】配置文件…………"
|
||||
logger "正在连接服务器获取【$target】配置文件…………" 36
|
||||
echo -e "链接地址为:\033[4;32m$Https\033[0m"
|
||||
echo 可以手动复制该链接到浏览器打开并查看数据是否正常!
|
||||
#获取在线config文件
|
||||
@@ -65,7 +68,7 @@ get_core_config() { #下载内核配置文件
|
||||
exit 1
|
||||
else
|
||||
retry=$((retry + 1))
|
||||
logger "配置文件获取失败!" 31
|
||||
logger "配置文件获取失败!" 31 off on
|
||||
if [ "$retry" = 1 ]; then
|
||||
echo -e "\033[32m尝试更新服务器列表并使用其他服务器获取配置!\033[0m"
|
||||
update_servers
|
||||
|
||||
@@ -2,25 +2,36 @@
|
||||
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}' | tr '\n' ' ' | sed 's/ $//') #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}') #ipv4局域网网段
|
||||
[ "$ipv6_redir" = "ON" ] && host_ipv6=$(ip -6 route show default | awk '{print $3}' | tr '\n' ' ' | sed 's/ $//') #ipv6公网地址段
|
||||
[ -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'
|
||||
}
|
||||
#添加自定义ipv4局域网网段
|
||||
if [ "$replace_default_host_ipv4" == "ON" ]; then
|
||||
host_ipv4="$cust_host_ipv4"
|
||||
else
|
||||
host_ipv4="$host_ipv4 $cust_host_ipv4"
|
||||
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_ipv6="fe80::/10 fd00::/8 $host_ipv6"
|
||||
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)
|
||||
[ -z "$local_ipv4" ] && local_ipv4=$(ip route 2>&1 | grep -Eo 'src.*' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort -u)
|
||||
|
||||
@@ -170,7 +170,7 @@ start_iptables() { #iptables配置总入口
|
||||
#启动公网访问防火墙
|
||||
[ "$fw_wan" != OFF ] && start_ipt_wan
|
||||
#分模式设置流量劫持
|
||||
[ "$redir_mod" = "Redir模式" -o "$redir_mod" = "混合模式" ] && {
|
||||
[ "$redir_mod" = "Redir" -o "$redir_mod" = "Mix" ] && {
|
||||
JUMP="REDIRECT --to-ports $redir_port" #跳转劫持的具体命令
|
||||
[ "$lan_proxy" = true ] && {
|
||||
start_ipt_route iptables nat PREROUTING shellcrash tcp #ipv4-局域网tcp转发
|
||||
@@ -193,7 +193,7 @@ start_iptables() { #iptables配置总入口
|
||||
}
|
||||
}
|
||||
}
|
||||
[ "$redir_mod" = "Tproxy模式" ] && {
|
||||
[ "$redir_mod" = "Tproxy" ] && {
|
||||
modprobe xt_TPROXY >/dev/null 2>&1
|
||||
JUMP="TPROXY --on-port $tproxy_port --tproxy-mark $fwmark" #跳转劫持的具体命令
|
||||
if $iptable -j TPROXY -h 2>/dev/null | grep -q '\--on-port'; then
|
||||
@@ -230,14 +230,14 @@ start_iptables() { #iptables配置总入口
|
||||
fi
|
||||
}
|
||||
}
|
||||
[ "$redir_mod" = "Tun模式" -o "$redir_mod" = "混合模式" -o "$redir_mod" = "T&U旁路转发" -o "$redir_mod" = "TCP旁路转发" ] && {
|
||||
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" -o "$redir_mod" = "T&U旁路转发" -o "$redir_mod" = "TCP旁路转发" ] && {
|
||||
JUMP="MARK --set-mark $fwmark" #跳转劫持的具体命令
|
||||
[ "$redir_mod" = "Tun模式" -o "$redir_mod" = "T&U旁路转发" ] && protocol=all
|
||||
[ "$redir_mod" = "混合模式" ] && protocol=udp
|
||||
[ "$redir_mod" = "Tun" -o "$redir_mod" = "T&U旁路转发" ] && protocol=all
|
||||
[ "$redir_mod" = "Mix" ] && protocol=udp
|
||||
[ "$redir_mod" = "TCP旁路转发" ] && protocol=tcp
|
||||
if $iptable -j MARK -h 2>/dev/null | grep -q '\--set-mark'; then
|
||||
[ "$lan_proxy" = true ] && {
|
||||
[ "$redir_mod" = "Tun模式" -o "$redir_mod" = "混合模式" ] && $iptable -I FORWARD -o utun -j ACCEPT
|
||||
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" ] && $iptable -I FORWARD -o utun -j ACCEPT
|
||||
start_ipt_route iptables mangle PREROUTING shellcrash_mark $protocol
|
||||
}
|
||||
[ "$local_proxy" = true ] && start_ipt_route iptables mangle OUTPUT shellcrash_mark_out $protocol
|
||||
@@ -247,7 +247,7 @@ start_iptables() { #iptables配置总入口
|
||||
[ "$ipv6_redir" = "ON" ] && [ "$crashcore" != clashpre ] && {
|
||||
if $ip6table -j MARK -h 2>/dev/null | grep -q '\--set-mark'; then
|
||||
[ "$lan_proxy" = true ] && {
|
||||
[ "$redir_mod" = "Tun模式" -o "$redir_mod" = "混合模式" ] && $ip6table -I FORWARD -o utun -j ACCEPT
|
||||
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" ] && $ip6table -I FORWARD -o utun -j ACCEPT
|
||||
start_ipt_route ip6tables mangle PREROUTING shellcrashv6_mark $protocol
|
||||
}
|
||||
[ "$local_proxy" = true ] && start_ipt_route ip6tables mangle OUTPUT shellcrashv6_mark_out $protocol
|
||||
@@ -275,16 +275,16 @@ start_iptables() { #iptables配置总入口
|
||||
[ "$local_proxy" = true ] && start_ipt_dns iptables OUTPUT shellcrash_dns_out #ipv4-本机dns转发
|
||||
}
|
||||
#屏蔽QUIC
|
||||
[ "$quic_rj" = 'ON' -a "$lan_proxy" = true -a "$redir_mod" != "Redir模式" ] && {
|
||||
[ "$quic_rj" = 'ON' -a "$lan_proxy" = true -a "$redir_mod" != "Redir" ] && {
|
||||
[ "$dns_mod" != "fake-ip" -a "$cn_ip_route" = "ON" ] && {
|
||||
set_cn_ip='-m set ! --match-set cn_ip dst'
|
||||
set_cn_ip6='-m set ! --match-set cn_ip6 dst'
|
||||
}
|
||||
[ "$redir_mod" = "Tun模式" -o "$redir_mod" = "混合模式" ] && {
|
||||
[ "$redir_mod" = "Tun" -o "$redir_mod" = "Mix" ] && {
|
||||
$iptable -I FORWARD -p udp --dport 443 -o utun $set_cn_ip -j REJECT >/dev/null 2>&1
|
||||
$ip6table -I FORWARD -p udp --dport 443 -o utun $set_cn_ip6 -j REJECT >/dev/null 2>&1
|
||||
}
|
||||
[ "$redir_mod" = "Tproxy模式" ] && {
|
||||
[ "$redir_mod" = "Tproxy" ] && {
|
||||
$iptable -I INPUT -p udp --dport 443 $set_cn_ip -j REJECT >/dev/null 2>&1
|
||||
$ip6table -I INPUT -p udp --dport 443 $set_cn_ip6 -j REJECT >/dev/null 2>&1
|
||||
}
|
||||
|
||||
@@ -96,7 +96,7 @@ start_nft_route() { #nftables-route通用工具
|
||||
#添加通用路由
|
||||
nft add rule inet shellcrash "$1" "$JUMP"
|
||||
#处理特殊路由
|
||||
[ "$redir_mod" = "混合模式" ] && {
|
||||
[ "$redir_mod" = "Mix" ] && {
|
||||
nft add rule inet shellcrash $1 meta l4proto tcp mark set $((fwmark + 1))
|
||||
nft add chain inet shellcrash "$1"_mixtcp { type nat hook $2 priority -100 \; }
|
||||
nft add rule inet shellcrash "$1"_mixtcp mark $((fwmark + 1)) meta l4proto tcp redirect to $redir_port
|
||||
@@ -168,12 +168,12 @@ start_nftables() { #nftables配置总入口
|
||||
[ "$local_proxy" = true ] && start_nft_dns output output #本机dns转发
|
||||
}
|
||||
#分模式设置流量劫持
|
||||
[ "$redir_mod" = "Redir模式" ] && {
|
||||
[ "$redir_mod" = "Redir" ] && {
|
||||
JUMP="meta l4proto tcp redirect to $redir_port" #跳转劫持的具体命令
|
||||
[ "$lan_proxy" = true ] && start_nft_route prerouting prerouting nat -100
|
||||
[ "$local_proxy" = true ] && start_nft_route output output nat -100
|
||||
}
|
||||
[ "$redir_mod" = "Tproxy模式" ] && (modprobe nft_tproxy >/dev/null 2>&1 || lsmod 2>/dev/null | grep -q nft_tproxy) && {
|
||||
[ "$redir_mod" = "Tproxy" ] && (modprobe nft_tproxy >/dev/null 2>&1 || lsmod 2>/dev/null | grep -q nft_tproxy) && {
|
||||
JUMP="meta l4proto {tcp, udp} mark set $fwmark tproxy to :$tproxy_port" #跳转劫持的具体命令
|
||||
[ "$lan_proxy" = true ] && start_nft_route prerouting prerouting filter -150
|
||||
[ "$local_proxy" = true ] && {
|
||||
@@ -184,8 +184,8 @@ start_nftables() { #nftables配置总入口
|
||||
}
|
||||
}
|
||||
[ "$tun_statu" = true ] && {
|
||||
[ "$redir_mod" = "Tun模式" ] && JUMP="meta l4proto {tcp, udp} mark set $fwmark" #跳转劫持的具体命令
|
||||
[ "$redir_mod" = "混合模式" ] && JUMP="meta l4proto udp mark set $fwmark" #跳转劫持的具体命令
|
||||
[ "$redir_mod" = "Tun" ] && JUMP="meta l4proto {tcp, udp} mark set $fwmark" #跳转劫持的具体命令
|
||||
[ "$redir_mod" = "Mix" ] && JUMP="meta l4proto udp mark set $fwmark" #跳转劫持的具体命令
|
||||
[ "$lan_proxy" = true ] && {
|
||||
start_nft_route prerouting prerouting filter -150
|
||||
#放行流量
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
[ -z "$common_ports" ] && common_ports='ON'
|
||||
[ -z "$multiport" ] && multiport='22,80,443,8080,8443'
|
||||
[ "$common_ports" = "ON" ] && ports="-m multiport --dports $multiport"
|
||||
[ -z "$redir_mod" ] && [ "$USER" = "root" -o "$USER" = "admin" ] && redir_mod='Redir模式'
|
||||
[ -z "$redir_mod" ] && [ "$USER" = "root" -o "$USER" = "admin" ] && redir_mod='Redir'
|
||||
[ -z "$dns_mod" ] && dns_mod='redir_host'
|
||||
[ -z "$redir_mod" ] && firewall_area='4'
|
||||
|
||||
#设置策略路由
|
||||
[ "$firewall_area" != 4 ] && {
|
||||
[ "$redir_mod" = "Tproxy模式" ] && ip route add local default dev lo table $table 2>/dev/null
|
||||
[ "$redir_mod" = "Tun模式" -o "$redir_mod" = "混合模式" ] && {
|
||||
[ "$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
|
||||
@@ -28,13 +28,13 @@
|
||||
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" != "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
|
||||
[ "$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" != "Redir" ] && ip -6 rule add fwmark $fwmark table $((table + 1)) 2>/dev/null
|
||||
}
|
||||
#判断代理用途
|
||||
[ "$firewall_area" = 2 -o "$firewall_area" = 3 ] && local_proxy=true
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user