Compare commits

..
6 Commits
Author SHA1 Message Date
juewuy de1d9e20f7 Merge pull request #1336 from Maozai-Teng/dev
优化高倍率代码的匹配和鲁棒性
2026-08-27 12:12:45 +08:00
小小小猫仔 df9ae2a8d8 优化高倍率代码的匹配和鲁棒性
优化高倍率代码的匹配和鲁棒性
2026-08-27 11:41:16 +08:00
小小小猫仔 b255ac47f4 优化高倍率代码的匹配和鲁棒性
优化高倍率代码的匹配和鲁棒性
2026-08-27 11:40:36 +08:00
juewuy ed18140af6 Merge pull request #1325 from pure-white-ice-cream/dev
修复 compose 中, 删除重建容器, 开机自启功能失效
2026-08-11 17:38:52 +08:00
纯白色冰淇淋 376197c654 ~修复 Docker 仅挂载 configs 时重建容器丢失内核配置的问题:补充 yamls/jsons 卷挂载 2026-08-11 14:08:53 +08:00
纯白色冰淇淋 d37267bceb ~修复 Docker 删除重建容器后丢失开机自启状态的问题:将 s6 自启标记持久化到 configs 卷,并在启动时通过 S6_STAGE2_HOOK 同步 2026-08-11 11:54:40 +08:00
26 changed files with 99 additions and 87 deletions
+3
View File
@@ -74,7 +74,10 @@ COPY --from=builder /tmp/s6_noarch.tar.xz /tmp/s6_noarch.tar.xz
RUN tar -xJf /tmp/s6_noarch.tar.xz -C / && rm -rf /tmp/s6_noarch.tar.xz RUN tar -xJf /tmp/s6_noarch.tar.xz -C / && rm -rf /tmp/s6_noarch.tar.xz
RUN tar -xJf /tmp/s6_arch.tar.xz -C / && rm -rf /tmp/s6_arch.tar.xz RUN tar -xJf /tmp/s6_arch.tar.xz -C / && rm -rf /tmp/s6_arch.tar.xz
COPY docker/s6-rc.d /etc/s6-overlay/s6-rc.d COPY docker/s6-rc.d /etc/s6-overlay/s6-rc.d
COPY docker/s6-overlay/scripts/sync-autostart /etc/s6-overlay/scripts/sync-autostart
RUN chmod +x /etc/s6-overlay/scripts/sync-autostart
ENV S6_CMD_WAIT_FOR_SERVICES=1 ENV S6_CMD_WAIT_FOR_SERVICES=1
ENV S6_STAGE2_HOOK=/etc/s6-overlay/scripts/sync-autostart
ENTRYPOINT ["/init"] ENTRYPOINT ["/init"]
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1,4 +1,4 @@
meta_v=v1.19.17 meta_v=v1.19.17
singboxr_v=1.13.0-alpha.27 singboxr_v=1.13.0-alpha.27
versionsh=1.9.5beta4 versionsh=1.9.5beta3
GeoIP_v=20251205 GeoIP_v=20251205
+3 -1
View File
@@ -89,6 +89,8 @@ mkdir -p /root/ShellCrash
docker run -d \ docker run -d \
……………… ………………
-v shellcrash_configs:/etc/ShellCrash/configs \ -v shellcrash_configs:/etc/ShellCrash/configs \
-v shellcrash_yamls:/etc/ShellCrash/yamls \
-v shellcrash_jsons:/etc/ShellCrash/jsons \
……………… ………………
``` ```
@@ -134,7 +136,7 @@ docker rm -f shellcrash
### Docker删除卷 ### Docker删除卷
```shell ```shell
docker volume rm shellcrash_configs docker volume rm shellcrash_configs shellcrash_yamls shellcrash_jsons
``` ```
### Compose删除容器&卷 ### Compose删除容器&卷
+4
View File
@@ -18,10 +18,14 @@ services:
# - net.ipv6.conf.all.forwarding=1 # - net.ipv6.conf.all.forwarding=1
volumes: volumes:
- shellcrash_configs:/etc/ShellCrash/configs:rw - shellcrash_configs:/etc/ShellCrash/configs:rw
- shellcrash_yamls:/etc/ShellCrash/yamls:rw
- shellcrash_jsons:/etc/ShellCrash/jsons:rw
restart: unless-stopped restart: unless-stopped
volumes: volumes:
shellcrash_configs: shellcrash_configs:
shellcrash_yamls:
shellcrash_jsons:
networks: networks:
macvlan_lan: macvlan_lan:
+22
View File
@@ -0,0 +1,22 @@
#!/bin/sh
# 在 s6-rc 编译 user bundle 之前,把 configs 卷中的自启状态同步到 contents.d
# 由 S6_STAGE2_HOOK 调用;删除重建容器后仍可按 volume 恢复开机自启
CRASHDIR=/etc/ShellCrash
CFG_MARK="$CRASHDIR/configs/.autostart"
S6_MARK=/etc/s6-overlay/s6-rc.d/user/contents.d/afstart
mkdir -p "$CRASHDIR/configs" /etc/s6-overlay/s6-rc.d/user/contents.d
# 兼容旧容器:仅有 s6 标记时迁移到 configs
if [ -f "$S6_MARK" ] && [ ! -f "$CFG_MARK" ]; then
touch "$CFG_MARK"
fi
if [ -f "$CFG_MARK" ] && [ ! -f "$CRASHDIR/.dis_startup" ]; then
touch "$S6_MARK"
else
rm -f "$S6_MARK"
fi
exit 0
@@ -11,7 +11,7 @@ proxy-groups:
- {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, ✨ 自动选择(去高倍率), 🛠️ 手动切换, ⚖️ 负载均衡, 🚑 故障转移, 🎯 本地直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]} - {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, ✨ 自动选择(去高倍率), 🛠️ 手动切换, ⚖️ 负载均衡, 🚑 故障转移, 🎯 本地直连, 🇭🇰 香港节点, 🇹🇼 台湾节点, 🇺🇸 美国节点, 🇯🇵 日本节点, 🇪🇺 欧洲节点, 🇰🇷 韩国节点, 🇸🇬 狮城节点, 👑 高级节点, 📉 省流节点, {providers_tags}]}
- {name: 🛠️ 手动切换, type: select, include-all: true, 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)"}
- {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: 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]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))"}
- {name: ⚖️ 负载均衡, type: load-balance, interval: 1800, include-all: true, hidden: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"} - {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: 🚑 故障转移, type: fallback, interval: 1800, include-all: true, hidden: true, exclude-filter: "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)"}
# #
@@ -51,7 +51,7 @@ proxy-groups:
- {name: 🇰🇷 韩国节点, type: url-test, interval: 120, tolerance: 50, include-all: true, filter: "(?i)(🇰🇷|韩|韓|首尔|kr|kor)"} - {name: 🇰🇷 韩国节点, type: url-test, interval: 120, tolerance: 50, include-all: true, filter: "(?i)(🇰🇷|韩|韓|首尔|kr|kor)"}
- {name: 🇸🇬 狮城节点, type: url-test, interval: 120, tolerance: 50, include-all: true, filter: "(?i)(🇸🇬|新加坡|狮城|sg|singapore)"} - {name: 🇸🇬 狮城节点, type: url-test, interval: 120, tolerance: 50, include-all: true, filter: "(?i)(🇸🇬|新加坡|狮城|sg|singapore)"}
- {name: 👑 高级节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|\\d{2,}))"} - {name: 👑 高级节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|(x([2-9]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))"}
- {name: 📉 省流节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(0\\.[1-6]|低倍率|省流|大流量|公益|免费|闲时|Low)"} - {name: 📉 省流节点, type: url-test, interval: 1800, tolerance: 50, include-all: true, filter: "(?i)(0\\.[1-6]|低倍率|省流|大流量|公益|免费|闲时|Low)"}
#规则提供者(更新mrs格式) #规则提供者(更新mrs格式)
@@ -4,7 +4,7 @@
{ "tag": "🚀 节点选择", "type": "selector", "outbounds": ["♻️ 自动选择", "✨ 自动选择(去高倍率)", "🛠️ 手动切换", "🎯 本地直连", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] }, { "tag": "🚀 节点选择", "type": "selector", "outbounds": ["♻️ 自动选择", "✨ 自动选择(去高倍率)", "🛠️ 手动切换", "🎯 本地直连", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
{ "tag": "🛠️ 手动切换", "type": "selector", "use_all_providers": true, "outbounds": ["🎯 本地直连", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] }, { "tag": "🛠️ 手动切换", "type": "selector", "use_all_providers": true, "outbounds": ["🎯 本地直连", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
{ "tag": "♻️ 自动选择", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)" }, { "tag": "♻️ 自动选择", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www)" },
{ "tag": "✨ 自动选择(去高倍率)", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|[0-9][0-9]+))" }, { "tag": "✨ 自动选择(去高倍率)", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|(x([2-9]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))" },
{ "tag": "🤖 AI 平台", "type": "selector", "outbounds": ["🚀 节点选择", "🤖 AI节点(过滤港澳)", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] }, { "tag": "🤖 AI 平台", "type": "selector", "outbounds": ["🚀 节点选择", "🤖 AI节点(过滤港澳)", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
{ "tag": "🤖 AI节点(过滤港澳)", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|🇭🇰|港|🇲🇴|澳门|hk|hongkong|hong kong)" }, { "tag": "🤖 AI节点(过滤港澳)", "type": "urltest", "interval": "2m", "use_all_providers": true, "exclude": "(?i)(剩余|重置|到期|防失联|官网|导航|客服|http|www|🇭🇰|港|🇲🇴|澳门|hk|hongkong|hong kong)" },
@@ -42,7 +42,7 @@
{ "tag": "🇰🇷 韩国节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(🇰🇷|韩|韓|首尔|kr|kor)" }, { "tag": "🇰🇷 韩国节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(🇰🇷|韩|韓|首尔|kr|kor)" },
{ "tag": "🇸🇬 狮城节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(🇸🇬|新加坡|狮城|sg|singapore)" }, { "tag": "🇸🇬 狮城节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(🇸🇬|新加坡|狮城|sg|singapore)" },
{ "tag": "👑 高级节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|x([2-9]|[0-9][0-9]+))" }, { "tag": "👑 高级节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(专线|专用|高级|直连|急速|高速|高倍率|游戏|铂金|钻石|企业|VIP|Ultra|Game|IEPL|IPLC|AIA|BGP|GIA|CN2|CMI|HGC|HKT|CTM|CC|AC|(x([2-9]|[1-9][0-9]+)|([2-9]|[1-9][0-9]+)x))" },
{ "tag": "📉 省流节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(0[.][1-5]|低倍率|省流|大流量|公益|免费|闲时|Low)" } { "tag": "📉 省流节点", "type": "urltest", "interval": "2m", "use_all_providers": true, "include": "(?i)(0[.][1-5]|低倍率|省流|大流量|公益|免费|闲时|Low)" }
], ],
"route": { "route": {
+5 -16
View File
@@ -83,27 +83,16 @@ for file in start.sh starts/bfstart.sh starts/afstart.sh starts/fw_stop.sh menu.
done done
setconfig versionsh_l $version setconfig versionsh_l $version
#生成用于执行启动服务的变量文件 #生成用于执行启动服务的变量文件
DIRECTORIES_FILE="$CRASHDIR"/configs/directories.env [ ! -f "$CRASHDIR"/configs/command.env ] && {
COMMAND_FILE="$CRASHDIR"/configs/command.env echo 'TMPDIR=/tmp/ShellCrash' > "$CRASHDIR"/configs/command.env
if [ ! -f "$DIRECTORIES_FILE" ]; then echo "BINDIR=$CRASHDIR" >> "$CRASHDIR"/configs/command.env
#迁移旧版中与启动命令混放的目录变量 }
if [ -f "$COMMAND_FILE" ]; then
. "$COMMAND_FILE"
fi
[ -z "$TMPDIR" ] && TMPDIR=/tmp/ShellCrash
[ -z "$BINDIR" ] && BINDIR=$CRASHDIR
printf 'TMPDIR=%s\nBINDIR=%s\n' "$TMPDIR" "$BINDIR" > "$DIRECTORIES_FILE"
[ -f "$COMMAND_FILE" ] && sed -i '/^TMPDIR=.*/d; /^BINDIR=.*/d' "$COMMAND_FILE"
else
. "$DIRECTORIES_FILE"
fi
[ -f "$COMMAND_FILE" ] || : > "$COMMAND_FILE"
if [ -n "$(grep 'crashcore=singbox' "$CFG_PATH")" ]; then if [ -n "$(grep 'crashcore=singbox' "$CFG_PATH")" ]; then
COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"' COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"'
else else
COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"' COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
fi fi
setconfig COMMAND "$COMMAND" "$COMMAND_FILE" setconfig COMMAND "$COMMAND" "$CRASHDIR"/configs/command.env
#设置防火墙执行模式 #设置防火墙执行模式
grep -q 'firewall_mod' "$CRASHDIR/configs/ShellClash.cfg" 2>/dev/null || { grep -q 'firewall_mod' "$CRASHDIR/configs/ShellClash.cfg" 2>/dev/null || {
firewall_mod=iptables firewall_mod=iptables
+21 -1
View File
@@ -1,3 +1,22 @@
# s6 / Docker:自启状态以 configs 卷内标记为准,并同步到 s6 contents.d
enable_s6_autostart_marks() {
mkdir -p "$CRASHDIR/configs" /etc/s6-overlay/s6-rc.d/user/contents.d
touch "$CRASHDIR/configs/.autostart" /etc/s6-overlay/s6-rc.d/user/contents.d/afstart
}
disable_s6_autostart_marks() {
rm -f "$CRASHDIR/configs/.autostart" /etc/s6-overlay/s6-rc.d/user/contents.d/afstart
}
# 将旧版仅写在可写层的 s6 标记迁移到 configs
migrate_s6_autostart_mark() {
if [ -f /etc/s6-overlay/s6-rc.d/user/contents.d/afstart ] && [ ! -f "$CRASHDIR/configs/.autostart" ]; then
mkdir -p "$CRASHDIR/configs"
touch "$CRASHDIR/configs/.autostart"
fi
}
check_autostart(){ check_autostart(){
if [ "$start_old" = ON ];then if [ "$start_old" = ON ];then
[ ! -f "$CRASHDIR"/.dis_startup ] && return 0 [ ! -f "$CRASHDIR"/.dis_startup ] && return 0
@@ -7,7 +26,8 @@ check_autostart(){
elif ckcmd systemctl; then elif ckcmd systemctl; then
[ "$(systemctl is-enabled shellcrash.service 2>&1)" = enabled ] && return 0 [ "$(systemctl is-enabled shellcrash.service 2>&1)" = enabled ] && return 0
elif grep -q 's6' /proc/1/comm; then elif grep -q 's6' /proc/1/comm; then
[ -f /etc/s6-overlay/s6-rc.d/user/contents.d/afstart ] && return 0 migrate_s6_autostart_mark
[ -f "$CRASHDIR/configs/.autostart" ] && [ ! -f "$CRASHDIR"/.dis_startup ] && return 0
elif rc-status -r >/dev/null 2>&1; then elif rc-status -r >/dev/null 2>&1; then
rc-update show default | grep -q "shellcrash" && return 0 rc-update show default | grep -q "shellcrash" && return 0
else else
-1
View File
@@ -2,7 +2,6 @@
# 检查配置文件 # 检查配置文件
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task [ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
[ -f "$CRASHDIR"/configs/ShellCrash.cfg ] || . "$CRASHDIR"/init.sh >/dev/null 2>&1 [ -f "$CRASHDIR"/configs/ShellCrash.cfg ] || . "$CRASHDIR"/init.sh >/dev/null 2>&1
[ -f "$CRASHDIR"/configs/directories.env ] && . "$CRASHDIR"/configs/directories.env >/dev/null 2>&1
. "$CRASHDIR"/configs/command.env >/dev/null 2>&1 . "$CRASHDIR"/configs/command.env >/dev/null 2>&1
. "$CRASHDIR"/configs/ShellCrash.cfg . "$CRASHDIR"/configs/ShellCrash.cfg
+10 -15
View File
@@ -1,15 +1,10 @@
if [ "$network_check" = "OFF" ]; then i=1
#复用网络检查开关:禁用自启网络检查时,也跳过启动后的面板端口校验 while [ -z "$test" -a "$i" -lt 30 ]; do
test=skip sleep 1
else if curl --version >/dev/null 2>&1; then
i=1 test=$(curl -s -H "Authorization: Bearer $secret" http://127.0.0.1:${db_port}/proxies | grep -o proxies)
while [ -z "$test" ] && [ "$i" -lt 30 ]; do else
sleep 1 test=$(wget -q --header="Authorization: Bearer $secret" -O - http://127.0.0.1:${db_port}/proxies | grep -o proxies)
if curl --version >/dev/null 2>&1; then fi
test=$(curl -s -H "Authorization: Bearer $secret" http://127.0.0.1:${db_port}/proxies | grep -o proxies) i=$((i + 1))
else done
test=$(wget -q --header="Authorization: Bearer $secret" -O - http://127.0.0.1:${db_port}/proxies | grep -o proxies)
fi
i=$((i + 1))
done
fi
+7 -7
View File
@@ -12,7 +12,7 @@ allow_autostart() {
fi fi
ckcmd systemctl && systemctl enable shellcrash.service >/dev/null 2>&1 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 grep -q 's6' /proc/1/comm && enable_s6_autostart_marks
rc-status -r >/dev/null 2>&1 && rc-update add shellcrash default >/dev/null 2>&1 rc-status -r >/dev/null 2>&1 && rc-update add shellcrash default >/dev/null 2>&1
rm -rf "$CRASHDIR"/.dis_startup rm -rf "$CRASHDIR"/.dis_startup
} }
@@ -20,7 +20,7 @@ allow_autostart() {
disable_autostart() { disable_autostart() {
[ -d /etc/rc.d ] && cd /etc/rc.d && rm -rf *shellcrash >/dev/null 2>&1 && cd - >/dev/null [ -d /etc/rc.d ] && cd /etc/rc.d && rm -rf *shellcrash >/dev/null 2>&1 && cd - >/dev/null
ckcmd systemctl && systemctl disable shellcrash.service >/dev/null 2>&1 ckcmd systemctl && systemctl disable shellcrash.service >/dev/null 2>&1
grep -q 's6' /proc/1/comm && rm -rf /etc/s6-overlay/s6-rc.d/user/contents.d/afstart grep -q 's6' /proc/1/comm && disable_s6_autostart_marks
rc-status -r >/dev/null 2>&1 && rc-update del shellcrash default >/dev/null 2>&1 rc-status -r >/dev/null 2>&1 && rc-update del shellcrash default >/dev/null 2>&1
touch "$CRASHDIR"/.dis_startup touch "$CRASHDIR"/.dis_startup
} }
@@ -131,7 +131,7 @@ setboot() {
msg_alert "\033[33m$SETBOOT_MINI_DISABLED\033[0m" msg_alert "\033[33m$SETBOOT_MINI_DISABLED\033[0m"
fi fi
fi fi
sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/directories.env sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/command.env
sleep 1 sleep 1
;; ;;
5) 5)
@@ -155,8 +155,8 @@ setboot() {
set_usb_dir() { set_usb_dir() {
while true; do while true; do
comp_box "$SETBOOT_SELECT_INSTALL_DIR" comp_box "$SETBOOT_SELECT_INSTALL_DIR"
du -hL -d 2 /mnt | du -hL /mnt |
awk '{print NR") "$2" ($SETBOOT_SPACE_USED"$1")"}' | awk '{print NR") "$2" ($SETBOOT_SPACE_USED$1")"}' |
while IFS= read -r line; do while IFS= read -r line; do
content_line "$line" content_line "$line"
done done
@@ -164,7 +164,7 @@ setboot() {
content_line "0) $COMMON_BACK" content_line "0) $COMMON_BACK"
separator_line "=" separator_line "="
read -r -p "$COMMON_INPUT> " num read -r -p "$COMMON_INPUT> " num
BINDIR=$(du -hL -d 2 /mnt | awk '{print $2}' | sed -n "$num"p) BINDIR=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p)
if [ "$num" = 0 ]; then if [ "$num" = 0 ]; then
return 1 return 1
elif [ -z "$BINDIR" ]; then elif [ -z "$BINDIR" ]; then
@@ -203,7 +203,7 @@ setboot() {
continue continue
;; ;;
esac esac
sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/directories.env sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/command.env
break break
done done
;; ;;
+2 -2
View File
@@ -228,8 +228,8 @@ task_type() {
[ -n "$cron_time" ] && set_service running "$task_id" "$TASK5_RUNNING_PREFIX$time_des$task_name" "$cron_time" [ -n "$cron_time" ] && set_service running "$task_id" "$TASK5_RUNNING_PREFIX$time_des$task_name" "$cron_time"
;; ;;
8) 8)
comp_box "$TASK5_AFFW_HINT" \ comp_box "$TASK5_AFFW_HINT"
"$TASK5_CONFIRM_CONTINUE" "$TASK5_CONFIRM_CONTINUE"
btm_box "1) $TASK5_YES" \ btm_box "1) $TASK5_YES" \
"0) $TASK5_NO" "0) $TASK5_NO"
read -r -p "$COMMON_INPUT> " res read -r -p "$COMMON_INPUT> " res
+4 -17
View File
@@ -15,19 +15,6 @@ else
fi fi
URI_EXP='ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)?' URI_EXP='ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)?'
# 按变量名字面值删除订阅配置
delete_provider() {
provider_name=$1
provider_file=$2
[ -f "$provider_file" ] || return 0
provider_tmp="$provider_file.tmp.$$"
NAME="$provider_name" awk 'index($0, ENVIRON["NAME"] " ") != 1' "$provider_file" >"$provider_tmp" &&
cat "$provider_tmp" >"$provider_file"
provider_status=$?
rm -f "$provider_tmp"
return "$provider_status"
}
# 配置文件主界面 # 配置文件主界面
set_core_config() { set_core_config() {
while true; do while true; do
@@ -288,10 +275,10 @@ setproviders() {
;; ;;
d) d)
if [ -n "$name" ] && [ -n "$link" ]; then if [ -n "$name" ] && [ -n "$link" ]; then
delete_provider "$name" "$CRASHDIR"/configs/providers.cfg 2>/dev/null sed -i "/^$name /d" "$CRASHDIR"/configs/providers.cfg 2>/dev/null
msg_alert "\033[32m$COMMON_SUCCESS\033[0m" msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
elif [ -n "$name" ] && [ -n "$link_uri" ]; then elif [ -n "$name" ] && [ -n "$link_uri" ]; then
delete_provider "$name" "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null sed -i "/^$name /d" "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null
msg_alert "\033[32m$COMMON_SUCCESS\033[0m" msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
fi fi
break break
@@ -337,8 +324,8 @@ setproviders() {
# 保存 # 保存
saveproviders() { saveproviders() {
[ -n "$name" ] && { [ -n "$name" ] && {
[ -s "$CRASHDIR"/configs/providers.cfg ] && delete_provider "$last_name" "$CRASHDIR"/configs/providers.cfg [ -s "$CRASHDIR"/configs/providers.cfg ] && sed -i "/^$last_name /d" "$CRASHDIR"/configs/providers.cfg
[ -s "$CRASHDIR"/configs/providers_uri.cfg ] && delete_provider "$last_name" "$CRASHDIR"/configs/providers_uri.cfg [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && sed -i "/^$last_name /d" "$CRASHDIR"/configs/providers_uri.cfg
} }
if [ -n "$name" ] && [ -n "$link" ]; then if [ -n "$name" ] && [ -n "$link" ]; then
echo "$name $link $interval $interval2 $ua #$exclude_w #$include_w" >>"$CRASHDIR"/configs/providers.cfg echo "$name $link $interval $interval2 $ua #$exclude_w #$include_w" >>"$CRASHDIR"/configs/providers.cfg
+1 -1
View File
@@ -7,7 +7,7 @@ running_status(){
if [ -n "$start_time" ]; then if [ -n "$start_time" ]; then
time=$(($(date +%s) - start_time)) time=$(($(date +%s) - start_time))
day=$((time / 86400)) day=$((time / 86400))
[ "$day" = "0" ] && day='' || day="${day}D" [ "$day" = "0" ] && day='' || day="$dayD"
time=$(date -u -d @${time} +%H:%M:%S) time=$(date -u -d @${time} +%H:%M:%S)
fi fi
} }
+1 -1
View File
@@ -135,7 +135,7 @@ hotupdate() { #热更新订阅
. "$CRASHDIR"/starts/core_config.sh && get_core_config && . "$CRASHDIR"/starts/core_config.sh && get_core_config &&
. "$CRASHDIR"/starts/check_core.sh && check_core && . "$CRASHDIR"/starts/check_core.sh && check_core &&
. "$CRASHDIR"/starts/"$target"_modify.sh && modify_"$format" && rm -rf "$TMPDIR"/CrashCore && . "$CRASHDIR"/starts/"$target"_modify.sh && modify_"$format" && rm -rf "$TMPDIR"/CrashCore &&
. "$CRASHDIR"/libs/web_restore.sh && put_save "http://127.0.0.1:$db_port/configs" "{\"path\":\"$CRASHDIR/config.$format\"}" . "$CRASHDIR"/libs/web_restore.sh && put_save "http://127.0.0.1:$db_port/configs" "{\"path\":\"$TMPDIR/config.$format\"}"
exit $? exit $?
} }
+2 -1
View File
@@ -69,6 +69,7 @@ forwhat() {
fi fi
ckcmd systemctl && [ "$(cat /proc/1/comm)" = "systemd" ] && systemctl enable shellcrash.service >/dev/null 2>&1 ckcmd systemctl && [ "$(cat /proc/1/comm)" = "systemd" ] && systemctl enable shellcrash.service >/dev/null 2>&1
grep -q 's6' /proc/1/comm && enable_s6_autostart_marks
rm -rf "$CRASHDIR"/.dis_startup rm -rf "$CRASHDIR"/.dis_startup
autostart=enable autostart=enable
# 检测IP转发 # 检测IP转发
@@ -123,7 +124,7 @@ userguide() {
read -r -p "$COMMON_INPUT_R" res read -r -p "$COMMON_INPUT_R" res
[ "$res" = 1 ] && { [ "$res" = 1 ] && {
BINDIR=/tmp/ShellCrash BINDIR=/tmp/ShellCrash
sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/directories.env sed -i "s#BINDIR=.*#BINDIR=$BINDIR#" "$CRASHDIR"/configs/command.env
} }
fi fi
+2 -1
View File
@@ -11,6 +11,7 @@
. "$CRASHDIR"/libs/set_config.sh . "$CRASHDIR"/libs/set_config.sh
. "$CRASHDIR"/libs/set_cron.sh . "$CRASHDIR"/libs/set_cron.sh
. "$CRASHDIR"/libs/check_cmd.sh . "$CRASHDIR"/libs/check_cmd.sh
. "$CRASHDIR"/libs/check_autostart.sh
. "$CRASHDIR"/libs/compare.sh . "$CRASHDIR"/libs/compare.sh
. "$CRASHDIR"/libs/logger.sh . "$CRASHDIR"/libs/logger.sh
. "$CRASHDIR"/libs/web_save.sh . "$CRASHDIR"/libs/web_save.sh
@@ -54,7 +55,7 @@ start)
systemctl start shellcrash.service || . "$CRASHDIR"/starts/start_error.sh systemctl start shellcrash.service || . "$CRASHDIR"/starts/start_error.sh
elif grep -q 's6' /proc/1/comm; then elif grep -q 's6' /proc/1/comm; then
bfstart && /command/s6-svc -u /run/service/shellcrash && { bfstart && /command/s6-svc -u /run/service/shellcrash && {
[ ! -f "$CRASHDIR"/.dis_startup ] && touch /etc/s6-overlay/s6-rc.d/user/contents.d/afstart [ ! -f "$CRASHDIR"/.dis_startup ] && enable_s6_autostart_marks
afstart & afstart &
} }
elif rc-status -r >/dev/null 2>&1; then elif rc-status -r >/dev/null 2>&1; then
-1
View File
@@ -1,7 +1,6 @@
. "$CRASHDIR"/libs/check_target.sh . "$CRASHDIR"/libs/check_target.sh
. "$CRASHDIR"/libs/core_tools.sh . "$CRASHDIR"/libs/core_tools.sh
. "$CRASHDIR"/configs/directories.env
. "$CRASHDIR"/configs/command.env . "$CRASHDIR"/configs/command.env
check_core() { #检查及下载内核文件 check_core() { #检查及下载内核文件
-3
View File
@@ -4,9 +4,6 @@
check_config() { #检查clash配置文件 check_config() { #检查clash配置文件
#检测节点或providers #检测节点或providers
sed -n "/^proxies:/,/^[a-z]/ { /^[a-z]/d; p; }" "$core_config_new" >"$TMPDIR"/proxies.yaml sed -n "/^proxies:/,/^[a-z]/ { /^[a-z]/d; p; }" "$core_config_new" >"$TMPDIR"/proxies.yaml
if [ ! -s "$TMPDIR"/proxies.yaml ]; then
sed -n 's/^proxies:[[:space:]]*\[\(.*\)\][[:space:]]*$/ - \1/p' "$core_config_new" >"$TMPDIR"/proxies.yaml
fi
if ! grep -Eq 'server:|server":|server'\'':' "$TMPDIR"/proxies.yaml && ! grep -q 'proxy-providers:' "$core_config_new"; then if ! grep -Eq 'server:|server":|server'\'':' "$TMPDIR"/proxies.yaml && ! grep -q 'proxy-providers:' "$core_config_new"; then
echo "-----------------------------------------------" echo "-----------------------------------------------"
logger "获取到了配置文件【$core_config_new】,但似乎并不包含正确的节点信息!" 31 logger "获取到了配置文件【$core_config_new】,但似乎并不包含正确的节点信息!" 31
-4
View File
@@ -121,10 +121,6 @@ split_and_customize_yaml_parts() {
yaml_char='proxies proxy-groups proxy-providers rules rule-providers sub-rules listeners' yaml_char='proxies proxy-groups proxy-providers rules rule-providers sub-rules listeners'
for char in $yaml_char; do for char in $yaml_char; do
sed -n "/^$char:/,/^[a-z]/ { /^[a-z]/d; p; }" $core_config >"$TMPDIR"/${char}.yaml sed -n "/^$char:/,/^[a-z]/ { /^[a-z]/d; p; }" $core_config >"$TMPDIR"/${char}.yaml
#支持 Clash 常见的单行 flow-style 节点列表,例如 proxies: [{name: ..., type: ...}]
if [ "$char" = proxies ] && [ ! -s "$TMPDIR"/proxies.yaml ]; then
sed -n 's/^proxies:[[:space:]]*\[\(.*\)\][[:space:]]*$/ - \1/p' "$core_config" >"$TMPDIR"/proxies.yaml
fi
done done
#跳过本地tls证书验证 #跳过本地tls证书验证
[ "$skip_cert" != "OFF" ] && sed -i 's/skip-cert-verify: false/skip-cert-verify: true/' "$TMPDIR"/proxies.yaml || [ "$skip_cert" != "OFF" ] && sed -i 's/skip-cert-verify: false/skip-cert-verify: true/' "$TMPDIR"/proxies.yaml ||
+1 -2
View File
@@ -6,8 +6,7 @@ description="Custom proxy service for ShellCrash"
#获取目录 #获取目录
CRASHDIR=$(cat /etc/profile | grep CRASHDIR | awk -F "\"" '{print $2}') CRASHDIR=$(cat /etc/profile | grep CRASHDIR | awk -F "\"" '{print $2}')
[ -z "$CRASHDIR" ] && CRASHDIR=$(cat ~/.bashrc | grep CRASHDIR | awk -F "\"" '{print $2}') [ -z "$CRASHDIR" ] && CRASHDIR=$(cat ~/.bashrc | grep CRASHDIR | awk -F "\"" '{print $2}')
. "${CRASHDIR}"/configs/directories.env #加载启动目录 . ${CRASHDIR}/configs/command.env #加载启动命令和启动目录
. "${CRASHDIR}"/configs/command.env #加载启动命令
# PID 文件 # PID 文件
pidfile="/run/shellcrash.pid" pidfile="/run/shellcrash.pid"
+1 -2
View File
@@ -8,8 +8,7 @@ USE_PROCD=1
#获取目录 #获取目录
CRASHDIR=$(cat /etc/profile | grep CRASHDIR | awk -F "\"" '{print $2}') CRASHDIR=$(cat /etc/profile | grep CRASHDIR | awk -F "\"" '{print $2}')
[ -z "$CRASHDIR" ] && CRASHDIR=$(cat ~/.bashrc | grep CRASHDIR | awk -F "\"" '{print $2}') [ -z "$CRASHDIR" ] && CRASHDIR=$(cat ~/.bashrc | grep CRASHDIR | awk -F "\"" '{print $2}')
. "$CRASHDIR"/configs/directories.env #加载启动目录 . "$CRASHDIR"/configs/command.env #加载启动命令和启动目录
. "$CRASHDIR"/configs/command.env #加载启动命令
start_service() { start_service() {
if [ -n "$(cat $CRASHDIR/configs/ShellCrash.cfg | grep 'firewall_area=5')" ]; then if [ -n "$(cat $CRASHDIR/configs/ShellCrash.cfg | grep 'firewall_area=5')" ]; then
+3 -4
View File
@@ -317,8 +317,7 @@ EOF
. "$CRASHDIR"/libs/sb_inbounds.sh . "$CRASHDIR"/libs/sb_inbounds.sh
} }
if [ "$redir_mod" = "Mix" ] || [ "$redir_mod" = "Tun" ]; then if [ "$redir_mod" = "Mix" ] || [ "$redir_mod" = "Tun" ]; then
[ "$ipv6_redir" = 'ON' ] && [ -n "$(ip -6 rule show)" ] && ipv6_address='"fd00:face:b00c::1/126",' [ "$ipv6_redir" = 'ON' ] && ipv6_address='"fd00:face:b00c::1/126",'
[ "$(printf '%s' "$core_v" | cut -d. -f2)" -le 14 ] && stack='"stack": "system",'
cat >>"$TMPDIR"/jsons/tun.json <<EOF cat >>"$TMPDIR"/jsons/tun.json <<EOF
{ {
"inbounds": [ "inbounds": [
@@ -330,8 +329,8 @@ EOF
$ipv6_address $ipv6_address
"198.18.0.1/15" "198.18.0.1/15"
], ],
$stack "auto_route": false,
"auto_route": false "stack": "system"
} }
] ]
} }
+1 -1
View File
@@ -1 +1 @@
1.9.5beta4 1.9.5beta3