mirror of
https://github.com/juewuy/ShellCrash.git
synced 2026-03-11 07:51:45 +00:00
Compare commits
285 Commits
1.9.4rc4.1
...
1.9.5alpha
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
178228d8ec | ||
|
|
f99d5f974b | ||
|
|
692f2590d5 | ||
|
|
243e51dd5c | ||
|
|
0261e5ecd4 | ||
|
|
215fc29c35 | ||
|
|
21366a0667 | ||
|
|
6077061ba4 | ||
|
|
62a54a458a | ||
|
|
e468129572 | ||
|
|
60bee9039d | ||
|
|
a71ca7c362 | ||
|
|
27d7b0cdf1 | ||
|
|
1211c48dbd | ||
|
|
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 | ||
|
|
e8651591ff | ||
|
|
9b7c5e658c | ||
|
|
a80c5b5c42 | ||
|
|
382a9b7be3 | ||
|
|
fc247210cb | ||
|
|
df6ea47e2e | ||
|
|
41595bb643 | ||
|
|
25c0680e3a | ||
|
|
90682a06f4 | ||
|
|
a73efc839e | ||
|
|
8d82fcb88f | ||
|
|
148251bb7f | ||
|
|
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 | ||
|
|
01848bdeea | ||
|
|
1dd48baca2 | ||
|
|
3f6b38b5fb | ||
|
|
09d794083c | ||
|
|
8b2bff3b03 | ||
|
|
bd5b9b315e | ||
|
|
b5a314ce67 | ||
|
|
8a9a294604 | ||
|
|
de9c890559 | ||
|
|
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 | ||
|
|
c84a92b2e5 | ||
|
|
0cb57d1d7b | ||
|
|
329db0d9f2 | ||
|
|
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
|
||||
|
||||
31
.github/workflows/update_meta_core.yaml
vendored
31
.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
|
||||
@@ -189,10 +189,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}/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'
|
||||
|
||||
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).
|
||||
|
||||
234
README_CN.md
234
README_CN.md
@@ -1,9 +1,6 @@
|
||||
<h1 align="center">
|
||||
<br>ShellCrash<br>
|
||||
</h1>
|
||||
<h1 align="center">ShellCrash</h1>
|
||||
|
||||
|
||||
<p align="center">
|
||||
<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>
|
||||
@@ -12,147 +9,184 @@
|
||||
</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: 机场推荐
|
||||
|
||||
- [**Dler-墙洞**](https://dler.pro/auth/register?affid=89698),多年稳定运行,功能齐全。
|
||||
- [**大米**](https://1s.bigmeok.me/user#/register?code=2PuWY9I7),群友力荐,流媒体解锁,月付推荐。
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
meta_v=v1.19.17
|
||||
singboxr_v=1.13.0-alpha.27
|
||||
versionsh=1.9.4rc1.1
|
||||
versionsh=1.9.5alpha6.1
|
||||
GeoIP_v=20251205
|
||||
|
||||
359
install.sh
359
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
|
||||
language=chs
|
||||
[ -z "$url" ] && url="https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@master"
|
||||
|
||||
# 内置工具
|
||||
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
|
||||
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,109 +42,99 @@ 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() {
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[36m请选择一个别名,或使用自定义别名:\033[0m"
|
||||
cecho "\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 退出安装"
|
||||
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
|
||||
1) my_alias=crash ;;
|
||||
2) my_alias=sc ;;
|
||||
3) my_alias=mm ;;
|
||||
0) echo "安装已取消"; exit 1 ;;
|
||||
*) my_alias=$res ;;
|
||||
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" ] && {
|
||||
$echo "\033[33m此别名和当前系统内置命令/别名冲突,请换一个!\033[0m"
|
||||
cecho "\033[33m此别名和当前系统内置命令/别名冲突,请换一个!\033[0m"
|
||||
sleep 1
|
||||
set_alias
|
||||
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() {
|
||||
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 "-----------------------------------------------"
|
||||
$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 退出安装"
|
||||
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
|
||||
@@ -162,47 +154,78 @@ setdir() {
|
||||
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 退出安装"
|
||||
}
|
||||
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)
|
||||
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
|
||||
set_asus_usb
|
||||
;;
|
||||
2)
|
||||
cecho "如开机无法正常自启,请重新使用U盘+下载大师安装!"
|
||||
sleep 2
|
||||
dir=/jffs
|
||||
;;
|
||||
*)
|
||||
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 退出安装"
|
||||
}
|
||||
set_cust_dir() {
|
||||
while true; do
|
||||
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 -Eq '^/(tmp|opt|sys)(/|$)')" ]; then
|
||||
cecho "\033[31m路径错误!请重新设置!\033[0m"
|
||||
continue
|
||||
fi
|
||||
break 1
|
||||
done
|
||||
}
|
||||
|
||||
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
|
||||
@@ -225,111 +248,125 @@ setdir() {
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ ! -w $dir ]; then
|
||||
$echo "\033[31m没有$dir目录写入权限!请重新设置!\033[0m" && sleep 1 && setdir
|
||||
if [ ! -w "$dir" ]; then
|
||||
cecho "\033[31m没有$dir目录写入权限!请重新设置!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
$echo "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail $dir -h)"
|
||||
cecho "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail "$dir" -h)"
|
||||
read -p "确认安装?(1/0) > " res
|
||||
[ "$res" = "1" ] && CRASHDIR=$dir/ShellCrash || setdir
|
||||
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" ] && {
|
||||
|
||||
# 安装检查
|
||||
check_systype() {
|
||||
[ -f "/etc/storage/started_script.sh" ] && {
|
||||
systype=Padavan #老毛子固件
|
||||
initdir='/etc/storage/started_script.sh'
|
||||
}
|
||||
[ -d "/jffs" ] && {
|
||||
}
|
||||
[ -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设备
|
||||
}
|
||||
[ -f "/data/etc/crontabs/root" ] && systype=mi_snapshot #小米设备
|
||||
[ -w "/var/mnt/cfg/firewall" ] && systype=ng_snapshot #NETGEAR设备
|
||||
|
||||
#检查root权限
|
||||
if [ "$USER" != "root" -a -z "$systype" ]; then
|
||||
echo 当前用户:$USER
|
||||
$echo "\033[31m请尽量使用root用户(不要直接使用sudo命令!)执行安装!\033[0m"
|
||||
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
|
||||
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
|
||||
|
||||
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
|
||||
# 输出
|
||||
cecho "最新版本:\033[32m$versionsh\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
$echo "检测到旧的安装目录\033[36m$CRASHDIR\033[0m,是否覆盖安装?"
|
||||
$echo "\033[32m覆盖安装时不会移除配置文件!\033[0m"
|
||||
read -p "覆盖安装/卸载旧版本?(1/0) > " res
|
||||
case "$res" in
|
||||
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
|
||||
;;
|
||||
0)
|
||||
rm -rf $CRASHDIR
|
||||
2)
|
||||
[ "$CRASHDIR" != "/" ] && rm -rf "$CRASHDIR"
|
||||
echo "-----------------------------------------------"
|
||||
$echo "\033[31m 旧版本文件已卸载!\033[0m"
|
||||
cecho "\033[31m 旧版本文件已卸载!\033[0m"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
9)
|
||||
echo "测试模式,变更安装位置"
|
||||
echo "测试模式,变更安装位置 $CRASHDIR"
|
||||
setdir
|
||||
install
|
||||
;;
|
||||
*)
|
||||
$echo "\033[31m输入错误!已取消安装!\033[0m"
|
||||
cecho "\033[31m已取消安装!\033[0m"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
else
|
||||
else
|
||||
setdir
|
||||
install
|
||||
fi
|
||||
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
|
||||
@@ -8,6 +8,8 @@ proxy-groups:
|
||||
- {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: 🎮 游戏平台, type: select, proxies: [🚀 节点选择, 🎯 全球直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🛡️ 直连域名, type: select, proxies: [🎯 全球直连, 🚀 节点选择]}
|
||||
|
||||
@@ -7,6 +7,8 @@ proxy-groups:
|
||||
- {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: 🎮 游戏平台, type: select, proxies: [🚀 节点选择, 🎯 全球直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇯🇵 日本节点, 🇸🇬 新加坡节点, 🇺🇸 美国节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
|
||||
- {name: 🍎 苹果服务, type: select, proxies: [🎯 全球直连, 🚀 节点选择]}
|
||||
@@ -77,6 +79,22 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games-cn.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflix:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/netflix.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/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@refs/heads/mihomo-ruleset/youtube.mrs"
|
||||
interval: 86400
|
||||
|
||||
media:
|
||||
type: http
|
||||
behavior: domain
|
||||
@@ -141,6 +159,14 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/cnip.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflixip:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: mrs
|
||||
path: ./ruleset/netflixip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh//DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/netflixip.mrs"
|
||||
interval: 86400
|
||||
|
||||
mediaip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
@@ -172,6 +198,8 @@ rules:
|
||||
- RULE-SET,apple-cn,🍎 苹果服务
|
||||
- RULE-SET,google-cn,🇬 谷歌服务
|
||||
- RULE-SET,games-cn,🎮 游戏服务
|
||||
- RULE-SET,netflix,🎥 奈飞视频
|
||||
- RULE-SET,youtube,📹 油管视频
|
||||
- RULE-SET,media,🌍 国外媒体
|
||||
- RULE-SET,games,🎮 游戏平台
|
||||
- RULE-SET,ai,🤖 AI 平台
|
||||
@@ -180,6 +208,7 @@ rules:
|
||||
- RULE-SET,cn,🛡️ 直连域名
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,cnip,🀄️ 直连 IP
|
||||
- RULE-SET,netflixip,🎥 奈飞视频
|
||||
- RULE-SET,mediaip,🌍 国外媒体
|
||||
- RULE-SET,gamesip,🎮 游戏平台
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
|
||||
@@ -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,🔒 私有网络
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
{ "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": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
@@ -39,6 +41,8 @@
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
{ "rule_set": [ "games-cn" ], "outbound": "🎮 游戏服务" },
|
||||
{ "rule_set": [ "netflix" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "youtube" ], "outbound": "📹 油管视频" },
|
||||
{ "rule_set": [ "media" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "games" ], "outbound": "🎮 游戏平台" },
|
||||
{ "rule_set": [ "ai" ], "outbound": "🤖 AI 平台" },
|
||||
@@ -50,6 +54,7 @@
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
{ "rule_set": [ "cnip" ], "outbound": "🀄️ 直连 IP" },
|
||||
{ "rule_set": [ "netflixip" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🎮 游戏平台" }
|
||||
],
|
||||
@@ -110,6 +115,22 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/games-cn.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",
|
||||
@@ -174,6 +195,14 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "netflixip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"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",
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
{ "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": [ "🎯 本地直连", "🚀 节点选择" ] },
|
||||
@@ -36,6 +38,8 @@
|
||||
{ "rule_set": [ "apple-cn" ], "outbound": "🍎 苹果服务" },
|
||||
{ "rule_set": [ "google-cn" ], "outbound": "🇬 谷歌服务" },
|
||||
{ "rule_set": [ "games-cn" ], "outbound": "🎮 游戏服务" },
|
||||
{ "rule_set": [ "netflix" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "youtube" ], "outbound": "📹 油管视频" },
|
||||
{ "rule_set": [ "media" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "games" ], "outbound": "🎮 游戏平台" },
|
||||
{ "rule_set": [ "ai" ], "outbound": "🤖 AI 平台" },
|
||||
@@ -47,6 +51,7 @@
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
{ "rule_set": [ "cnip" ], "outbound": "🀄️ 直连 IP" },
|
||||
{ "rule_set": [ "netflixip" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" },
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🎮 游戏平台" }
|
||||
],
|
||||
@@ -99,6 +104,22 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/games-cn.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",
|
||||
@@ -163,6 +184,14 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "netflixip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"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",
|
||||
|
||||
@@ -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}] },
|
||||
@@ -29,18 +29,17 @@
|
||||
|
||||
{ "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,8 +48,8 @@
|
||||
],
|
||||
"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": "🛑 广告拦截" },
|
||||
|
||||
@@ -100,7 +100,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
|
||||
@@ -213,7 +216,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 +225,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"
|
||||
|
||||
11
scripts/lang/chs/1_start.lang
Normal file
11
scripts/lang/chs/1_start.lang
Normal file
@@ -0,0 +1,11 @@
|
||||
# ===== 启动完成 =====
|
||||
START_SERVICE_OK="服务已启动!"
|
||||
START_WEB_HINT="请前往"
|
||||
START_WEB_HINT2="管理内置规则"
|
||||
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地址)"
|
||||
12
scripts/lang/chs/common.lang
Normal file
12
scripts/lang/chs/common.lang
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
COMMON_INPUT="请输入对应数字"
|
||||
COMMON_INPUT_L="请输入对应字母或数字"
|
||||
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域名real-ip,其它fake-ip分流"
|
||||
DNS_MODE_ROUTE_DESC="CN域名real-ip,其它dns2proxy分流"
|
||||
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="发布页面:"
|
||||
11
scripts/lang/en/1_start.lang
Normal file
11
scripts/lang/en/1_start.lang
Normal file
@@ -0,0 +1,11 @@
|
||||
# ===== Startup =====
|
||||
START_SERVICE_OK="Service started successfully!"
|
||||
START_WEB_HINT="Please use"
|
||||
START_WEB_HINT2="manage built-in rules"
|
||||
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)"
|
||||
12
scripts/lang/en/common.lang
Normal file
12
scripts/lang/en/common.lang
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
COMMON_INPUT="Please enter a number"
|
||||
COMMON_INPUT_L="Enter a letter or a number"
|
||||
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 real-ip, others use fake-ip routing"
|
||||
DNS_MODE_ROUTE_DESC="CN domains use real-ip, others use dns2proxy routing"
|
||||
DNS_MODE_REDIR_DESC="Insecure. Must be used with a third-party DNS service."
|
||||
|
||||
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:"
|
||||
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,3 +1,7 @@
|
||||
|
||||
[ -n "$__IS_LIB_LOGGER" ] && return
|
||||
__IS_LIB_LOGGER=1
|
||||
|
||||
#日志工具
|
||||
. "$CRASHDIR"/libs/web_json.sh
|
||||
#$1日志内容$2显示颜色$3是否推送
|
||||
|
||||
345
scripts/menu.sh
345
scripts/menu.sh
@@ -5,54 +5,99 @@ CRASHDIR=$(
|
||||
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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$MENU_RESTART_NOTICE\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) 立即重启"
|
||||
content_line "0) 暂不重启"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
start_service
|
||||
fi
|
||||
}
|
||||
|
||||
checkport() { #检查端口冲突
|
||||
# 检查端口冲突
|
||||
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
|
||||
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"
|
||||
# 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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "【$portx】:$MENU_PORT_CONFLICT_TITLE"
|
||||
content_line "\033[0m$(echo "$conflict_line" | head -n 1)\033[0m"
|
||||
content_line "\033[36m$MENU_PORT_CONFLICT_HINT\033[0m"
|
||||
separator_line "="
|
||||
|
||||
. "$CRASHDIR"/menus/2_settings.sh && set_adv_config
|
||||
. "$CRASHDIR"/libs/get_config.sh
|
||||
checkport
|
||||
|
||||
# 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() { #脚本启动前检查
|
||||
|
||||
# 脚本启动前检查
|
||||
ckstatus() {
|
||||
|
||||
versionsh=$(cat "$CRASHDIR"/version)
|
||||
[ -n "$versionsh" ] && versionsh_l=$versionsh
|
||||
[ -z "$redir_mod" ] && redir_mod=纯净模式
|
||||
#获取本机host地址
|
||||
[ -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='设备IP地址'
|
||||
#dashboard目录位置
|
||||
[ -z "$host" ] && host='$MENU_IP_DF'
|
||||
|
||||
# dashboard目录位置
|
||||
if [ -f /www/clash/index.html ]; then
|
||||
dbdir=/www/clash
|
||||
hostdir=/clash
|
||||
@@ -60,115 +105,148 @@ ckstatus() { #脚本启动前检查
|
||||
dbdir="$CRASHDIR"/ui
|
||||
hostdir=":$db_port/ui"
|
||||
fi
|
||||
#开机自启检测
|
||||
|
||||
if check_autostart; then
|
||||
auto="\033[32m已设置开机启动!\033[0m"
|
||||
auto1="\033[36m禁用\033[0mShellCrash开机启动"
|
||||
auto="\033[32m$MENU_AUTOSTART_ON\033[0m"
|
||||
else
|
||||
auto="\033[31m未设置开机启动!\033[0m"
|
||||
auto1="\033[36m允许\033[0mShellCrash开机启动"
|
||||
auto="\033[31m$MENU_AUTOSTART_OFF\033[0m"
|
||||
fi
|
||||
#获取运行状态
|
||||
|
||||
PID=$(pidof CrashCore | awk '{print $NF}')
|
||||
if [ -n "$PID" ]; then
|
||||
run="\033[32m正在运行($redir_mod)\033[0m"
|
||||
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已设置($redir_mod)\033[0m"
|
||||
run="\033[32m$MENU_RUN_SET($redir_mod$MENU_MOD)\033[0m"
|
||||
else
|
||||
run="\033[31m没有运行($redir_mod)\033[0m"
|
||||
#检测系统端口占用
|
||||
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并处于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 "-----------------------------------------------"
|
||||
#检查新手引导
|
||||
# [ "$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"/menus/8_tools.sh && userguide
|
||||
fi
|
||||
#检查执行权限
|
||||
|
||||
# 检查执行权限
|
||||
[ ! -x "$CRASHDIR"/start.sh ] && chmod +x "$CRASHDIR"/start.sh
|
||||
#检查/tmp内核文件
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[30;43m$MENU_WELCOME\033[0m"
|
||||
content_right "Ver: $versionsh_l"
|
||||
content_line "$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 "="
|
||||
|
||||
# 检查/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
|
||||
echo -e "发现可用的内核文件: \033[36m/tmp/$file\033[0m "
|
||||
read -p "是否加载(会停止当前服务)?(1/0) > " res
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "$MENU_TMP_CORE_FOUND \033[36m/tmp/$file\033[0m"
|
||||
content_line "$MENU_TMP_CORE_ASK"
|
||||
separator_line "="
|
||||
content_line "1) 立即加载"
|
||||
content_line "0) 暂不加载"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && {
|
||||
line_break
|
||||
separator_line "="
|
||||
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 "
|
||||
content_line "\033[32m$MENU_CORE_LOADED_OK\033[0m"
|
||||
separator_line "="
|
||||
switch_core
|
||||
else
|
||||
echo -e "\033[33m检测到不可用的内核文件!可能是文件受损或CPU架构不匹配!\033[0m"
|
||||
content_line "\033[33m$MENU_CORE_LOADED_BAD\033[0m"
|
||||
rm -rf /tmp/"$file"
|
||||
echo -e "\033[33m内核文件已移除,请认真检查后重新上传!\033[0m"
|
||||
content_line "\033[33m$MENU_CORE_REMOVED\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
sleep 1
|
||||
}
|
||||
echo "-----------------------------------------------"
|
||||
done
|
||||
#检查/tmp配置文件
|
||||
|
||||
# 检查/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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "$MENU_TMP_CFG_FOUND \033[36m/tmp/$file\033[0m"
|
||||
content_line "$MENU_TMP_CFG_ASK"
|
||||
separator_line "="
|
||||
content_line "1) 立即加载"
|
||||
content_line "0) 暂不加载"
|
||||
separator_line "="
|
||||
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
|
||||
echo -e "\033[32m配置文件加载完成!\033[0m "
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$MENU_CFG_LOADED_OK\033[0m "
|
||||
separator_line "="
|
||||
sleep 1
|
||||
}
|
||||
done
|
||||
#检查禁用配置覆写
|
||||
|
||||
# 检查禁用配置覆写
|
||||
[ "$disoverride" = "1" ] && {
|
||||
echo -e "\033[33m你已经禁用了配置文件覆写功能,这会导致大量脚本功能无法使用!\033[0m "
|
||||
read -p "是否取消禁用?(1/0) > " res
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m$MENU_OVERRIDE_WARN\033[0m"
|
||||
content_line "$MENU_OVERRIDE_ASK"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否"
|
||||
separator_line "="
|
||||
read -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && unset disoverride && setconfig disoverride
|
||||
echo "-----------------------------------------------"
|
||||
}
|
||||
}
|
||||
|
||||
#主菜单
|
||||
main_menu() {
|
||||
#############################
|
||||
while true; do
|
||||
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
|
||||
|
||||
content_line "1) \033[32m$MENU_MAIN_1\033[0m"
|
||||
content_line "2) \033[36m$MENU_MAIN_2\033[0m"
|
||||
content_line "3) \033[31m$MENU_MAIN_3\033[0m"
|
||||
content_line "4) \033[33m$MENU_MAIN_4\033[0m"
|
||||
content_line "5) \033[32m$MENU_MAIN_5\033[0m"
|
||||
content_line "6) \033[36m$MENU_MAIN_6\033[0m"
|
||||
content_line "7) \033[33m$MENU_MAIN_7\033[0m"
|
||||
content_line "8) $MENU_MAIN_8"
|
||||
content_line "9) \033[32m$MENU_MAIN_9\033[0m"
|
||||
content_line "0) $MENU_MAIN_0"
|
||||
separator_line "="
|
||||
read -r -p "$MENU_MAIN_PROMPT" num
|
||||
|
||||
case "$num" in
|
||||
0)
|
||||
exit
|
||||
"" | 0)
|
||||
line_break
|
||||
exit 0
|
||||
;;
|
||||
1)
|
||||
start_service
|
||||
exit
|
||||
line_break
|
||||
;;
|
||||
2)
|
||||
checkcfg=$(cat "$CFG_PATH")
|
||||
@@ -177,27 +255,25 @@ main_menu() {
|
||||
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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m$corename$MENU_SERVICE_STOPPED\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
;;
|
||||
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
|
||||
@@ -208,11 +284,9 @@ main_menu() {
|
||||
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")
|
||||
@@ -221,31 +295,34 @@ main_menu() {
|
||||
checkcfg_new=$(cat "$CFG_PATH")
|
||||
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
|
||||
fi
|
||||
main_menu
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
exit
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
"")
|
||||
"")
|
||||
main_menu
|
||||
;;
|
||||
-t)
|
||||
shtype=sh
|
||||
ckcmd bash && shtype=bash
|
||||
$shtype -x "$CRASHDIR"/menu.sh
|
||||
-l)
|
||||
main_menu
|
||||
;;
|
||||
-s)
|
||||
-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)
|
||||
-i)
|
||||
. "$CRASHDIR"/init.sh 2>/dev/null
|
||||
;;
|
||||
-st)
|
||||
-st)
|
||||
shtype=sh
|
||||
ckcmd bash && shtype=bash
|
||||
"$shtype" -x "$CRASHDIR"/starts/bfstart.sh
|
||||
@@ -254,47 +331,61 @@ case "$1" in
|
||||
"$shtype" -x "$CRASHDIR"/starts/afstart.sh
|
||||
"$CRASHDIR"/start.sh stop
|
||||
;;
|
||||
-d)
|
||||
-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 -----------------------------------------
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "$MENU_TEST_RUNNING_1"
|
||||
content_line "$MENU_TEST_RUNNING_2\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
separator_line "="
|
||||
"$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
|
||||
line_break
|
||||
cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug
|
||||
if [ -s "$TMPDIR"/sh_bug ]; then
|
||||
echo "==========================================================="
|
||||
while read line; do
|
||||
echo -e "发现错误:\033[33;4m$line\033[0m"
|
||||
echo -e "$MENU_ERROR_FOUND\033[33;4m$line\033[0m"
|
||||
grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log
|
||||
echo -----------------------------------------
|
||||
echo "==========================================================="
|
||||
done <"$TMPDIR"/sh_bug
|
||||
rm -rf "$TMPDIR"/sh_bug
|
||||
echo -e "\033[32m测试完成!\033[0m完整执行记录请查看:\033[36m$TMPDIR/debug_sh.log\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$MENU_TEST_DONE_FAIL\033[0m"
|
||||
content_line "$MENU_TEST_LOG_HINT\033[36m$TMPDIR/debug_sh.log\033[0m"
|
||||
separator_line "="
|
||||
else
|
||||
echo -e "\033[32m测试完成!没有发现问题,请重新启动服务~\033[0m"
|
||||
rm -rf "$TMPDIR"/debug_sh.log
|
||||
separator_line "="
|
||||
content_line "\033[32m$MENU_TEST_DONE_OK\033[0m"
|
||||
separator_line "="
|
||||
line_break
|
||||
fi
|
||||
"$CRASHDIR"/start.sh stop
|
||||
;;
|
||||
-u)
|
||||
-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 -----------------------------------------
|
||||
*)
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "$MENU_WELCOME"
|
||||
separator_line "="
|
||||
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,77 @@
|
||||
|
||||
[ -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}"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$START_SERVICE_OK\033[0m"
|
||||
content_line "$START_WEB_HINT \033[4;36mhttp://$host$hostdir\033[0m $START_WEB_HINT2"
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m$START_NO_CORE_CFG_TRY_GEN\033[0m"
|
||||
separator_line "="
|
||||
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
|
||||
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
|
||||
}
|
||||
else
|
||||
echo -e "\033[31m没有找到${crashcore}配置文件,请先导入配置文件!\033[0m"
|
||||
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m$START_NO_CORE_CFG_IMPORT_FIRST\033[0m"
|
||||
separator_line "="
|
||||
. "$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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$START_FIREWALL_DONE\033[0m"
|
||||
separator_line "="
|
||||
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,263 @@ 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 "-----------------------------------------------"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[30;47m启动设置菜单\033[0m"
|
||||
separator_line "="
|
||||
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"
|
||||
content_line "6) 自启网络检查: \033[36m$(printf '%-4s' "$network_check")\033[0m ———禁用则跳过自启时网络检查"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
line_break
|
||||
separator_line "="
|
||||
if check_autostart; then
|
||||
# 禁止自启动:删除各系统的启动项
|
||||
disable_autostart
|
||||
echo -e "\033[33m已禁止ShellCrash开机启动!\033[0m"
|
||||
content_line "\033[33m已禁止ShellCrash开机自启动!\033[0m"
|
||||
else
|
||||
# 允许自启动:配置各系统的启动项
|
||||
allow_autostart
|
||||
echo -e "\033[32m已设置ShellCrash开机启动!\033[0m"
|
||||
content_line "\033[32m已设置ShellCrash开机自启动!\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
;;
|
||||
2)
|
||||
line_break
|
||||
separator_line "="
|
||||
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
|
||||
content_line "\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
|
||||
|
||||
content_line "\033[32m改为使用系统守护进程启动服务!\033[0m"
|
||||
else
|
||||
echo -e "\033[31m当前设备不支持以其他模式启动!!\033[0m"
|
||||
content_line "\033[31m当前设备不支持以其他模式启动!\033[0m"
|
||||
fi
|
||||
fi
|
||||
separator_line "="
|
||||
sleep 1
|
||||
;;
|
||||
3)
|
||||
echo -e "\033[33m如果你的设备启动后可以正常使用,则无需设置!!\033[0m"
|
||||
echo -e "\033[36m推荐设置为30~120秒之间,请根据设备问题自行试验\033[0m"
|
||||
read -p "请输入启动延迟时间(0~300秒) > " sec
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m如果你的设备启动后可以正常使用,则无需设置!\033[0m"
|
||||
content_line "\033[36m推荐设置为30~120秒之间,请根据设备问题自行试验\033[0m"
|
||||
separator_line "="
|
||||
read -r -p "请输入启动延迟时间(0~300秒)> " sec
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
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"
|
||||
content_line "\033[32m设置成功!\033[0m"
|
||||
;;
|
||||
*)
|
||||
echo -e "\033[31m输入有误,或超过300秒,请重新输入!\033[0m"
|
||||
content_line "\033[31m输入有误,或超过300秒,请重新输入!\033[0m"
|
||||
;;
|
||||
esac
|
||||
separator_line "="
|
||||
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}')
|
||||
line_break
|
||||
separator_line "="
|
||||
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"
|
||||
content_line "\033[33m您的设备空间充足(>20M),无需开启!\033[0m"
|
||||
elif [ "$start_old" != 'ON' ] && [ "$(cat /proc/1/comm)" = "systemd" ]; then
|
||||
content_line "\033[33m不支持systemd启动模式,请先启用保守模式!\033[0m"
|
||||
else
|
||||
[ "$BINDIR" = "$CRASHDIR" ] && BINDIR="$TMPDIR"
|
||||
echo -e "\033[32m已经启用小闪存功能!\033[0m"
|
||||
echo -e "如需更换目录,请使用【设置小闪存目录】功能\033[0m"
|
||||
content_line "\033[32m已经启用小闪存功能!\033[0m"
|
||||
content_line "如需更换目录,请使用【设置小闪存目录】功能\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
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"
|
||||
content_line "\033[31m您的设备剩余空间不足8M,停用后可能无法正常运行!\033[0m"
|
||||
content_line "是否确认停用此功能:"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
BINDIR="$CRASHDIR"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m已经停用小闪存功能!\033[0m"
|
||||
separator_line "="
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
rm -rf /tmp/ShellCrash
|
||||
BINDIR="$CRASHDIR"
|
||||
echo -e "\033[33m已经停用小闪存功能!\033[0m"
|
||||
content_line "\033[33m已经停用小闪存功能!\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
fi
|
||||
setconfig 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
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m如设置到内存,则每次开机后都自动重新下载相关文件\033[0m"
|
||||
content_line "\033[33m请确保安装源可用裸连,否则会导致启动失败\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) 使用内存(/tmp)"
|
||||
content_line "2) 选择U盘目录"
|
||||
content_line "3) 自定义目录"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
BINDIR="$TMPDIR"
|
||||
;;
|
||||
2)
|
||||
set_usb_dir() {
|
||||
echo "请选择安装目录"
|
||||
du -hL /mnt | awk '{print " "NR" "$2" "$1}'
|
||||
read -p "请输入相应数字 > " num
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请选择安装目录:"
|
||||
separator_line "="
|
||||
du -hL /mnt |
|
||||
awk '{print NR") "$2" (已占用的储存空间:"$1")"}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -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
|
||||
if [ "$num" = 0 ]; then
|
||||
return 1
|
||||
elif [ -z "$BINDIR" ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误!请重新设置!\033[0m"
|
||||
separator_line "="
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
}
|
||||
set_usb_dir
|
||||
if [ $? -eq 1 ]; then
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
input_dir() {
|
||||
read -p "请输入自定义目录 > " BINDIR
|
||||
if [ ! -d "$BINDIR" ]; then
|
||||
echo "\033[31m输入错误!请重新设置!\033[0m"
|
||||
input_dir
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请直接输入命令语句"
|
||||
content_line "或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入> " BINDIR
|
||||
if [ "$BINDIR" = 0 ]; then
|
||||
return 1
|
||||
elif [ ! -d "$BINDIR" ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误!请重新设置!\033[0m"
|
||||
separator_line "="
|
||||
continue
|
||||
fi
|
||||
return 0
|
||||
done
|
||||
}
|
||||
input_dir
|
||||
if [ $? -eq 1 ]; then
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
setconfig 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' ] && {
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m如果你的设备启动后可以正常使用,则无需变更设置!\033[0m"
|
||||
content_line "\033[36m禁用时,如果使用了小闪存模式或者rule-set等在线规则,则可能会因无法联网而导致启动失败!\033[0m"
|
||||
content_line "\033[32m启用时,会导致部分性能较差或者拨号较慢的设备可能会因查询超时导致启动失败!\033[0m"
|
||||
separator_line "="
|
||||
|
||||
if [ "$network_check" = "OFF" ]; then
|
||||
content_line "当前\033[33m已禁用\033[0m自启网络检查,是否确认启用:"
|
||||
else
|
||||
content_line "当前\033[33m已启用\033[0m自启网络检查,是否确认禁用:"
|
||||
fi
|
||||
|
||||
separator_line "-"
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
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"
|
||||
}
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
@@ -4,176 +4,263 @@
|
||||
[ -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
|
||||
|
||||
# 任务工具
|
||||
set_cron() {
|
||||
[ -z "$week" ] && week=*
|
||||
[ -z "$hour" ] && hour=*
|
||||
[ -z "$min" ] && min=0
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m$cron_time\033[0m执行任务:\033[36m$task_name\033[0m"
|
||||
content_line ""
|
||||
content_line "是否确认添加定时任务:"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否"
|
||||
separator_line "="
|
||||
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"
|
||||
echo -e "任务【$cron_time$task_name】\033[32m已添加!\033[0m"
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "任务【$cron_time$task_name】\033[32m已添加!\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
unset week hour min
|
||||
sleep 1
|
||||
}
|
||||
set_service(){
|
||||
|
||||
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
|
||||
[ -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
|
||||
echo "$task_txt" >>"$task_file"
|
||||
[ -n "$(pidof CrashCore)" ] && cronset "$3" "$task_txt"
|
||||
else
|
||||
echo "$CRASHDIR/task/task.sh $2 $3" >> $task_file
|
||||
echo "$CRASHDIR/task/task.sh $2 $3" >>"$task_file"
|
||||
fi
|
||||
echo -e "任务【$3】\033[32m添加成功!\033[0m"
|
||||
content_line "任务【$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_user_add() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m命令可包含空格,请确保命令可执行!\033[0m"
|
||||
content_line "\033[36m请勿附带执行条件,执行条件请在命令添加完成后再返回设置!\033[0m"
|
||||
content_line "亦可手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m以添加命令"
|
||||
separator_line "-"
|
||||
content_line "请直接输入命令语句"
|
||||
content_line "或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入> " script
|
||||
if [ "$script" = 0 ]; then
|
||||
break
|
||||
elif [ -n "$script" ]; then
|
||||
task_command=$script
|
||||
echo -e "请检查输入:\033[32m$task_command\033[0m"
|
||||
#获取本任务ID
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请检查输入:\033[32m$task_command\033[0m"
|
||||
separator_line "="
|
||||
# 获取本任务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
|
||||
read -r -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"
|
||||
echo "$task_id#$task_command#$task_name" >>"$CRASHDIR"/task/task.user
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m自定义任务已添加!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
break
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误,请重新输入!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
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
|
||||
|
||||
# 自定义命令删除
|
||||
task_user_del() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
if grep -Evq '^#' "$CRASHDIR/task/task.user" 2>/dev/null; then
|
||||
content_line "请输入对应ID移除对应自定义任务(不会影响内置任务)"
|
||||
content_line "也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m"
|
||||
separator_line "="
|
||||
|
||||
grep -Ev '^#' "$CRASHDIR/task/task.user" 2>/dev/null |
|
||||
awk -F '#' '{print $1") "$3}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
if [ "$num" = 0 ]; then
|
||||
break
|
||||
elif [ -n "$num" ]; then
|
||||
sed -i "/^$num#/d" "$CRASHDIR"/task/task.user 2>/dev/null
|
||||
[ "$num" != 0 ] && task_user_del
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误,请重新输入!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
else
|
||||
content_line "\033[33m你暂未添加任何自定义任务\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
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
|
||||
|
||||
# 任务添加
|
||||
task_add() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[36m请选择需要添加的任务:\033[0m"
|
||||
separator_line "="
|
||||
# 输出任务列表
|
||||
# cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print NR") "$3}'
|
||||
grep -Ev '^(#|$)' "$CRASHDIR/task/task.list" "$CRASHDIR/task/task.user" 2>/dev/null |
|
||||
awk -F '#' '{print NR") "$3}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0)
|
||||
break
|
||||
;;
|
||||
[1-9]|[1-9][0-9])
|
||||
if [ "$num" -le "$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | wc -l)" ];then
|
||||
[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
|
||||
break
|
||||
else
|
||||
errornum
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
task_del(){ #任务删除
|
||||
#删除定时任务
|
||||
croncmd -l > "$TMPDIR"/cron
|
||||
|
||||
# 任务删除
|
||||
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
|
||||
|
||||
# 任务条件选择菜单
|
||||
task_type() {
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请选择任务\033[36m【$task_name】\033[0m执行条件:"
|
||||
separator_line "="
|
||||
content_line "1) 定时任务\033[32m每周执行\033[0m"
|
||||
content_line "2) 定时任务\033[32m每日执行\033[0m"
|
||||
content_line "3) 定时任务\033[32m每小时执行\033[0m"
|
||||
content_line "4) 定时任务\033[32m每分钟执行\033[0m"
|
||||
content_line " - - - - - - - - -\033[31m注意\033[0m- - - - - - - - -"
|
||||
content_line " 逻辑水平不及格的请勿使用下方触发条件!"
|
||||
content_line " - - - - - - - - - - - - - - - - - - - -"
|
||||
content_line "5) 服务\033[33m启动前执行\033[0m"
|
||||
content_line "6) 服务\033[33m启动后执行\033[0m"
|
||||
content_line "7) 服务\033[33m运行时每分钟执行\033[0m"
|
||||
content_line "8) 防火墙服务\033[33m重启后执行\033[0m"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "输入 1~7 对应\033[33m每周的指定某天\033[0m运行(7=周日)"
|
||||
content_line "输入 1,4,0 代表\033[36m每周一、周四、周日\033[0m运行"
|
||||
content_line "输入 1~5 代表\033[36m周一至周五\033[0m运行"
|
||||
separator_line "="
|
||||
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换成日
|
||||
# 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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "输入 1,7,15 代表\033[36m每到1,7,15点\033[0m运行"
|
||||
content_line "输入 6~18 代表\033[36m早6点至晚18点间每小时\033[0m运行"
|
||||
separator_line "="
|
||||
read -r -p "想在每日的具体哪个小时执行?(0~23)> " hour
|
||||
|
||||
read -r -p "想在具体哪分钟执行?(0~59的整数)> " min
|
||||
cron_time="在每日的$hour点$min分"
|
||||
[ -n "$min" ] && [ -n "$hour" ] && set_cron
|
||||
;;
|
||||
3)
|
||||
echo "-----------------------------------------------"
|
||||
read -p "想每隔多少小时执行一次?(1-23的整数) > " num
|
||||
line_break
|
||||
read -r -p "想每隔多少小时执行一次?(1~23的整数)> " num
|
||||
hour="*/$num"
|
||||
cron_time="每隔$num小时"
|
||||
[ -n "$hour" ] && set_cron
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
read -p "想每隔多少分钟执行一次?(1-59的整数) > " num
|
||||
line_break
|
||||
read -r -p "想每隔多少分钟执行一次?(1~59的整数)> " num
|
||||
min="*/$num"
|
||||
cron_time="每隔$num分钟"
|
||||
[ -n "$min" ] && set_cron
|
||||
@@ -185,11 +272,13 @@ task_type(){ #任务条件选择菜单
|
||||
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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "输入10即每隔10分钟运行一次,1440即每隔24小时运行一次"
|
||||
content_line "大于60分钟的数值将按小时取整,且按当前时区记时"
|
||||
separator_line "="
|
||||
read -r -p "想每隔多少分钟执行一次?(1~1440的整数)> " num
|
||||
if [ "$num" -lt 60 ]; then
|
||||
min="$num"
|
||||
cron_time="*/$min * * * *"
|
||||
time_des="$min分钟"
|
||||
@@ -201,8 +290,15 @@ task_type(){ #任务条件选择菜单
|
||||
[ -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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "该功能会将相关启动代码注入到/etc/init.d/firewall中"
|
||||
content_line "是否确认继续:"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " res
|
||||
[ "$res" = 1 ] && set_service affirewall "$task_id" "防火墙重启后$task_name"
|
||||
;;
|
||||
*)
|
||||
@@ -211,137 +307,186 @@ task_type(){ #任务条件选择菜单
|
||||
;;
|
||||
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
|
||||
|
||||
# 任务管理列表
|
||||
task_manager() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
# 抽取并生成临时列表
|
||||
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"
|
||||
# 判断为空则返回
|
||||
if [ ! -s "$TMPDIR"/task_list ]; then
|
||||
content_line "\033[31m当前没有可供管理的任务!\033[36m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
break
|
||||
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
|
||||
content_line "\033[33m已添加的任务:\033[0m"
|
||||
separator_line "="
|
||||
# cat "$TMPDIR"/task_list | awk '{print NR ") " $2}'
|
||||
awk '{print NR ") " $2}' "$TMPDIR/task_list" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
|
||||
separator_line "-"
|
||||
content_line "a) 清空旧版任务"
|
||||
content_line "d) 清空任务列表"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0)
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
a)
|
||||
task_del "#"
|
||||
echo -e "\033[31m旧版任务已清空!\033[36m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m旧版任务已清空!\033[36m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
;;
|
||||
d)
|
||||
task_del "task.sh"
|
||||
echo -e "\033[31m全部任务已清空!\033[36m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m全部任务已清空!\033[36m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
;;
|
||||
[1-9]|[1-9][0-9])
|
||||
|
||||
[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
|
||||
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
|
||||
task_id=$(echo "$task_txt" | awk '{print $1}')
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ "$task_id" = 0 ]; then
|
||||
content_line "旧版任务不支持管理,是否移除:"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
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
|
||||
}
|
||||
rm -f "$TMPDIR"/conf
|
||||
|
||||
break
|
||||
fi
|
||||
else
|
||||
task_des=$(echo $task_txt | awk '{print $2}')
|
||||
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
|
||||
|
||||
content_line "当前任务为:\033[36m$task_des\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) \033[33m修改\033[0m当前任务"
|
||||
content_line "2) \033[31m删除\033[0m当前任务"
|
||||
content_line "3) \033[32m立即执行\033[0m一次"
|
||||
content_line "4) 查看\033[33m执行记录\033[0m"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0)
|
||||
"" | 0)
|
||||
continue
|
||||
;;
|
||||
1)
|
||||
task_type && task_del $task_des
|
||||
task_type && task_del "$task_des"
|
||||
;;
|
||||
2)
|
||||
task_del $task_des
|
||||
task_del "$task_des"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
;;
|
||||
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"
|
||||
eval "$task_command" && task_res='执行成功!' || task_res='执行失败!'
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m任务【$task_des】$task_res\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
if [ -n "$(cat "$TMPDIR"/ShellCrash.log | grep "$task_name")" ];then
|
||||
line_break
|
||||
if cat "$TMPDIR"/ShellCrash.log | grep -q "$task_name"; then
|
||||
cat "$TMPDIR"/ShellCrash.log | grep "$task_name"
|
||||
else
|
||||
echo -e "\033[31m未找到相关执行记录!\033[0m"
|
||||
separator_line "="
|
||||
content_line "\033[31m未找到相关执行记录!\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
sleep 1
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
task_manager
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
}
|
||||
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
|
||||
|
||||
# 任务推荐
|
||||
task_recom() {
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[36m是否启用以下推荐的自动任务配置:\033[0m"
|
||||
content_line "每隔10分钟自动保存面板配置"
|
||||
content_line "服务启动后自动同步ntp时间"
|
||||
content_line "在每日的3点0分重启服务"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " res
|
||||
[ "$res" = 1 ] && {
|
||||
line_break
|
||||
separator_line "="
|
||||
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"
|
||||
cronset "在每日的3点0分重启服务" "0 3 * * * ${CRASHDIR}/task/task.sh 103 在每日的3点0分重启服务" &&
|
||||
content_line "任务【在每日的3点0分重启服务】\033[32m添加成功!\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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[30;47m自动任务菜单\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) 添加\033[32m自动任务\033[0m"
|
||||
content_line "2) 管理\033[33m任务列表\033[0m"
|
||||
content_line "3) 查看\033[36m任务日志\033[0m"
|
||||
content_line "4) 配置\033[36m日志推送\033[0m"
|
||||
content_line "5) 添加\033[33m自定义任务\033[0m"
|
||||
content_line "6) 删除\033[33m自定义任务\033[0m"
|
||||
content_line "7) 使用\033[32m推荐设置\033[0m"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -354,17 +499,21 @@ task_menu() {
|
||||
rm -rf "$TMPDIR"/task_list
|
||||
;;
|
||||
3)
|
||||
if [ -n "$(cat "$TMPDIR"/ShellCrash.log | grep '任务【')" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
line_break
|
||||
if cat "$TMPDIR"/ShellCrash.log | grep -q '任务【'; then
|
||||
cat "$TMPDIR"/ShellCrash.log | grep '任务【'
|
||||
else
|
||||
echo -e "\033[31m未找到任务相关执行日志!\033[0m"
|
||||
fi
|
||||
separator_line "="
|
||||
content_line "\033[31m未找到任务相关执行日志!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m请在日志工具中配置相关推送通道及推送开关\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[36m请在日志工具中配置相关推送通道及推送开关\033[0m"
|
||||
separator_line "="
|
||||
. "$CRASHDIR"/menus/8_tools.sh && log_pusher
|
||||
;;
|
||||
5)
|
||||
@@ -379,7 +528,6 @@ task_menu() {
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,151 +8,220 @@ __IS_MODULE_7_GATEWAY_LOADED=1
|
||||
. "$CRASHDIR"/menus/check_port.sh
|
||||
. "$CRASHDIR"/libs/gen_base64.sh
|
||||
|
||||
#访问与控制主菜单
|
||||
gateway(){
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[30;47m欢迎使用访问与控制菜单:\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 配置\033[33m公网访问防火墙 \033[32m$fw_wan\033[0m"
|
||||
echo -e " 2 配置\033[36mTelegram专属控制机器人 \033[32m$bot_tg_service\033[0m"
|
||||
echo -e " 3 配置\033[36mDDNS自动域名\033[0m"
|
||||
# 访问与控制主菜单
|
||||
gateway() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[30;47m访问与控制\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) 配置\033[33m公网访问防火墙 \033[32m$fw_wan\033[0m"
|
||||
content_line "2) 配置\033[36mTelegram专属控制机器人 \033[32m$bot_tg_service\033[0m"
|
||||
content_line "3) 配置\033[36mDDNS自动域名\033[0m"
|
||||
[ "$disoverride" != "1" ] && {
|
||||
echo -e " 4 自定义\033[33m公网Vmess入站\033[0m节点 \033[32m$vms_service\033[0m"
|
||||
echo -e " 5 自定义\033[33m公网ShadowSocks入站\033[0m节点 \033[32m$sss_service\033[0m"
|
||||
echo -e " 6 配置\033[36mTailscale内网穿透\033[0m(限Singbox) \033[32m$ts_service\033[0m"
|
||||
echo -e " 7 配置\033[36mWireguard客户端\033[0m(限Singbox) \033[32m$wg_service\033[0m"
|
||||
content_line "4) 自定义\033[33m公网Vmess入站\033[0m节点 \033[32m$vms_service\033[0m"
|
||||
content_line "5) 自定义\033[33m公网ShadowSocks入站\033[0m节点 \033[32m$sss_service\033[0m"
|
||||
content_line "6) 配置\033[36mTailscale内网穿透\033[0m(限Singbox) \033[32m$ts_service\033[0m"
|
||||
content_line "7) 配置\033[36mWireguard客户端\033[0m(限Singbox) \033[32m$wg_service\033[0m"
|
||||
}
|
||||
echo -e " 0 返回上级菜单"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
echo "-----------------------------------------------"
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ -n "$(pidof CrashCore)" ] && [ "$firewall_mod" = 'iptables' ]; then
|
||||
read -p "需要先停止服务,是否继续?(1/0) > " res
|
||||
[ "$res" = 1 ] && "$CRASHDIR"/start.sh stop && set_fw_wan
|
||||
content_line "\033[33m公网访问防火墙需要先停止服务\033[0m"
|
||||
content_line "是否确认继续:"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
"$CRASHDIR"/start.sh stop && set_fw_wan
|
||||
else
|
||||
continue
|
||||
fi
|
||||
else
|
||||
set_fw_wan
|
||||
fi
|
||||
gateway
|
||||
;;
|
||||
2)
|
||||
set_bot_tg
|
||||
gateway
|
||||
;;
|
||||
3)
|
||||
. "$CRASHDIR"/menus/ddns.sh && ddns_menu
|
||||
gateway
|
||||
;;
|
||||
4)
|
||||
set_vmess
|
||||
gateway
|
||||
;;
|
||||
5)
|
||||
set_shadowsocks
|
||||
gateway
|
||||
;;
|
||||
6)
|
||||
if echo "$crashcore" | grep -q 'sing';then
|
||||
if echo "$crashcore" | grep -q 'sing'; then
|
||||
set_tailscale
|
||||
else
|
||||
echo -e "\033[33m$crashcore内核暂不支持此功能,请先更换内核!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m$crashcore内核暂不支持此功能,请先更换内核!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
gateway
|
||||
;;
|
||||
7)
|
||||
if echo "$crashcore" | grep -q 'sing';then
|
||||
if echo "$crashcore" | grep -q 'sing'; then
|
||||
set_wireguard
|
||||
else
|
||||
echo -e "\033[33m$crashcore内核暂不支持此功能,请先更换内核!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[33m$crashcore内核暂不支持此功能,请先更换内核!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
gateway
|
||||
;;
|
||||
*) errornum ;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
#公网防火墙
|
||||
|
||||
# 公网防火墙
|
||||
set_fw_wan() {
|
||||
while true; do
|
||||
[ -z "$fw_wan" ] && fw_wan=ON
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m如在vps运行,还需在vps安全策略对相关端口同时放行"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m如在vps运行,还需在vps安全策略对相关端口同时放行"
|
||||
[ -n "$fw_wan_ports" ] &&
|
||||
echo -e "当前手动放行端口:\033[36m$fw_wan_ports\033[0m"
|
||||
content_line "当前手动放行端口:\033[36m$fw_wan_ports\033[0m"
|
||||
[ -n "$vms_port$sss_port" ] &&
|
||||
echo -e "当前自动放行端口:\033[36m$vms_port $sss_port\033[0m"
|
||||
echo -e "默认拦截端口:\033[33m$mix_port,$db_port\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 启用/关闭公网防火墙: \033[36m$fw_wan\033[0m"
|
||||
echo -e " 2 添加放行端口(可包含默认拦截端口)"
|
||||
echo -e " 3 移除指定手动放行端口"
|
||||
echo -e " 4 清空全部手动放行端口"
|
||||
echo -e " 0 返回上级菜单"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
content_line "当前自动放行端口:\033[36m$vms_port $sss_port\033[0m"
|
||||
content_line "默认拦截端口:\033[33m$mix_port,$db_port\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) 启用/关闭公网防火墙:\033[36m$fw_wan\033[0m"
|
||||
content_line "2) 添加放行端口(可包含默认拦截端口)"
|
||||
content_line "3) 移除指定手动放行端口"
|
||||
content_line "4) 清空全部手动放行端口"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case $num in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ "$fw_wan" = ON ];then
|
||||
read -p "确认关闭防火墙?这会带来极大的安全隐患!(1/0) > " res
|
||||
[ "$res" = 1 ] && fw_wan=OFF || fw_wan=ON
|
||||
if [ "$fw_wan" = ON ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "是否确认关闭防火墙?"
|
||||
content_line "这会带来极大的安全隐患!"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
fw_wan=OFF
|
||||
else
|
||||
fw_wan=ON
|
||||
fi
|
||||
else
|
||||
fw_wan=ON
|
||||
fi
|
||||
setconfig fw_wan "$fw_wan"
|
||||
set_fw_wan
|
||||
;;
|
||||
2)
|
||||
port_count=$(echo "$fw_wan_ports" | awk -F',' '{print NF}' )
|
||||
if [ "$port_count" -ge 10 ];then
|
||||
echo -e "\033[31m最多支持设置放行10个端口,请先减少一些!\033[0m"
|
||||
line_break
|
||||
port_count=$(echo "$fw_wan_ports" | awk -F',' '{print NF}')
|
||||
if [ "$port_count" -ge 10 ]; then
|
||||
separator_line "="
|
||||
content_line "\033[31m最多支持设置放行10个端口,请先减少一些!\033[0m"
|
||||
separator_line "="
|
||||
else
|
||||
read -p "请输入要放行的端口号 > " port
|
||||
if echo ",$fw_wan_ports," | grep -q ",$port,";then
|
||||
echo -e "\033[31m输入错误!请勿重复添加!\033[0m"
|
||||
read -r -p "请输入要放行的端口号> " port
|
||||
if echo ",$fw_wan_ports," | grep -q ",$port,"; then
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误!请勿重复添加!\033[0m"
|
||||
separator_line "="
|
||||
elif [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
separator_line "="
|
||||
else
|
||||
fw_wan_ports=$(echo "$fw_wan_ports,$port" | sed "s/^,//")
|
||||
setconfig fw_wan_ports "$fw_wan_ports"
|
||||
fi
|
||||
fi
|
||||
sleep 1
|
||||
set_fw_wan
|
||||
;;
|
||||
3)
|
||||
read -p "请输入要移除的端口号 > " port
|
||||
if echo ",$fw_wan_ports," | grep -q ",$port,";then
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请直接输入要移除的端口号"
|
||||
content_line "或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入> " port
|
||||
if [ "$port" = 0 ]; then
|
||||
break
|
||||
elif echo ",$fw_wan_ports," | grep -q ",$port,"; then
|
||||
if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误!\033[0m"
|
||||
content_line "\033[31m请输入正确的数值(1-65535)!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
else
|
||||
fw_wan_ports=$(echo ",$fw_wan_ports," | sed "s/,$port//; s/^,//; s/,$//")
|
||||
setconfig fw_wan_ports "$fw_wan_ports"
|
||||
break
|
||||
fi
|
||||
else
|
||||
echo -e "\033[31m输入错误!请输入已添加过的端口!\033[0m"
|
||||
fi
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m输入错误!\033[0m"
|
||||
content_line "\033[31m请输入已添加过的端口!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
set_fw_wan
|
||||
fi
|
||||
done
|
||||
;;
|
||||
4)
|
||||
fw_wan_ports=''
|
||||
setconfig fw_wan_ports
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
set_fw_wan
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
#tg_BOT相关
|
||||
set_bot_tg_config(){
|
||||
|
||||
# tg_BOT相关
|
||||
set_bot_tg_config() {
|
||||
setconfig TG_TOKEN "$TOKEN" "$GT_CFG_PATH"
|
||||
setconfig TG_CHATID "$chat_ID" "$GT_CFG_PATH"
|
||||
#设置机器人快捷命令
|
||||
JSON=$(cat <<EOF
|
||||
# 设置机器人快捷命令
|
||||
JSON=$(
|
||||
cat <<EOF
|
||||
{
|
||||
"commands": [
|
||||
{"command": "$my_alias", "description": "呼出ShellCrash菜单"},
|
||||
@@ -160,15 +229,20 @@ set_bot_tg_config(){
|
||||
]
|
||||
}
|
||||
EOF
|
||||
)
|
||||
)
|
||||
TEXT="已完成Telegram机器人设置!请使用 /$my_alias 呼出功能菜单!"
|
||||
. "$CRASHDIR"/libs/web_json.sh
|
||||
bot_api="https://api.telegram.org/bot$TOKEN"
|
||||
web_json_post "$bot_api/setMyCommands" "$JSON"
|
||||
web_json_post "$bot_api/sendMessage" '{"chat_id":"'"$chat_ID"'","text":"'"$TEXT"'","parse_mode":"Markdown"}'
|
||||
echo -e "\033[32m$TEXT\033[0m"
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$TEXT\033[0m"
|
||||
separator_line "="
|
||||
}
|
||||
set_bot_tg_init(){
|
||||
|
||||
set_bot_tg_init() {
|
||||
. "$CRASHDIR"/menus/bot_tg_bind.sh && private_bot && set_bot
|
||||
if [ "$?" = 0 ]; then
|
||||
set_bot_tg_config
|
||||
@@ -177,8 +251,9 @@ set_bot_tg_init(){
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
set_bot_tg_service(){
|
||||
if [ "$bot_tg_service" = ON ];then
|
||||
|
||||
set_bot_tg_service() {
|
||||
if [ "$bot_tg_service" = ON ]; then
|
||||
bot_tg_service=OFF
|
||||
. "$CRASHDIR"/menus/bot_tg_service.sh && bot_tg_stop
|
||||
else
|
||||
@@ -187,85 +262,109 @@ set_bot_tg_service(){
|
||||
fi
|
||||
setconfig bot_tg_service "$bot_tg_service"
|
||||
}
|
||||
set_bot_tg(){
|
||||
|
||||
set_bot_tg() {
|
||||
while true; do
|
||||
[ -n "$ts_auth_key" ] && ts_auth_key_info='已设置'
|
||||
[ -n "$TG_CHATID" ] && TG_CHATID_info='已绑定'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m由于网络环境原因,此机器人仅限服务启动时运行!"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 启用/关闭TG-BOT服务 \033[32m$bot_tg_service\033[0m"
|
||||
echo -e " 2 TG-BOT绑定设置 \033[32m$TG_CHATID_info\033[0m"
|
||||
echo -e " 0 返回上级菜单 \033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m由于网络环境原因,此机器人仅限服务启动时运行!"
|
||||
separator_line "="
|
||||
content_line "1) 启用/关闭TG-BOT服务 \033[32m$bot_tg_service\033[0m"
|
||||
content_line "2) TG-BOT绑定设置 \033[32m$TG_CHATID_info\033[0m"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
. "$GT_CFG_PATH"
|
||||
if [ -n "$TG_CHATID" ];then
|
||||
if [ -n "$TG_CHATID" ]; then
|
||||
set_bot_tg_service
|
||||
else
|
||||
echo -e "\033[31m请先绑定TG-BOT!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请先绑定TG-BOT!\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
sleep 1
|
||||
set_bot_tg
|
||||
;;
|
||||
2)
|
||||
if [ -n "$chat_ID" ] && [ -n "$push_TG" ] && [ "$push_TG" != 'publictoken' ]; then
|
||||
read -p "检测到已经绑定了TG推送BOT,是否直接使用?(1/0) > " res
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "检测到已经绑定了TG推送BOT"
|
||||
content_line "是否直接使用:"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
TOKEN="$push_TG"
|
||||
set_bot_tg_config
|
||||
set_bot_tg
|
||||
return
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
set_bot_tg_init
|
||||
set_bot_tg
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
#自定义入站
|
||||
set_vmess(){
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m设置的端口会添加到公网访问防火墙并自动放行!\n 脚本只提供基础功能,更多需求请用自定义配置文件功能!"
|
||||
echo -e " \033[31m切勿用于搭建违法翻墙节点,违者后果自负!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 \033[32m启用/关闭\033[0mVmess入站 \033[32m$vms_service\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 2 设置\033[36m监听端口\033[0m: \033[36m$vms_port\033[0m"
|
||||
echo -e " 3 设置\033[33mWS-path(可选)\033[0m: \033[33m$vms_ws_path\033[0m"
|
||||
echo -e " 4 设置\033[36m秘钥-uuid\033[0m: \033[36m$vms_uuid\033[0m"
|
||||
echo -e " 5 一键生成\033[32m随机秘钥\033[0m"
|
||||
echo -e " 6 设置\033[36m混淆host(可选)\033[0m: \033[33m$vms_host\033[0m"
|
||||
|
||||
# 自定义入站
|
||||
set_vmess() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m"
|
||||
content_line "设置的端口会添加到公网访问防火墙并自动放行!"
|
||||
content_line "脚本只提供基础功能,更多需求请用自定义配置文件功能!"
|
||||
content_line "\033[31m切勿用于搭建违法翻墙节点,违者后果自负!\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) \033[32m启用/关闭\033[0mVmess入站 \033[32m$vms_service\033[0m"
|
||||
content_line "2) 设置\033[36m监听端口\033[0m: \033[36m$vms_port\033[0m"
|
||||
content_line "3) 设置\033[33mWS-path(可选)\033[0m: \033[33m$vms_ws_path\033[0m"
|
||||
content_line "4) 设置\033[36m秘钥-uuid\033[0m: \033[36m$vms_uuid\033[0m"
|
||||
content_line "5) 一键生成\033[32m随机秘钥\033[0m"
|
||||
gen_base64 1 >/dev/null 2>&1 &&
|
||||
echo -e " 7 一键生成\033[32m分享链接\033[0m"
|
||||
echo -e " 0 返回上级菜单 \033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
content_line "6) 设置\033[36m混淆host(可选)\033[0m: \033[33m$vms_host\033[0m"
|
||||
content_line "7) 一键生成\033[32m分享链接\033[0m"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ "$vms_service" = ON ];then
|
||||
if [ "$vms_service" = ON ]; then
|
||||
vms_service=OFF
|
||||
setconfig vms_service "$vms_service"
|
||||
else
|
||||
if [ -n "$vms_port" ] && [ -n "$vms_uuid" ];then
|
||||
if [ -n "$vms_port" ] && [ -n "$vms_uuid" ]; then
|
||||
vms_service=ON
|
||||
setconfig vms_service "$vms_service"
|
||||
else
|
||||
echo -e "\033[31m请先完成必选设置!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请先完成必选设置!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
fi
|
||||
set_vmess
|
||||
;;
|
||||
2)
|
||||
read -p "请输入端口号(输入0删除) > " text
|
||||
if [ "$text" = 0 ];then
|
||||
line_break
|
||||
read -r -p "请输入端口号(输入0删除)> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
vms_port=''
|
||||
setconfig vms_port "" "$GT_CFG_PATH"
|
||||
elif check_port "$text"; then
|
||||
@@ -274,58 +373,64 @@ set_vmess(){
|
||||
else
|
||||
sleep 1
|
||||
fi
|
||||
set_vmess
|
||||
;;
|
||||
3)
|
||||
read -p "请输入ws-path路径(输入0删除) > " text
|
||||
if [ "$text" = 0 ];then
|
||||
line_break
|
||||
read -r -p "请输入ws-path路径(输入0删除)> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
vms_ws_path=''
|
||||
setconfig vms_ws_path "" "$GT_CFG_PATH"
|
||||
elif echo "$text" |grep -qE '^/';then
|
||||
elif echo "$text" | grep -qE '^/'; then
|
||||
vms_ws_path="$text"
|
||||
setconfig vms_ws_path "$text" "$GT_CFG_PATH"
|
||||
else
|
||||
echo -e "\033[31m不是合法的path路径,必须以【/】开头!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m不是合法的path路径,必须以【/】开头!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
set_vmess
|
||||
;;
|
||||
4)
|
||||
read -p "请输入UUID(输入0删除) > " text
|
||||
if [ "$text" = 0 ];then
|
||||
line_break
|
||||
read -r -p "请输入UUID(输入0删除)> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
vms_uuid=''
|
||||
setconfig vms_uuid "" "$GT_CFG_PATH"
|
||||
elif echo "$text" |grep -qiE '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$';then
|
||||
elif echo "$text" | grep -qiE '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'; then
|
||||
vms_uuid="$text"
|
||||
setconfig vms_uuid "$text" "$GT_CFG_PATH"
|
||||
else
|
||||
echo -e "\033[31m不是合法的UUID格式,请重新输入或使用随机生成功能!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m不是合法的UUID格式,请重新输入或使用随机生成功能!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
set_vmess
|
||||
;;
|
||||
5)
|
||||
vms_uuid=$(cat /proc/sys/kernel/random/uuid)
|
||||
setconfig vms_uuid "$vms_uuid" "$GT_CFG_PATH"
|
||||
sleep 1
|
||||
set_vmess
|
||||
;;
|
||||
6)
|
||||
read -p "请输入免流混淆host(输入0删除) > " text
|
||||
if [ "$text" = 0 ];then
|
||||
line_break
|
||||
read -r -p "请输入免流混淆host(输入0删除)> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
vms_host=''
|
||||
setconfig vms_host "" "$GT_CFG_PATH"
|
||||
else
|
||||
vms_host="$text"
|
||||
setconfig vms_host "$text" "$GT_CFG_PATH"
|
||||
fi
|
||||
set_vmess
|
||||
;;
|
||||
7)
|
||||
read -p "请输入本机公网IP(4/6)或域名 > " host_wan
|
||||
if [ -n "$host_wan" ] && [ -n "$vms_port" ] && [ -n "$vms_uuid" ];then
|
||||
line_break
|
||||
read -r -p "请输入本机公网IP(4/6)或域名> " host_wan
|
||||
if [ -n "$host_wan" ] && [ -n "$vms_port" ] && [ -n "$vms_uuid" ]; then
|
||||
[ -n "$vms_ws_path" ] && vms_net=ws
|
||||
vms_json=$(cat <<EOF
|
||||
vms_json=$(
|
||||
cat <<EOF
|
||||
{
|
||||
"v": "2",
|
||||
"ps": "ShellCrash_vms_in",
|
||||
@@ -339,54 +444,69 @@ set_vmess(){
|
||||
"host": "$vms_host"
|
||||
}
|
||||
EOF
|
||||
)
|
||||
)
|
||||
vms_link="vmess://$(gen_base64 "$vms_json")"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "你的分享链接是(请勿随意分享给他人):\n\033[32m$vms_link\033[0m"
|
||||
line_break
|
||||
echo -e "你的分享链接是(请勿随意分享给他人):\n\033[32m$vms_link\033[0m"
|
||||
else
|
||||
echo -e "\033[31m请先完成必选设置!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请先完成必选设置!\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
sleep 1
|
||||
set_vmess
|
||||
;;
|
||||
*) errornum ;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
set_shadowsocks(){
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m设置的端口会添加到公网访问防火墙并自动放行!\n 脚本只提供基础功能,更多需求请用自定义配置文件功能!"
|
||||
echo -e " \033[31m切勿用于搭建违法翻墙节点,违者后果自负!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 \033[32m启用/关闭\033[0mShadowSocks入站 \033[32m$sss_service\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 2 设置\033[36m监听端口\033[0m: \033[36m$sss_port\033[0m"
|
||||
echo -e " 3 选择\033[33m加密协议\033[0m: \033[33m$sss_cipher\033[0m"
|
||||
echo -e " 4 设置\033[36mpassword\033[0m: \033[36m$sss_pwd\033[0m"
|
||||
|
||||
set_shadowsocks() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m"
|
||||
content_line "设置的端口会添加到公网访问防火墙并自动放行!"
|
||||
content_line "脚本只提供基础功能,更多需求请用自定义配置文件功能!"
|
||||
content_line "\033[31m切勿用于搭建违法翻墙节点,违者后果自负!\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) \033[32m启用/关闭\033[0mShadowSocks入站 \033[32m$sss_service\033[0m"
|
||||
content_line "2) 设置\033[36m监听端口\033[0m: \033[36m$sss_port\033[0m"
|
||||
content_line "3) 选择\033[33m加密协议\033[0m: \033[33m$sss_cipher\033[0m"
|
||||
content_line "4) 设置\033[36mpassword\033[0m: \033[36m$sss_pwd\033[0m"
|
||||
gen_base64 1 >/dev/null 2>&1 &&
|
||||
echo -e " 5 一键生成分享链接"
|
||||
echo -e " 0 返回上级菜单 \033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
content_line "5) 一键生成分享链接"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ "$sss_service" = ON ];then
|
||||
if [ "$sss_service" = ON ]; then
|
||||
sss_service=OFF
|
||||
setconfig sss_service "$sss_service"
|
||||
else
|
||||
if [ -n "$sss_port" ] && [ -n "$sss_cipher" ] && [ -n "$sss_pwd" ];then
|
||||
if [ -n "$sss_port" ] && [ -n "$sss_cipher" ] && [ -n "$sss_pwd" ]; then
|
||||
sss_service=ON
|
||||
setconfig sss_service "$sss_service"
|
||||
else
|
||||
echo -e "\033[31m请先完成必选设置!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请先完成必选设置!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
fi
|
||||
set_shadowsocks
|
||||
;;
|
||||
2)
|
||||
read -p "请输入端口号(输入0删除) > " text
|
||||
if [ "$text" = 0 ];then
|
||||
line_break
|
||||
read -r -p "请输入端口号(输入0删除)> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
sss_port=''
|
||||
setconfig sss_port "" "$GT_CFG_PATH"
|
||||
elif check_port "$text"; then
|
||||
@@ -395,25 +515,30 @@ set_shadowsocks(){
|
||||
else
|
||||
sleep 1
|
||||
fi
|
||||
set_shadowsocks
|
||||
;;
|
||||
3)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 \033[32mxchacha20-ietf-poly1305\033[0m"
|
||||
echo -e " 2 \033[32mchacha20-ietf-poly1305\033[0m"
|
||||
echo -e " 3 \033[32maes-128-gcm\033[0m"
|
||||
echo -e " 4 \033[32maes-256-gcm\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请选择要使用的加密协议:"
|
||||
separator_line "="
|
||||
content_line "1) \033[32mxchacha20-ietf-poly1305\033[0m"
|
||||
content_line "2) \033[32mchacha20-ietf-poly1305\033[0m"
|
||||
content_line "3) \033[32maes-128-gcm\033[0m"
|
||||
content_line "4) \033[32maes-256-gcm\033[0m"
|
||||
gen_random 1 >/dev/null && {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m2022系列加密必须使用随机生成的password!"
|
||||
echo -e " 5 \033[32m2022-blake3-chacha20-poly1305\033[0m"
|
||||
echo -e " 6 \033[32m2022-blake3-aes-128-gcm\033[0m"
|
||||
echo -e " 7 \033[32m2022-blake3-aes-256-gcm\033[0m"
|
||||
content_line ""
|
||||
content_line " - - - - - - -\033[31m注意\033[0m- - - - - - -"
|
||||
content_line " 2022系列加密必须使用随机生成的password!"
|
||||
content_line "5) \033[32m2022-blake3-chacha20-poly1305\033[0m"
|
||||
content_line "6) \033[32m2022-blake3-aes-128-gcm\033[0m"
|
||||
content_line "7) \033[32m2022-blake3-aes-256-gcm\033[0m"
|
||||
}
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请选择要使用的加密协议 > " num
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
1)
|
||||
sss_cipher=xchacha20-ietf-poly1305
|
||||
sss_pwd=$(gen_random 16)
|
||||
@@ -443,129 +568,184 @@ set_shadowsocks(){
|
||||
sss_pwd=$(gen_random 32)
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
setconfig sss_cipher "$sss_cipher" "$GT_CFG_PATH"
|
||||
setconfig sss_pwd "$sss_pwd" "$GT_CFG_PATH"
|
||||
set_shadowsocks
|
||||
;;
|
||||
4)
|
||||
if echo "$sss_cipher" |grep -q '2022-blake3';then
|
||||
echo -e "\033[31m注意:\033[0m2022系列加密必须使用脚本随机生成的password!"
|
||||
line_break
|
||||
if echo "$sss_cipher" | grep -q '2022-blake3'; then
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m2022系列加密必须使用脚本随机生成的password!"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
else
|
||||
read -p "请输入秘钥(输入0删除) > " text
|
||||
read -r -p "请输入秘钥(输入0删除)> " text
|
||||
[ "$text" = 0 ] && sss_pwd='' || sss_pwd="$text"
|
||||
setconfig sss_pwd "$text" "$GT_CFG_PATH"
|
||||
fi
|
||||
set_shadowsocks
|
||||
;;
|
||||
5)
|
||||
read -p "请输入本机公网IP(4/6)或域名 > " text
|
||||
if [ -n "$text" ] && [ -n "$sss_port" ] && [ -n "$sss_cipher" ] && [ -n "$sss_pwd" ];then
|
||||
line_break
|
||||
read -r -p "请输入本机公网IP(4/6)或域名> " text
|
||||
if [ -n "$text" ] && [ -n "$sss_port" ] && [ -n "$sss_cipher" ] && [ -n "$sss_pwd" ]; then
|
||||
ss_link="ss://$(gen_base64 "$sss_cipher":"$sss_pwd")@${text}:${sss_port}#ShellCrash_ss_in"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "你的分享链接是(请勿随意分享给他人):\n\033[32m$ss_link\033[0m"
|
||||
line_break
|
||||
echo -e "你的分享链接是(请勿随意分享给他人):\n\033[32m$ss_link\033[0m"
|
||||
else
|
||||
echo -e "\033[31m请先完成必选设置!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请先完成必选设置!\033[0m"
|
||||
separator_line "="
|
||||
fi
|
||||
sleep 1
|
||||
set_shadowsocks
|
||||
;;
|
||||
*) errornum ;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
#自定义端点
|
||||
set_tailscale(){
|
||||
|
||||
# 自定义端点
|
||||
set_tailscale() {
|
||||
while true; do
|
||||
[ -n "$ts_auth_key" ] && ts_auth_key_info='*********'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译Tailscale模块\n如需使用请先前往自定义内核更新完整版内核文件!"
|
||||
echo -e "创建秘钥:\033[32;4mhttps://login.tailscale.com/admin/settings/keys\033[0m"
|
||||
echo -e "访问非本机目标需允许通告:\033[32;4mhttps://login.tailscale.com\033[0m"
|
||||
echo -e "访问非本机目标需在终端设置使用Subnet或EXIT-NODE模式"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 \033[32m启用/关闭\033[0mTailscale服务 \033[32m$ts_service\033[0m"
|
||||
echo -e " 2 设置\033[36m秘钥\033[0m(Auth Key) $ts_auth_key_info"
|
||||
echo -e " 3 通告路由\033[33m内网地址\033[0m(Subnet) \033[36m$ts_subnet\033[0m"
|
||||
echo -e " 4 通告路由\033[31m全部流量\033[0m(EXIT-NODE) \033[36m$ts_exit_node\033[0m"
|
||||
echo -e " 5 设置\033[36m设备名称\033[0m(可选) $ts_hostname"
|
||||
echo -e " 0 返回上级菜单 \033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译Tailscale模块\n如需使用请先前往自定义内核更新完整版内核文件!"
|
||||
content_line "创建秘钥:\033[32;4mhttps://login.tailscale.com/admin/settings/keys\033[0m"
|
||||
content_line "访问非本机目标需允许通告:\033[32;4mhttps://login.tailscale.com\033[0m"
|
||||
content_line "访问非本机目标需在终端设置使用Subnet或EXIT-NODE模式"
|
||||
separator_line "="
|
||||
content_line "1) \033[32m启用/关闭\033[0mTailscale服务 \033[32m$ts_service\033[0m"
|
||||
content_line "2) 设置\033[36m秘钥\033[0m(Auth Key) $ts_auth_key_info"
|
||||
content_line "3) 通告路由\033[33m内网地址\033[0m(Subnet) \033[36m$ts_subnet\033[0m"
|
||||
content_line "4) 通告路由\033[31m全部流量\033[0m(EXIT-NODE) \033[36m$ts_exit_node\033[0m"
|
||||
content_line "5) 设置\033[36m设备名称\033[0m(可选) $ts_hostname"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ -n "$ts_auth_key" ];then
|
||||
if [ -n "$ts_auth_key" ]; then
|
||||
[ "$ts_service" = ON ] && ts_service=OFF || ts_service=ON
|
||||
setconfig ts_service "$ts_service"
|
||||
else
|
||||
echo -e "\033[31m请先设置秘钥!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请先设置秘钥!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
set_tailscale
|
||||
;;
|
||||
2)
|
||||
read -p "请输入秘钥(输入0删除) > " text
|
||||
line_break
|
||||
read -r -p "请输入秘钥(输入0删除)> " text
|
||||
[ "$text" = 0 ] && unset ts_auth_key ts_auth_key_info || ts_auth_key="$text"
|
||||
setconfig ts_auth_key "$ts_auth_key" "$GT_CFG_PATH"
|
||||
set_tailscale
|
||||
;;
|
||||
3)
|
||||
[ "$ts_subnet" = true ] && ts_subnet=false || ts_subnet=true
|
||||
setconfig ts_subnet "$ts_subnet" "$GT_CFG_PATH"
|
||||
set_tailscale
|
||||
;;
|
||||
4)
|
||||
[ "$ts_exit_node" = true ] && ts_exit_node=false || {
|
||||
if [ "$ts_exit_node" = true ]; then
|
||||
ts_exit_node=false
|
||||
else
|
||||
ts_exit_node=true
|
||||
echo -e "\033[31m注意:\033[0m目前exitnode的官方DNS有bug,要么启用域名嗅探并禁用TailscaleDNS,\n要么必须在网页设置Globalname servers为分配的本设备子网IP且启用override"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m目前exitnode的官方DNS有bug,要么启用域名嗅探并禁用TailscaleDNS,\n要么必须在网页设置Globalname servers为分配的本设备子网IP且启用override"
|
||||
separator_line "="
|
||||
sleep 3
|
||||
}
|
||||
fi
|
||||
setconfig ts_exit_node "$ts_exit_node" "$GT_CFG_PATH"
|
||||
set_tailscale
|
||||
;;
|
||||
5)
|
||||
read -p "请输入希望在Tailscale显示的设备名称 > " ts_hostname
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请直接输入希望在Tailscale显示的设备名称"
|
||||
content_line "或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入> " ts_hostname
|
||||
if [ "$ts_hostname" != 0 ]; then
|
||||
setconfig ts_hostname "$ts_hostname" "$GT_CFG_PATH"
|
||||
set_tailscale
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
*) errornum ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
set_wireguard(){
|
||||
[ -n "$wg_public_key" ] && wgp_key_info='*********' || unset wgp_key_info
|
||||
[ -n "$wg_private_key" ] && wgv_key_info='*********' || unset wgv_key_info
|
||||
[ -n "$wg_pre_shared_key" ] && wgpsk_key_info='*********' || unset wgpsk_key_info
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译WireGuard模块\n如需使用请先前往自定义内核更新完整版内核文件!"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 \033[32m启用/关闭\033[0mWireguard服务 \033[32m$wg_service\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 2 设置\033[36mEndpoint地址\033[0m: \033[36m$wg_server\033[0m"
|
||||
echo -e " 3 设置\033[36mEndpoint端口\033[0m: \033[36m$wg_port\033[0m"
|
||||
echo -e " 4 设置\033[36m公钥-PublicKey\033[0m: \033[36m$wgp_key_info\033[0m"
|
||||
echo -e " 5 设置\033[36m密钥-PresharedKey\033[0m: \033[36m$wgpsk_key_info\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 6 设置\033[33m私钥-PrivateKey\033[0m: \033[33m$wgv_key_info\033[0m"
|
||||
echo -e " 7 设置\033[33m组网IPV4地址\033[0m: \033[33m$wg_ipv4\033[0m"
|
||||
echo -e " 8 可选\033[33m组网IPV6地址\033[0m: \033[33m$wg_ipv6\033[0m"
|
||||
echo -e " 0 返回上级菜单 \033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -p "请输入对应数字 > " num
|
||||
|
||||
set_wireguard() {
|
||||
while true; do
|
||||
|
||||
if [ -n "$wg_public_key" ]; then
|
||||
wgp_key_info='*********'
|
||||
else
|
||||
unset wgp_key_info
|
||||
fi
|
||||
|
||||
if [ -n "$wg_private_key" ]; then
|
||||
wgv_key_info='*********'
|
||||
else
|
||||
unset wgv_key_info
|
||||
fi
|
||||
|
||||
if [ -n "$wg_pre_shared_key" ]; then
|
||||
wgpsk_key_info='*********'
|
||||
else
|
||||
unset wgpsk_key_info
|
||||
fi
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m注意:\033[0m脚本默认内核为了节约内存没有编译WireGuard模块\n如需使用请先前往自定义内核更新完整版内核文件!"
|
||||
separator_line "="
|
||||
content_line "1) \033[32m启用/关闭\033[0mWireguard服务 \033[32m$wg_service\033[0m"
|
||||
content_line ""
|
||||
content_line "2) 设置\033[36mEndpoint地址\033[0m: \033[36m$wg_server\033[0m"
|
||||
content_line "3) 设置\033[36mEndpoint端口\033[0m: \033[36m$wg_port\033[0m"
|
||||
content_line "4) 设置\033[36m公钥-PublicKey\033[0m: \033[36m$wgp_key_info\033[0m"
|
||||
content_line "5) 设置\033[36m密钥-PresharedKey\033[0m: \033[36m$wgpsk_key_info\033[0m"
|
||||
content_line ""
|
||||
content_line "6) 设置\033[33m私钥-PrivateKey\033[0m: \033[33m$wgv_key_info\033[0m"
|
||||
content_line "7) 设置\033[33m组网IPV4地址\033[0m: \033[33m$wg_ipv4\033[0m"
|
||||
content_line "8) 可选\033[33m组网IPV6地址\033[0m: \033[33m$wg_ipv6\033[0m"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应标号> " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ -n "$wg_server" ] && [ -n "$wg_port" ] && [ -n "$wg_public_key" ] && [ -n "$wg_pre_shared_key" ] && [ -n "$wg_private_key" ] && [ -n "$wg_ipv4" ];then
|
||||
if [ -n "$wg_server" ] && [ -n "$wg_port" ] && [ -n "$wg_public_key" ] && [ -n "$wg_pre_shared_key" ] && [ -n "$wg_private_key" ] && [ -n "$wg_ipv4" ]; then
|
||||
[ "$wg_service" = ON ] && wg_service=OFF || wg_service=ON
|
||||
setconfig wg_service "$wg_service"
|
||||
else
|
||||
echo -e "\033[31m请先完成必选设置!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m请先完成必选设置!\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
set_wireguard
|
||||
;;
|
||||
[1-8])
|
||||
read -p "请输入相应内容(回车或0删除) > " text
|
||||
line_break
|
||||
read -r -p "请输入相应内容(回车或0删除)> " text
|
||||
[ "$text" = 0 ] && text=''
|
||||
case "$num" in
|
||||
2)
|
||||
@@ -596,11 +776,12 @@ set_wireguard(){
|
||||
wg_ipv6="$text"
|
||||
setconfig wg_ipv6 "$text" "$GT_CFG_PATH"
|
||||
;;
|
||||
|
||||
esac
|
||||
set_wireguard
|
||||
;;
|
||||
*) errornum ;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -158,7 +158,7 @@ download_file(){
|
||||
}
|
||||
### --- 具体操作函数 --- ###
|
||||
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
|
||||
@@ -166,8 +166,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"
|
||||
}
|
||||
@@ -243,7 +243,7 @@ polling(){
|
||||
}
|
||||
[ -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
|
||||
@@ -253,7 +253,7 @@ polling(){
|
||||
continue
|
||||
;;
|
||||
"stop_redir")
|
||||
if [ "$redir_mod" != '纯净模式' ];then
|
||||
if [ "$firewall_area" != 4 ];then
|
||||
do_stop_fw
|
||||
send_msg "已切换到纯净模式"
|
||||
else
|
||||
|
||||
@@ -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"
|
||||
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() {
|
||||
echo -e "请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m"
|
||||
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(){
|
||||
|
||||
tg_push_token() {
|
||||
push_TG="$TOKEN"
|
||||
setconfig push_TG "$TOKEN"
|
||||
setconfig chat_ID "$chat_ID"
|
||||
. "$CRASHDIR"/libs/logger.sh && logger "已完成Telegram日志推送设置!" 32
|
||||
}
|
||||
get_chatid(){
|
||||
|
||||
get_chatid() {
|
||||
i=1
|
||||
chat_ID=''
|
||||
while [ $i -le 3 ] && [ -z "$chat_ID" ]; do
|
||||
sleep 1
|
||||
echo -e "\033[33m第 $i 次尝试获取对话ID失败,正在重试...\033[0m"
|
||||
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//')
|
||||
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
|
||||
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' ] && {
|
||||
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
|
||||
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
|
||||
echo -e "\033[31m无法获取对话ID,请重新配置!\033[0m"
|
||||
sleep 1
|
||||
msg_alert "\033[31m无法获取对话ID,请重新配置!\033[0m"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,5 @@ bot_tg_stop(){
|
||||
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,15 +1,15 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
check_port(){
|
||||
if [ "$1" -gt 65535 -o "$1" -le 1 ]; then
|
||||
echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
check_port() {
|
||||
if [ "$1" -gt 65535 ] || [ "$1" -le 1 ]; then
|
||||
msg_alert "\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"
|
||||
elif echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep -q "|$1|"; then
|
||||
msg_alert "\033[31m输入错误!请不要输入重复的端口!\033[0m"
|
||||
return 1
|
||||
elif [ -n "$(netstat -ntul | grep -E ":$1[[:space:]]")" ]; then
|
||||
echo -e "\033[31m当前端口已被其他进程占用,请重新输入!\033[0m"
|
||||
elif netstat -ntul | grep -q ":$1[[:space:]]"; then
|
||||
msg_alert "\033[31m当前端口已被其他进程占用,请重新输入!\033[0m"
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
86
scripts/menus/common.sh
Normal file
86
scripts/menus/common.sh
Normal file
@@ -0,0 +1,86 @@
|
||||
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_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
|
||||
}
|
||||
|
||||
common_success() {
|
||||
separator_line "-"
|
||||
content_line "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
sleep 1
|
||||
}
|
||||
@@ -1,12 +1,11 @@
|
||||
#! /bin/bash
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
|
||||
ddns_menu(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;46m欢迎使用DDNS!\033[0m"
|
||||
ddns_menu() {
|
||||
top_box "\033[30;46m欢迎使用DDNS!\033[0m"
|
||||
load_ddns
|
||||
}
|
||||
|
||||
add_ddns() {
|
||||
cat >>"$ddns_dir" <<EOF
|
||||
|
||||
@@ -29,150 +28,205 @@ config service '$service'
|
||||
EOF
|
||||
/usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
|
||||
sleep 3
|
||||
echo 服务已经添加!
|
||||
msg_alert "服务已经添加!"
|
||||
}
|
||||
|
||||
set_ddns() {
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入你的域名 > " str
|
||||
while true; do
|
||||
line_break
|
||||
read -r -p "请输入你的域名> " str
|
||||
[ -z "$str" ] && domain="$domain" || domain="$str"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入用户名或邮箱 > " str
|
||||
echo ""
|
||||
read -r -p "请输入用户名或邮箱> " str
|
||||
[ -z "$str" ] && username="$username" || username="$str"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入密码或令牌秘钥 > " str
|
||||
echo ""
|
||||
read -r -p "请输入密码或令牌秘钥> " str
|
||||
[ -z "$str" ] && password="$password" || password="$str"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入检测更新间隔(单位:分钟;默认为10) > " check_interval
|
||||
echo ""
|
||||
read -r -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
|
||||
echo ""
|
||||
read -r -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
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "请核对如下信息:"
|
||||
content_line ""
|
||||
content_line "服务商: \033[32m$service\033[0m"
|
||||
content_line "域名: \033[32m$domain\033[0m"
|
||||
content_line "用户名: \033[32m$username\033[0m"
|
||||
content_line "检测间隔: \033[32m$check_interval\033[0m"
|
||||
separator_line "="
|
||||
content_line "是否确认添加:"
|
||||
separator_line "="
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,重新輸入"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
add_ddns
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
set_ddns_service() {
|
||||
while true; do
|
||||
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}'
|
||||
comp_box "\033[32m请选择服务提供商:\033[0m"
|
||||
|
||||
# cat "$services_dir" | grep -v '^#' | awk '{print NR") " $1}'
|
||||
awk '!/^#/ {print NR") " $1}' "$services_dir" |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
|
||||
nr=$(cat "$services_dir" | grep -v '^#' | wc -l)
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" ]; then
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
elif [ "$num" -gt 0 -a "$num" -lt $nr ]; then
|
||||
break
|
||||
elif [ "$num" -gt 0 ] && [ "$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')
|
||||
service=$(echo "$service_name" | sed 's/\./_/g')
|
||||
set_ddns
|
||||
break
|
||||
else
|
||||
echo "输入错误,请重新输入!"
|
||||
sleep 1
|
||||
set_ddns_service
|
||||
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
|
||||
while true; do
|
||||
comp_box "\033[32m请选择网络模式:\033[0m"
|
||||
content_line "1) \033[36mIPV4\033[0m"
|
||||
content_line "2) \033[36mIPV6\033[0m"
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
use_ipv6=0
|
||||
serv=services
|
||||
set_ddns_service
|
||||
elif [ "$num" = 2 ]; then
|
||||
break
|
||||
;;
|
||||
2)
|
||||
use_ipv6=1
|
||||
serv=services_ipv6
|
||||
set_ddns_service
|
||||
else
|
||||
echo "输入错误,请重新输入!"
|
||||
sleep 1
|
||||
set_ddns_type
|
||||
fi
|
||||
break
|
||||
;;
|
||||
*)
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
rev_ddns_service() {
|
||||
while true; do
|
||||
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 &
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "1) \033[32m立即更新\033[0m"
|
||||
content_line "2) 编辑当前服务"
|
||||
content_line "3) $enabled_b当前服务"
|
||||
content_line "4) 移除当前服务"
|
||||
content_line "5) 查看运行日志"
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
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
|
||||
elif [ "$num" = 2 ]; then
|
||||
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
|
||||
elif [ "$num" = 3 ]; then
|
||||
break
|
||||
;;
|
||||
3)
|
||||
[ "$enabled" = 1 ] && uci set ddns."$service".enabled='0' || uci set ddns."$service".enabled='1' && sleep 3
|
||||
uci commit ddns."$service"
|
||||
elif [ "$num" = 4 ]; then
|
||||
break
|
||||
;;
|
||||
4)
|
||||
uci delete ddns."$service"
|
||||
uci commit ddns."$service"
|
||||
elif [ "$num" = 5 ]; then
|
||||
echo -----------------------------------------------
|
||||
break
|
||||
;;
|
||||
5)
|
||||
line_break
|
||||
separator_line "="
|
||||
cat /var/log/ddns/"$service".log 2>/dev/null
|
||||
content_line ""
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
break
|
||||
;;
|
||||
*)
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
load_ddns() {
|
||||
while true; do
|
||||
ddns_dir=/etc/config/ddns
|
||||
tmp_dir="$TMPDIR"/ddns
|
||||
[ ! -f "$ddns_dir" ] && {
|
||||
echo -e "\033[31m本脚本依赖OpenWrt内置的DDNS服务,当前设备无法运行,已退出!\033[0m"
|
||||
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"
|
||||
echo -----------------------------------------------
|
||||
echo -e "列表 域名 启用 IP地址"
|
||||
echo -----------------------------------------------
|
||||
separator_line "="
|
||||
content_line " 列表 域名 启用 IP地址"
|
||||
content_line ""
|
||||
[ -s "$tmp_dir" ] && for service in $(cat "$tmp_dir"); do
|
||||
#echo $service >>$tmp_dir
|
||||
# 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"
|
||||
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
|
||||
echo -e " $((nr + 1)) 添加DDNS服务"
|
||||
echo -e " 0 退出"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应序号 > " num
|
||||
if [ -z "$num" -o "$num" = 0 ]; then
|
||||
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
|
||||
load_ddns
|
||||
elif [ "$num" -gt 0 -a "$num" -le $nr ]; then
|
||||
service=$(cat $tmp_dir | sed -n "$num"p)
|
||||
elif [ "$num" -gt 0 ] && [ "$num" -le $nr ]; then
|
||||
service=$(cat "$tmp_dir" | sed -n "$num"p)
|
||||
rev_ddns_service
|
||||
load_ddns
|
||||
else
|
||||
echo "请输入正确数字!" && load_ddns
|
||||
msg_alert "\033[33m请输入正确数字!\033[0m"
|
||||
fi
|
||||
rm -rf "$tmp_dir"
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -4,231 +4,489 @@
|
||||
[ -n "$__IS_MODULE_DNS_LOADED" ] && return
|
||||
__IS_MODULE_DNS_LOADED=1
|
||||
|
||||
set_dns_mod() { #DNS模式设置
|
||||
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
|
||||
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服务"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "$DNS_CURRENT_MODE\033[47;30m $dns_mod \033[0m"
|
||||
content_line "\033[33m$DNS_RESTART_NOTICE\033[0m"
|
||||
separator_line "="
|
||||
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" ] &&
|
||||
echo -e " 8 管理MIX模式\033[33mFake-ip过滤列表\033[0m"
|
||||
echo -e " 9 修改\033[36mDNS服务器\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
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) ;;
|
||||
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
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
2)
|
||||
1 | 2)
|
||||
line_break
|
||||
separator_line "="
|
||||
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"
|
||||
[ "$num" = 1 ] && dns_mod=mix || dns_mod=route
|
||||
setconfig dns_mod "$dns_mod"
|
||||
content_line "\033[36m$DNS_SET_OK:$dns_mod\033[0m"
|
||||
else
|
||||
echo -e "\033[31m当前内核不支持的功能!!!\033[0m"
|
||||
sleep 1
|
||||
econtent_line "\033[31m$DNS_CORE_UNSUPPORTED\033[0m"
|
||||
fi
|
||||
set_dns_mod
|
||||
separator_line "="
|
||||
sleep 1
|
||||
;;
|
||||
3)
|
||||
dns_mod=redir_host
|
||||
setconfig dns_mod $dns_mod
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m已设为 $dns_mod 模式!!\033[0m"
|
||||
set_dns_mod
|
||||
setconfig dns_mod "$dns_mod"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[36m$DNS_SET_OK:$dns_mod\033[0m"
|
||||
separator_line "="
|
||||
;;
|
||||
4)
|
||||
[ "$dns_protect" = "ON" ] && dns_protect=OFF || dns_protect=ON
|
||||
setconfig dns_protect $dns_protect
|
||||
set_dns_mod
|
||||
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 "="
|
||||
content_line "1) 是"
|
||||
content_line "2) 重置为默认值"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
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
|
||||
sleep 1
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
setconfig dns_protect "$dns_protect"
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
done
|
||||
;;
|
||||
5)
|
||||
[ "$hosts_opt" = "ON" ] && hosts_opt=OFF || hosts_opt=ON
|
||||
setconfig hosts_opt $hosts_opt
|
||||
set_dns_mod
|
||||
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 "="
|
||||
content_line "1) 是"
|
||||
content_line "2) 重置为默认值"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
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
|
||||
sleep 1
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
setconfig dns_protect "$hosts_opt"
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
done
|
||||
;;
|
||||
6)
|
||||
[ "$ecs_subnet" = "ON" ] && ecs_subnet=OFF || ecs_subnet=ON
|
||||
setconfig ecs_subnet "$ecs_subnet"
|
||||
set_dns_mod
|
||||
|
||||
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 "="
|
||||
content_line "1) 是"
|
||||
content_line "2) 重置为默认值"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
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
|
||||
sleep 1
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
setconfig dns_protect "$ecs_subnet"
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
done
|
||||
;;
|
||||
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
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m$DNS_REDIR_WARN\033[0m"
|
||||
content_line "\033[33m$DNS_REDIR_HINT 127.0.0.1:$dns_port\033[0m"
|
||||
content_line ""
|
||||
content_line "请直接输入旁路由IPV4地址"
|
||||
content_line "或输入 r 重置DNS劫持端口"
|
||||
content_line "或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入> " num
|
||||
case "$num" in
|
||||
0)
|
||||
break
|
||||
;;
|
||||
r)
|
||||
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
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
break
|
||||
;;
|
||||
*)
|
||||
if [ "$num" -ge 1 ] && [ "$num" -lt 65535 ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
if ckcmd netstat && netstat -ntul | grep -q ":$num "; then
|
||||
dns_redir_port="$num"
|
||||
setconfig dns_redir_port "$dns_redir_port"
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
break
|
||||
else
|
||||
echo -e "\033[33m此端口未检测到已运行的DNS服务!\033[0m"
|
||||
content_line "\033[33m$DNS_REDIR_NO_SERVICE\033[0m"
|
||||
separator_line "="
|
||||
sleep 1
|
||||
fi
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_mod
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
8)
|
||||
echo "-----------------------------------------------"
|
||||
fake_ip_filter
|
||||
set_dns_mod
|
||||
;;
|
||||
9)
|
||||
set_dns_adv
|
||||
set_dns_mod
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
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"
|
||||
else
|
||||
echo -e "你输入的地址是:\033[32m$input\033[0m"
|
||||
read -p "确认添加?(1/0) > " res
|
||||
[ "$res" = 1 ] && echo $input >>${CRASHDIR}/configs/fake_ip_filter
|
||||
fi
|
||||
sleep 1
|
||||
fake_ip_filter
|
||||
;;
|
||||
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
|
||||
|
||||
fake_ip_filter() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$DNS_FAKEIP_DESC\033[0m"
|
||||
content_line "\033[31m$DNS_FAKEIP_TIP\033[0m"
|
||||
content_line "\033[36m$DNS_FAKEIP_EXAMPLE\033[0m"
|
||||
|
||||
separator_line "="
|
||||
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
|
||||
content_line "\033[33m$DNS_FAKEIP_EMPTY\033[0m"
|
||||
fi
|
||||
content_line ""
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "$DNS_FAKEIP_EDIT> " input
|
||||
case "$input" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
*)
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ "$input" -ge 1 ] 2>/dev/null; then
|
||||
if sed -i "${input}d" "$CRASHDIR/configs/fake_ip_filter"; then
|
||||
content_line "\033[32m移除成功\033[0m"
|
||||
else
|
||||
content_line "\033[31m移除失败\033[0m"
|
||||
fi
|
||||
else
|
||||
content_line "请确认需要添加的地址:\033[32m$input\033[0m"
|
||||
separator_line "="
|
||||
content_line "1) 确认无误"
|
||||
content_line "0) 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT>" res
|
||||
if [ "$res" = 1 ]; then
|
||||
line_break
|
||||
separator_line "="
|
||||
if echo "$input" >>"$CRASHDIR/configs/fake_ip_filter"; then
|
||||
content_line "\033[32m添加成功\033[0m"
|
||||
else
|
||||
content_line "\033[31m添加失败\033[0m"
|
||||
fi
|
||||
else
|
||||
break
|
||||
fi
|
||||
fi
|
||||
separator_line "="
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# DNS详细设置
|
||||
set_dns_adv() {
|
||||
while true; do
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[31m$DNS_ADV_SINGBOX_LIMIT\033[0m"
|
||||
content_line "$DNS_ADV_SPLIT"
|
||||
content_line "\033[33m$DNS_ADV_CERT\033[0m"
|
||||
content_line ""
|
||||
content_line "DIRECT-DNS:"
|
||||
content_line "\033[32m$dns_nameserver\033[0m"
|
||||
content_line ""
|
||||
|
||||
content_line "PROXY-DNS:"
|
||||
content_line "\033[36m$dns_fallback\033[0m"
|
||||
content_line ""
|
||||
|
||||
content_line "DEFAULT-DNS:"
|
||||
content_line "\033[33m$dns_resolver\033[0m"
|
||||
content_line ""
|
||||
|
||||
separator_line "="
|
||||
content_line "1) $DNS_ADV_EDIT_DIRECT"
|
||||
content_line "2) $DNS_ADV_EDIT_PROXY"
|
||||
content_line "3) $DNS_ADV_EDIT_DEFAULT"
|
||||
content_line "4) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m"
|
||||
content_line "9) \033[33m$DNS_ADV_RESET\033[0m"
|
||||
content_line "0) $COMMON_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$COMMON_INPUT > " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
read -p "请输入新的DNS > " dns_nameserver
|
||||
dns_nameserver=$(echo $dns_nameserver | sed 's#|#\,\ #g')
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "当前DIRECT-DNS:\033[32m$dns_nameserver\033[0m"
|
||||
separator_line "="
|
||||
content_line "请直接输入新的DIRECT-DNS地址"
|
||||
content_line "或输入 r 重置DIRECT-DNS地址"
|
||||
content_line "或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
read -r -p "请输入> " res
|
||||
case "$res" in
|
||||
0)
|
||||
continue
|
||||
;;
|
||||
r)
|
||||
dns_nameserver="127.0.0.1"
|
||||
setconfig dns_nameserver "'$dns_nameserver'"
|
||||
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
;;
|
||||
*)
|
||||
dns_nameserver=$(echo "$res" | sed 's#|#,\ #g')
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ -n "$dns_nameserver" ]; then
|
||||
setconfig dns_nameserver "'$dns_nameserver'"
|
||||
echo -e "\033[32m设置成功!!!\033[0m"
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
else
|
||||
ontent_line "\033[32m操作失败\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
esac
|
||||
separator_line "="
|
||||
;;
|
||||
2)
|
||||
read -p "请输入新的DNS > " dns_fallback
|
||||
dns_fallback=$(echo $dns_fallback | sed 's/|/\,\ /g')
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "当前PROXY-DNS:\033[32m$dns_fallback\033[0m"
|
||||
separator_line "="
|
||||
content_line "请直接输入新的PROXY-DNS地址"
|
||||
content_line "或输入 r 重置PROXY-DNS地址"
|
||||
content_line "或输入 0 返回上级菜单"
|
||||
separator_line "="
|
||||
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'"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
;;
|
||||
*)
|
||||
dns_fallback=$(echo "$res" | sed 's#|#,\ #g')
|
||||
line_break
|
||||
separator_line "="
|
||||
if [ -n "$dns_fallback" ]; then
|
||||
setconfig dns_fallback "'$dns_fallback'"
|
||||
echo -e "\033[32m设置成功!!!\033[0m"
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
else
|
||||
ontent_line "\033[32m操作失败\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
esac
|
||||
separator_line "="
|
||||
;;
|
||||
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')
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "当前DEFAULT-DNS:\033[32m$dns_resolver\033[0m"
|
||||
separator_line "="
|
||||
content_line "请直接输入新的DEFAULT-DNS地址"
|
||||
content_line "或输入 r 重置DEFAULT-DNS地址"
|
||||
content_line "或输入 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'"
|
||||
echo -e "\033[32m设置成功!!!\033[0m"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m操作成功\033[0m"
|
||||
;;
|
||||
*)
|
||||
line_break
|
||||
separator_line "="
|
||||
if echo "$res" | grep -qE '://.*::'; then
|
||||
content_line "\033[31m$DNS_IPV6_NOT_SUPPORT\033[0m"
|
||||
else
|
||||
dns_resolver=$(echo "$res" | sed 's#|#,\ #g')
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
content_line "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
;;
|
||||
esac
|
||||
separator_line "="
|
||||
;;
|
||||
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
|
||||
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'"
|
||||
echo -e "\033[32m已设置加密DNS,如出现DNS解析问题,请尝试重置DNS配置!\033[0m"
|
||||
content_line "\033[32m$DNS_ENCRYPT_OK\033[0m"
|
||||
else
|
||||
echo -e "\033[31m找不到根证书文件,无法启用加密DNS,Linux系统请自行搜索安装OpenSSL的方式!\033[0m"
|
||||
content_line "\033[31m$DNS_CORE_REQUIRE\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
set_dns_adv
|
||||
separator_line "="
|
||||
;;
|
||||
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
|
||||
. "$CRASHDIR/libs/get_config.sh"
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
separator_line "="
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
492
scripts/menus/fw_filter.sh
Normal file
492
scripts/menus/fw_filter.sh
Normal file
@@ -0,0 +1,492 @@
|
||||
#!/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
|
||||
line_break
|
||||
separator_line "="
|
||||
content_line "1) 过滤非常用端口: \033[36m$common_ports\033[0m ———用于过滤P2P流量"
|
||||
content_line "2) 过滤局域网设备: \033[36m$mac_return\033[0m ———使用黑/白名单进行过滤"
|
||||
content_line "3) 过滤QUIC协议: \033[36m$quic_rj\033[0m ———优化视频性能"
|
||||
content_line "4) 过滤CN_IP(4/6)列表:\033[36m$cn_ip_route\033[0m ———优化性能"
|
||||
content_line "5) 自定义透明路由ipv4网段:适合vlan等复杂网络环境"
|
||||
content_line "6) 自定义保留地址ipv4网段:需要以保留地址为访问目标的环境"
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ -n "$(pidof CrashCore)" ] && [ "$firewall_mod" = 'iptables' ]; then
|
||||
comp_box "切换时将停止服务,是否继续:"
|
||||
content_line "1) 是"
|
||||
content_line "0) 否,返回上级菜单"
|
||||
separator_line "="
|
||||
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)
|
||||
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 "请直接输入自定义保留地址ipv4网段" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
break
|
||||
elif
|
||||
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
|
||||
done
|
||||
;;
|
||||
*)
|
||||
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 "="
|
||||
content_line "1) 启用/关闭端口过滤: \033[36m$common_ports\033[0m"
|
||||
content_line "2) 添加放行端口"
|
||||
content_line "3) 移除指定放行端口"
|
||||
content_line "4) 重置默认放行端口"
|
||||
content_line "5) 重置为旧版放行端口"
|
||||
content_line ""
|
||||
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 "请直接输入要放行的端口号\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 "请直接输入要移除的端口号\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"
|
||||
content_line "1) 移除所有自定义网段"
|
||||
content_line "2) 使用自定义网段覆盖默认网段 \033[36m$replace_default_host_ipv4\033[0m"
|
||||
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 [ -n "$(echo "$text" | grep -Eo '^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}'$)" ] && echo "$cust_host_ipv4" | grep -q "$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
|
||||
}
|
||||
|
||||
# 局域网设备过滤
|
||||
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
|
||||
|
||||
content_line ""
|
||||
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
|
||||
|
||||
content_line ""
|
||||
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
|
||||
content_line ""
|
||||
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$fw_filter_lan_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
|
||||
content_line "1) 切换为\033[33m$fw_filter_lan_over模式\033[0m"
|
||||
content_line "2) \033[32m添加指定设备(mac地址)\033[0m"
|
||||
content_line "3) \033[32m添加指定设备(IP地址/网段)\033[0m"
|
||||
content_line "4) \033[36m移除指定设备\033[0m"
|
||||
content_line "9) \033[31m清空整个列表\033[0m"
|
||||
content_line ""
|
||||
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已切换为$fw_filter_lan_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
|
||||
}
|
||||
483
scripts/menus/override.sh
Normal file
483
scripts/menus/override.sh
Normal file
@@ -0,0 +1,483 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_MODULE_OVERRIDE" ] && return
|
||||
__IS_MODULE_OVERRIDE=1
|
||||
|
||||
# 配置文件覆写
|
||||
override() {
|
||||
while true; do
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] && server_link=1
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[30;47m 欢迎使用配置文件覆写功能!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 自定义\033[32m端口及秘钥\033[0m"
|
||||
echo -e " 2 管理\033[36m自定义规则\033[0m"
|
||||
echo "$crashcore" | grep -q 'singbox' || {
|
||||
echo -e " 3 管理\033[33m自定义节点\033[0m"
|
||||
echo -e " 4 管理\033[36m自定义策略组\033[0m"
|
||||
}
|
||||
echo -e " 5 \033[32m自定义\033[0m高级功能"
|
||||
[ "$disoverride" != 1 ] && echo -e " 9 \033[33m禁用\033[0m配置文件覆写"
|
||||
echo "-----------------------------------------------"
|
||||
[ "$inuserguide" = 1 ] || echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
if [ -n "$(pidof CrashCore)" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m检测到服务正在运行,需要先停止服务!\033[0m"
|
||||
read -p "是否停止服务?(1/0) > " res
|
||||
if [ "$res" = "1" ]; then
|
||||
"$CRASHDIR"/start.sh stop
|
||||
setport
|
||||
fi
|
||||
else
|
||||
setport
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
setrules
|
||||
;;
|
||||
3)
|
||||
setproxies
|
||||
;;
|
||||
4)
|
||||
setgroups
|
||||
;;
|
||||
5)
|
||||
echo "$crashcore" | grep -q 'singbox' && set_singbox_adv || set_clash_adv
|
||||
sleep 3
|
||||
;;
|
||||
9)
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m此功能可能会导致严重问题!启用后脚本中大部分功能都将禁用!!!\033[0m"
|
||||
echo -e "如果你不是非常了解$crashcore的运行机制,切勿开启!\033[0m"
|
||||
echo -e "\033[33m继续后如出现任何问题,请务必自行解决,一切提问恕不受理!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
sleep 2
|
||||
read -p "我确认遇到问题可以自行解决[1/0] > " res
|
||||
[ "$res" = '1' ] && {
|
||||
disoverride=1
|
||||
setconfig disoverride $disoverride
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m设置成功!\033[0m"
|
||||
}
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
setrules() { # 自定义规则
|
||||
|
||||
set_rule_type() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m请选择规则类型\033[0m"
|
||||
echo "$rule_type" | awk -F ' ' '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
[0-9]*)
|
||||
if [ "$num" -gt $(echo $rule_type | awk -F " " '{print NF}') ]; then
|
||||
errornum
|
||||
sleep 1
|
||||
else
|
||||
rule_type_set=$(echo "$rule_type" | cut -d' ' -f"$num")
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m请输入规则语句,可以是域名、泛域名、IP网段或者其他匹配规则类型的内容\033[0m"
|
||||
read -p "请输入对应规则 > " rule_state_set
|
||||
if [ -n "$rule_state_set" ]; then
|
||||
set_group_type
|
||||
else
|
||||
errornum
|
||||
slepp 1
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
set_group_type() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m请选择具体规则\033[0m"
|
||||
echo -e "\033[33m此处规则读取自现有配置文件,如果你后续更换配置文件时运行出错,请尝试重新添加\033[0m"
|
||||
echo "$rule_group" | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
[0-9]*)
|
||||
if [ "$num" -gt "$(echo "$rule_group" | awk -F "#" '{print NF}')" ]; then
|
||||
errornum
|
||||
sleep 1
|
||||
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
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m添加成功!\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
del_rule_type() {
|
||||
while true; do
|
||||
echo -e "输入对应数字即可移除相应规则:"
|
||||
sed -i '/^ *$/d; /^#/d' "$YAMLSDIR"/rules.yaml
|
||||
cat "$YAMLSDIR"/rules.yaml | grep -Ev '^#' | awk -F "#" '{print " "NR" "$1$2$3}'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
*)
|
||||
if [ "$num" -le "$(wc -l <"$YAMLSDIR"/rules.yaml)" ]; then
|
||||
sed -i "${num}d" "$YAMLSDIR"/rules.yaml
|
||||
sleep 1
|
||||
else
|
||||
errornum
|
||||
sleep 1
|
||||
break
|
||||
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
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m你可以在这里快捷管理自定义规则\033[0m"
|
||||
echo -e "如需批量操作,请手动编辑:\033[36m $YAMLSDIR/rules.yaml\033[0m"
|
||||
echo -e "\033[33msingbox和clash共用此处规则,可无缝切换!\033[0m"
|
||||
echo -e "大量规则请尽量使用rule-set功能添加,\033[31m此处过量添加可能导致启动卡顿!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 新增自定义规则"
|
||||
echo -e " 2 移除自定义规则"
|
||||
echo -e " 3 清空规则列表"
|
||||
echo "$crashcore" | grep -q 'singbox' || echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -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)
|
||||
echo "-----------------------------------------------"
|
||||
if [ -s "$YAMLSDIR"/rules.yaml ]; then
|
||||
del_rule_type
|
||||
else
|
||||
echo -e "请先添加自定义规则!"
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
read -p "确认清空全部自定义规则?(1/0) > " res
|
||||
[ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/rules.yaml
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
if [ "$proxies_bypass" = "OFF" ]; then
|
||||
echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m"
|
||||
read -p "启用节点绕过?(1/0) > " res
|
||||
[ "$res" = "1" ] && proxies_bypass=ON
|
||||
else
|
||||
proxies_bypass=OFF
|
||||
fi
|
||||
setconfig proxies_bypass "$proxies_bypass"
|
||||
sleep 1
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
setgroups() { # 自定义clash策略组
|
||||
set_group_type() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m注意策略组名称必须和【自定义规则】或【自定义节点】功能中指定的策略组一致!\033[0m"
|
||||
echo -e "\033[33m建议先创建策略组,之后可在【自定义规则】或【自定义节点】功能中智能指定\033[0m"
|
||||
echo -e "\033[33m如需在当前策略组下添加节点,请手动编辑$YAMLSDIR/proxy-groups.yaml\033[0m"
|
||||
read -r -p "请输入自定义策略组名称(不支持纯数字且不要包含特殊字符!) > " new_group_name
|
||||
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m请选择策略组【$new_group_name】的类型!\033[0m"
|
||||
echo "$group_type_cn" | awk '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
read -r -p "请输入对应数字 > " num
|
||||
new_group_type=$(echo "$group_type" | awk '{print $'"$num"'}')
|
||||
if [ "$num" = "1" ]; then
|
||||
unset new_group_url interval
|
||||
else
|
||||
read -r -p "请输入测速地址,回车则默认使用https://www.gstatic.com/generate_204 > " 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
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m添加成功!\033[0m"
|
||||
|
||||
}
|
||||
|
||||
set_group_add() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m请选择想要将本策略添加到的策略组\033[0m"
|
||||
echo -e "\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo "$proxy_group" | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 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
|
||||
new_group_name="$new_group_name$rule_group_add"
|
||||
unset rule_group_add
|
||||
else
|
||||
errornum
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m你可以在这里快捷管理自定义策略组\033[0m"
|
||||
echo -e "\033[36m如需修改或批量操作,请手动编辑:$YAMLSDIR/proxy-groups.yaml\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 添加自定义策略组"
|
||||
echo -e " 2 查看自定义策略组"
|
||||
echo -e " 3 清空自定义策略组"
|
||||
echo -e " 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)
|
||||
echo "-----------------------------------------------"
|
||||
cat "$YAMLSDIR"/proxy-groups.yaml
|
||||
;;
|
||||
3)
|
||||
read -p "确认清空全部自定义策略组?(1/0) > " res
|
||||
[ "$res" = "1" ] && echo '#用于添加自定义策略组' >"$YAMLSDIR"/proxy-groups.yaml
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
setproxies() { # 自定义clash节点
|
||||
set_proxy_type() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m注意节点格式必须是单行,不包括括号,name:必须写在最前,例如:\033[0m"
|
||||
echo -e "\033[36m【name: \"test\", server: 192.168.1.1, port: 12345, type: socks5, udp: true】\033[0m"
|
||||
echo -e "更多写法请参考:\033[32m https://juewuy.github.io/ \033[0m"
|
||||
read -r -p "请输入节点 > " proxy_state_set
|
||||
if echo "$proxy_state_set" | grep -q "#"; then
|
||||
echo -e "\033[33m绝对禁止包含【#】号!!!\033[0m"
|
||||
elif echo "$proxy_state_set" | grep -Eq "^name:"; then
|
||||
set_group_add
|
||||
else
|
||||
errornum
|
||||
sleep 1
|
||||
fi
|
||||
}
|
||||
|
||||
set_group_add() {
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m请选择想要将节点添加到的策略组\033[0m"
|
||||
echo -e "\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m"
|
||||
echo -e "\033[33m如需自定义策略组,请先使用【管理自定义策略组功能】添加\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo "$proxy_group" | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 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
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m添加成功!\033[0m"
|
||||
unset rule_group_add
|
||||
else
|
||||
errornum
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m你可以在这里快捷管理自定义节点\033[0m"
|
||||
echo -e "\033[36m如需批量操作,请手动编辑:$YAMLSDIR/proxies.yaml\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 添加自定义节点"
|
||||
echo -e " 2 管理自定义节点"
|
||||
echo -e " 3 清空自定义节点"
|
||||
echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m"
|
||||
echo -e " 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)
|
||||
echo "-----------------------------------------------"
|
||||
sed -i '/^ *$/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null
|
||||
if [ -s "$YAMLSDIR"/proxies.yaml ]; then
|
||||
echo -e "当前已添加的自定义节点为:"
|
||||
cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | awk -F '[,,}]' '{print NR, $1, $NF}' | sed 's/- {//g'
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m输入节点对应数字可以移除对应节点\033[0m"
|
||||
read -r -p "请输入对应数字 > " num
|
||||
if [ "$num" -le $(cat "$YAMLSDIR"/proxies.yaml | grep -Ev '^#' | wc -l) ]; then
|
||||
sed -i "$num{/^\s*[^#]/d}" "$YAMLSDIR"/proxies.yaml
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
else
|
||||
echo -e "请先添加自定义节点!"
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
read -r -p "确认清空全部自定义节点?(1/0) > " res
|
||||
[ "$res" = "1" ] && sed -i '/^\s*[^#]/d' "$YAMLSDIR"/proxies.yaml 2>/dev/null
|
||||
;;
|
||||
4)
|
||||
echo "-----------------------------------------------"
|
||||
if [ "$proxies_bypass" = "OFF" ]; then
|
||||
echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m"
|
||||
read -r -p "启用节点绕过?(1/0) > " res
|
||||
[ "$res" = "1" ] && proxies_bypass=ON
|
||||
else
|
||||
proxies_bypass=OFF
|
||||
fi
|
||||
setconfig proxies_bypass "$proxies_bypass"
|
||||
sleep 1
|
||||
setrules
|
||||
break
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
set_clash_adv(){ #自定义clash高级规则
|
||||
[ ! -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
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m已经创建自定义设定文件:$YAMLSDIR/user.yaml !\033[0m"
|
||||
echo -e "\033[33m可用于编写自定义的DNS,等功能\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m已经创建自定义功能文件:$YAMLSDIR/others.yaml !\033[0m"
|
||||
echo -e "\033[33m可用于编写自定义的锚点、入站、proxy-providers、sub-rules、rule-set、script等功能\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "Windows下请\n使用\033[33mWinSCP软件\033[0m进行编辑!\033[0m"
|
||||
echo -e "MacOS下请\n使用\033[33mSecureFX软件\033[0m进行编辑!\033[0m"
|
||||
echo -e "Linux本机可\n使用\033[33mvim\033[0m进行编辑(路由设备可能不显示中文请勿使用)!\033[0m"
|
||||
}
|
||||
|
||||
set_singbox_adv(){ #自定义singbox配置文件
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "支持覆盖脚本设置的模块有:\033[0m"
|
||||
echo -e "\033[36mlog dns ntp certificate experimental\033[0m"
|
||||
echo -e "支持与内置功能合并(但不可冲突)的模块有:\033[0m"
|
||||
echo -e "\033[36mendpoints inbounds outbounds providers route services\033[0m"
|
||||
echo -e "将相应json文件放入\033[33m$JSONSDIR\033[0m目录后即可在启动时自动加载"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "使用前请务必参考配置教程:\033[32;4m https://juewuy.github.io/nWTjEpkSK \033[0m"
|
||||
}
|
||||
91
scripts/menus/providers.sh
Normal file
91
scripts/menus/providers.sh
Normal file
@@ -0,0 +1,91 @@
|
||||
#!/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
|
||||
separator_line "-"
|
||||
content_line "1) \033[32m生成\033[0m包含全部提供者的配置文件"
|
||||
content_line "2) 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m"
|
||||
content_line "3) \033[33m清理\033[0mproviders目录文件"
|
||||
separator_line "-"
|
||||
common_back
|
||||
read -p "请输入对应字母或数字 > " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
;;
|
||||
1)
|
||||
separator_line "-"
|
||||
if [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ]; then
|
||||
. "$CRASHDIR/menus/providers_$CORE_TYPE.sh"
|
||||
gen_providers
|
||||
else
|
||||
content_line "\033[31m你还未添加链接或本地配置文件,请先添加!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
list=$(cat "$CRASHDIR/configs/${CORE_TYPE}_providers.list" | awk '{print $1}')
|
||||
separator_line "-"
|
||||
content_line "当前规则模版为:\033[32m$provider_temp_des\033[0m"
|
||||
content_line "\033[33m请选择在线模版:\033[0m"
|
||||
separator_line "-"
|
||||
list_box "$list"
|
||||
separator_line "-"
|
||||
content_line "a) 使用\033[36m本地模版\033[0m"
|
||||
common_back
|
||||
read -p "请输入对应字母或数字 > " num
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
a)
|
||||
read -p "请输入模版的路径(绝对路径) > " dir
|
||||
if [ -s $dir ]; then
|
||||
provider_temp_file=$dir
|
||||
setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"
|
||||
content_line "\033[32m设置成功!\033[0m"
|
||||
else
|
||||
content_line "\033[31m输入错误,找不到对应模版文件!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
;;
|
||||
*)
|
||||
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
|
||||
sleep 1
|
||||
else
|
||||
setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
content_line "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m"
|
||||
read -p "是否继续?(1/0) > " res
|
||||
[ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers && common_success
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
123
scripts/menus/providers_clash.sh
Normal file
123
scripts/menus/providers_clash.sh
Normal file
@@ -0,0 +1,123 @@
|
||||
#!/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
|
||||
echo "-----------------------------------------------"
|
||||
if [ -s "$provider_temp_file" ];then
|
||||
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
|
||||
else
|
||||
echo -e "\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)" ] && {
|
||||
echo -e "\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 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
|
||||
echo -e "\033[32m配置文件生成成功!\033[0m"
|
||||
mkdir -p "$CRASHDIR"/yamls
|
||||
mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml
|
||||
read -p "是否立即启动/重启服务?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
|
||||
exit
|
||||
}
|
||||
else
|
||||
rm -rf "$TMPDIR"/CrashCore
|
||||
rm -rf "$TMPDIR"/config.yaml
|
||||
echo -e "\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
|
||||
}
|
||||
|
||||
129
scripts/menus/providers_singbox.sh
Normal file
129
scripts/menus/providers_singbox.sh
Normal file
@@ -0,0 +1,129 @@
|
||||
#!/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
|
||||
echo "-----------------------------------------------"
|
||||
if [ -s "$provider_temp_file" ];then
|
||||
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
|
||||
else
|
||||
echo -e "\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)" ] && {
|
||||
echo -e "\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 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
|
||||
echo -e "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m"
|
||||
mkdir -p "$CRASHDIR"/jsons
|
||||
mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json
|
||||
rm -rf "$TMPDIR"/providers
|
||||
read -p "是否立即启动/重启服务?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
|
||||
exit
|
||||
}
|
||||
else
|
||||
echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m"
|
||||
rm -rf "$TMPDIR"/CrashCore
|
||||
#rm -rf "$TMPDIR"/providers
|
||||
fi
|
||||
}
|
||||
|
||||
gen_providers_txt(){
|
||||
tag=$1
|
||||
interval=${3:-3}
|
||||
interval2=${4:-12}
|
||||
ua=${5:-clash.meta}
|
||||
exclude=${6#\#}
|
||||
include=${7#\#}
|
||||
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": "$exclude",
|
||||
"include": "$include",
|
||||
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,51 +1,31 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
. /tmp/SC_tmp/libs/check_dir_avail.sh
|
||||
[ -n "$(echo -e | grep e)" ] && echo=echo || echo='echo -e'
|
||||
#. /tmp/SC_tmp/libs/check_dir_avail.sh
|
||||
|
||||
set_crashdir() {
|
||||
set_usb_dir() {
|
||||
echo -e "请选择安装目录"
|
||||
cecho() {
|
||||
printf '%b\n' "$*"
|
||||
}
|
||||
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 -e "\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() {
|
||||
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 退出安装"
|
||||
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
|
||||
@@ -65,48 +45,78 @@ set_crashdir() {
|
||||
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 退出安装"
|
||||
}
|
||||
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)
|
||||
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
|
||||
set_asus_usb
|
||||
;;
|
||||
2)
|
||||
cecho "如开机无法正常自启,请重新使用U盘+下载大师安装!"
|
||||
sleep 2
|
||||
dir=/jffs
|
||||
;;
|
||||
*)
|
||||
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 退出安装"
|
||||
}
|
||||
set_cust_dir() {
|
||||
while true; do
|
||||
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 -Eq '^/(tmp|opt|sys)(/|$)')" ]; then
|
||||
cecho "\033[31m路径错误!请重新设置!\033[0m"
|
||||
continue
|
||||
fi
|
||||
break 1
|
||||
done
|
||||
}
|
||||
|
||||
set_crashdir() {
|
||||
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
|
||||
@@ -122,29 +132,26 @@ set_crashdir() {
|
||||
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
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
echo "安装已取消"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ ! -w $dir ]; then
|
||||
echo -e "\033[31m没有$dir目录写入权限!请重新设置!\033[0m" && sleep 1 && setdir
|
||||
if [ ! -w "$dir" ]; then
|
||||
cecho "\033[31m没有$dir目录写入权限!请重新设置!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
echo -e "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail $dir -h)"
|
||||
cecho "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail "$dir" -h)"
|
||||
read -p "确认安装?(1/0) > " res
|
||||
[ "$res" = "1" ] && CRASHDIR=$dir/ShellCrash || setdir
|
||||
if [ "$res" = "1" ]; then
|
||||
CRASHDIR="$dir"/ShellCrash
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
177
scripts/menus/subconverter.sh
Normal file
177
scripts/menus/subconverter.sh
Normal file
@@ -0,0 +1,177 @@
|
||||
#!/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
|
||||
separator_line "-"
|
||||
content_line "1) \033[32m生成\033[0m包含全部节点/订阅的配置文件"
|
||||
content_line "2) 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m"
|
||||
content_line "3) 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m"
|
||||
content_line "4) 选择\033[33m在线规则模版\033[0m"
|
||||
content_line "5) 选择\033[0mSubconverter服务器\033[0m"
|
||||
content_line "6) 自定义浏览器UA \033[32m$user_agent\033[0m"
|
||||
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}' |paste -sd '|')
|
||||
uri_link=$(grep -v '^#' "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null |awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' |paste -sd '|')
|
||||
Url=$(echo "$providers_link|$uri_link" |sed '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
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
gen_link_flt() { # 排除节点正则
|
||||
[ -z "$exclude" ] && exclude="未设置"
|
||||
separator_line "-"
|
||||
content_line "\033[33m当前过滤关键字:\033[47;30m$exclude\033[0m"
|
||||
separator_line "-"
|
||||
content_line "\033[33m匹配关键字的节点会在导入时被【屏蔽】!!!\033[0m"
|
||||
content_line "多个关键字可以用\033[30;47m | \033[0m号分隔"
|
||||
content_line "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代"
|
||||
separator_line "-"
|
||||
content_line " 000 \033[31m删除\033[0m关键字"
|
||||
content_line " 回车 取消输入并返回上级菜单"
|
||||
separator_line "-"
|
||||
read -r -p "请输入关键字 > " exclude
|
||||
if [ "$exclude" = '000' ]; then
|
||||
separator_line "-"
|
||||
exclude=''
|
||||
content_line "\033[31m 已删除节点过滤关键字!!!\033[0m"
|
||||
fi
|
||||
setconfig exclude "'$exclude'"
|
||||
}
|
||||
|
||||
gen_link_ele() { # 包含节点正则
|
||||
[ -z "$include" ] && include="未设置"
|
||||
separator_line "-"
|
||||
content_line "\033[33m当前筛选关键字:\033[47;30m$include\033[0m"
|
||||
separator_line "-"
|
||||
content_line "\033[33m仅有匹配关键字的节点才会被【导入】!!!\033[0m"
|
||||
content_line "多个关键字可以用\033[30;47m | \033[0m号分隔"
|
||||
content_line "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代"
|
||||
separator_line "-"
|
||||
content_line " 000 \033[31m删除\033[0m关键字"
|
||||
content_line " 回车 取消输入并返回上级菜单"
|
||||
separator_line "-"
|
||||
read -r -p "请输入关键字 > " include
|
||||
if [ "$include" = '000' ]; then
|
||||
separator_line "-"
|
||||
include=''
|
||||
content_line "\033[31m 已删除节点匹配关键字!!!\033[0m"
|
||||
fi
|
||||
setconfig include "'$include'"
|
||||
}
|
||||
|
||||
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}')
|
||||
separator_line "-"
|
||||
content_line "当前使用规则为:\033[33m$now\033[0m"
|
||||
separator_line "-"
|
||||
list_box "$list"
|
||||
separator_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
|
||||
setconfig rule_link $rule_link
|
||||
separator_line "-"
|
||||
content_line "\033[32m设置成功!返回上级菜单\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
gen_link_server() { #选择Subconverter服务器
|
||||
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}')
|
||||
separator_line "-"
|
||||
content_line "\033[36m以下为互联网采集的第三方服务器,具体安全性请自行斟酌!\033[0m"
|
||||
content_line "\033[32m感谢以下作者的无私奉献!!!\033[0m"
|
||||
content_line "当前使用后端为:\033[33m$now\033[0m"
|
||||
separator_line "-"
|
||||
list_box "$list"
|
||||
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
|
||||
setconfig server_link $server_link
|
||||
separator_line "-"
|
||||
content_line "\033[32m设置成功!返回上级菜单\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
set_sub_ua() {
|
||||
separator_line "-"
|
||||
content_line "\033[36m无法正确获取配置文件时可尝试使用\033[0m"
|
||||
content_line " 1 使用自动UA(默认)"
|
||||
content_line " 2 不使用UA"
|
||||
content_line " 3 使用自定义UA:\033[32m$user_agent\033[0m"
|
||||
separator_line "-"
|
||||
read -r -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
user_agent=''
|
||||
;;
|
||||
1)
|
||||
user_agent='auto'
|
||||
;;
|
||||
2)
|
||||
user_agent='none'
|
||||
;;
|
||||
3)
|
||||
read -r -p "请输入自定义UA(不要包含空格和特殊符号!) > " text
|
||||
[ -n "$text" ] && user_agent="$text"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
[ "$num" -le 3 ] && setconfig user_agent "$user_agent"
|
||||
}
|
||||
154
scripts/menus/tui_layout.sh
Normal file
154
scripts/menus/tui_layout.sh
Normal file
@@ -0,0 +1,154 @@
|
||||
# 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 for right side text
|
||||
# color sould be disabled
|
||||
content_right() {
|
||||
content_line "$(printf "%$((${TABLE_WIDTH:-60} - 3))s" "$1")"
|
||||
}
|
||||
# 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"
|
||||
}
|
||||
|
||||
|
||||
22
scripts/menus/tui_lite.sh
Normal file
22
scripts/menus/tui_lite.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
TABLE_WIDTH=60
|
||||
|
||||
content_line() {
|
||||
printf '%b' " $1\n"
|
||||
}
|
||||
|
||||
content_right() {
|
||||
printf "%$((TABLE_WIDTH - 13))s\n" "$1"
|
||||
}
|
||||
sub_content_line() {
|
||||
content_line " $1"
|
||||
}
|
||||
|
||||
separator_line() {
|
||||
echo "-----------------------------------------------"
|
||||
}
|
||||
|
||||
line_break() {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1,19 +1,30 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
#卸载
|
||||
# 卸载
|
||||
uninstall() {
|
||||
read -p "确认卸载ShellCrash?(警告:该操作不可逆!)[1/0] > " res
|
||||
comp_box "\033[31m警告:\033[0m" \
|
||||
"\033[31m该操作不可逆!\033" \
|
||||
"是否确认卸载ShellCrash:"
|
||||
content_line "1) 是"
|
||||
content_line "0) 否"
|
||||
separator_line "="
|
||||
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 "是否保留脚本配置及订阅文件:"
|
||||
content_line "1) 是"
|
||||
content_line "0) 否"
|
||||
separator_line "="
|
||||
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 +37,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 +65,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
|
||||
}
|
||||
|
||||
141
scripts/menus/userguide.sh
Normal file
141
scripts/menus/userguide.sh
Normal file
@@ -0,0 +1,141 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
[ -n "$__IS_MODULE_USERGUIDE_LOADED" ] && return
|
||||
__IS_MODULE_USERGUIDE_LOADED=1
|
||||
|
||||
forwhat() {
|
||||
while true; do
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[30;46m 欢迎使用ShellCrash新手引导! \033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m请先选择你的使用环境: \033[0m"
|
||||
echo -e "\033[0m(你之后依然可以在设置中更改各种配置)\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
echo -e " 1 \033[32m路由设备配置局域网透明代理\033[0m"
|
||||
echo -e " 2 \033[36mLinux设备仅配置本机代理\033[0m"
|
||||
[ -f "$CFG_PATH.bak" ] && echo -e " 3 \033[33m还原之前备份的设置\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -r -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
"" | 1)
|
||||
# 设置运行模式
|
||||
redir_mod="Mix"
|
||||
echo "$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
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m检测到你的设备尚未开启ip转发,局域网设备将无法正常连接网络,是否立即开启?\033[0m"
|
||||
read -r -p "是否开启?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
|
||||
sysctl -w net.ipv4.ip_forward=1
|
||||
} && echo "已成功开启ipv4转发,如未正常开启,请手动重启设备!" || echo "开启失败!请自行谷歌查找当前设备的开启方法!"
|
||||
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"
|
||||
echo "$cputype" | grep -Eq "linux.*mips.*" && setconfig crashcore "clash"
|
||||
setconfig common_ports "OFF"
|
||||
setconfig firewall_area '2'
|
||||
break
|
||||
;;
|
||||
3)
|
||||
mv -f "$CFG_PATH.bak" "$CFG_PATH"
|
||||
echo -e "\033[32m脚本设置已还原!\033[0m"
|
||||
echo -e "\033[33m请重新启动脚本!\033[0m"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 新手引导
|
||||
userguide() {
|
||||
. "$CRASHDIR"/libs/check_dir_avail.sh
|
||||
forwhat
|
||||
|
||||
# 检测小内存模式
|
||||
dir_size=$(dir_avail "$CRASHDIR")
|
||||
if [ "$dir_size" -lt 10240 ]; then
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m检测到你的安装目录空间不足10M,是否开启小闪存模式?\033[0m"
|
||||
echo -e "\033[0m开启后核心及数据库文件将被下载到内存中,这将占用一部分内存空间\033[0m"
|
||||
echo -e "\033[0m每次开机后首次运行服务时都会自动的重新下载相关文件\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -r -p "是否开启?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
BINDIR=/tmp/ShellCrash
|
||||
setconfig BINDIR /tmp/ShellCrash "$CRASHDIR"/configs/command.env
|
||||
}
|
||||
fi
|
||||
|
||||
# 启用推荐的自动任务配置
|
||||
. "$CRASHDIR"/menus/5_task.sh && task_recom
|
||||
|
||||
# 小米设备软固化
|
||||
if [ "$systype" = "mi_snapshot" ]; then
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[33m检测到为小米路由设备,启用软固化可防止路由升级后丢失SSH\033[0m"
|
||||
read -r -p "是否启用软固化功能?(1/0) > " res
|
||||
[ "$res" = 1 ] && mi_autoSSH
|
||||
fi
|
||||
|
||||
# 提示导入订阅或者配置文件
|
||||
if [ ! -s "$CRASHDIR"/yamls/config.yaml ] && [ ! -s "$CRASHDIR"/jsons/config.json ]; then
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[32m是否导入配置文件?\033[0m(这是运行前的最后一步)"
|
||||
echo -e "\033[0m你必须拥有一份配置文件才能运行服务!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -r -p "现在开始导入?(1/0) > " res
|
||||
[ "$res" = 1 ] && inuserguide=1 && {
|
||||
. "$CRASHDIR"/menus/6_core_config.sh && set_core_config
|
||||
inuserguide=""
|
||||
}
|
||||
fi
|
||||
|
||||
# 回到主界面
|
||||
echo "-----------------------------------------------"
|
||||
echo -e "\033[36m很好!现在只需要执行启动就可以愉快的使用了!\033[0m"
|
||||
echo "-----------------------------------------------"
|
||||
read -r -p "立即启动服务?(1/0) > " res
|
||||
[ "$res" = 1 ] && start_core && sleep 2
|
||||
return 0
|
||||
}
|
||||
@@ -65,7 +65,7 @@ start)
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
logger ShellCrash服务即将关闭……
|
||||
logger ShellCrash服务即将关闭......
|
||||
[ -n "$(pidof CrashCore)" ] && web_save #保存面板配置
|
||||
#删除守护进程&面板配置自动保存
|
||||
cronset '保守模式守护进程'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -5,8 +5,8 @@ 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用户启用本机代理'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -44,7 +45,7 @@ get_core_config() { #下载内核配置文件
|
||||
fi
|
||||
#输出
|
||||
echo "-----------------------------------------------"
|
||||
logger "正在连接服务器获取【$target】配置文件…………"
|
||||
logger "正在连接服务器获取【$target】配置文件…………" 36
|
||||
echo -e "链接地址为:\033[4;32m$Https\033[0m"
|
||||
echo 可以手动复制该链接到浏览器打开并查看数据是否正常!
|
||||
#获取在线config文件
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -267,7 +267,7 @@ EOF
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
. "$CRASHDIR"/libs/sb_inbounds.sh
|
||||
}
|
||||
if [ "$redir_mod" = "混合模式" -o "$redir_mod" = "Tun模式" ]; then
|
||||
if [ "$redir_mod" = "Mix" -o "$redir_mod" = "Tun" ]; then
|
||||
[ "ipv6_redir" = 'ON' ] && ipv6_address='"fe80::e5c5:2469:d09b:609a/64",'
|
||||
cat >>"$TMPDIR"/jsons/tun.json <<EOF
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user