mirror of
https://github.com/juewuy/ShellCrash.git
synced 2026-09-08 13:46:33 +00:00
Merge branch 'dev' into master
# Conflicts: # bin/version # scripts/menu.sh
This commit is contained in:
@@ -20,9 +20,11 @@ jobs:
|
||||
|
||||
steps:
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@master
|
||||
|
||||
- name: Checkout ShellCrash
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
||||
with:
|
||||
repository: juewuy/ShellCrash
|
||||
ref: dev
|
||||
- name: Apt Update
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name: Update Premium latest Core
|
||||
on:
|
||||
schedule:
|
||||
- cron: 0 20 * * 6
|
||||
#schedule:
|
||||
#- cron: 0 20 * * 6
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
|
||||
+19
-2
@@ -101,9 +101,26 @@ export url='https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master' && wget -q
|
||||
export url='http://t.jwsc.eu.org' && wget -q -O /tmp/install.sh $url/install.sh && sh /tmp/install.sh && source /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
~**DOCKER环境下安装:**<br>
|
||||
~**虚拟机/Docker环境安装:**<br>
|
||||
|
||||
虚拟机或Docker环境推荐使用Alpine镜像安装<br>
|
||||
|
||||
这里以Docker为例(其他虚拟机请自行查找安装Alpine镜像安装教程)<br>
|
||||
|
||||
```shell
|
||||
#注意,以下命令请分步执行!
|
||||
#Docker一键启动Alpine镜像
|
||||
docker run -d --name ShellCrash alpine sleep infinity
|
||||
#进入容器内sh环境
|
||||
docker exec -it ShellCrash sh
|
||||
#安装必要依赖
|
||||
apk add curl
|
||||
apk add nftables
|
||||
#执行安装命令
|
||||
export url='https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master' && sh -c "$(curl -kfsSl $url/install.sh)" && source /etc/profile &> /dev/null
|
||||
```
|
||||
|
||||
|
||||
请参考 [ShellCrash_docker 一键脚本和镜像](https://github.com/echvoyager/shellCrash_docker)
|
||||
|
||||
### **本地安装:**<br>
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
@@ -2,5 +2,7 @@ clashnet_v=v1.7.6
|
||||
clashpre_v=2022.11.25
|
||||
clash_v=v1.7.1
|
||||
meta_v=v1.18.0
|
||||
|
||||
singbox_v=1.7.8
|
||||
versionsh=1.8.5d
|
||||
GeoIP_v=20240113
|
||||
+10
-12
@@ -1,22 +1,20 @@
|
||||
# ID&类型 说明 地址 其他说明 (类型:100-稳定源;200-测试源;300-基础sub;400-meta_sub;500-规则地址)
|
||||
# ID&类型 说明 地址 其他说明 (类型:100-三版全通源;200-单一源;300-基础sub;400-meta_sub;500-规则地址)
|
||||
|
||||
101 Jsdelivr-CDN源 https://fastly.jsdelivr.net/gh/juewuy/ShellCrash 稳定版
|
||||
102 Github源(须clash服务启用) https://raw.githubusercontent.com/juewuy/ShellCrash 稳定版
|
||||
101 Jsdelivr_CDN源 https://fastly.jsdelivr.net/gh/juewuy/ShellCrash
|
||||
102 Github直连源(请注意网络环境) https://raw.githubusercontent.com/juewuy/ShellCrash
|
||||
103 ShellClash自建源(请勿滥用!) https://gh.jwsc.eu.org
|
||||
104 Cloudflare_CDN源 https://gh.shellclash.workers.dev/https://raw.githubusercontent.com/juewuy/ShellCrash
|
||||
|
||||
201 Jsdelivr-CDN源 https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master 公测版
|
||||
202 ShellClash自建源 https://gh.jwsc.eu.org/master 公测版
|
||||
203 ShellClash-cfworkers源 https://gh.shellclash.workers.dev/https://raw.githubusercontent.com/juewuy/ShellCrash 公测版
|
||||
204 Github源(须clash服务启用) https://raw.githubusercontent.com/juewuy/ShellCrash/master 公测版
|
||||
205 (请加讨论组-https://t.me/ShellClash) http://t.jwsc.eu.org 内测版
|
||||
206 wwng2333自建CN源 https://mirrors.csgo.ovh/ShellClash 公测版
|
||||
201 wwng2333自建CN源(请勿滥用!) https://mirrors.csgo.ovh/ShellClash 公测版
|
||||
202 http私人内测源(危险!非必要请勿使用) http://t.jwsc.eu.org 开发版
|
||||
|
||||
301 墙洞提供,不支持vless|hy https://api.dler.io
|
||||
302 SUB作者提供,不支持vless|hy https://sub.xeton.dev
|
||||
303 品云提供,不支持vless|hy https://sub.id9.cc
|
||||
|
||||
401 肥羊提供(有广告),支持vless|hy2 https://sub.d1.mk
|
||||
402 肥羊提供(有广告),支持vless|hy2 https://api.v1.mk
|
||||
403 作者提供,支持vless|hy2 https://sub.jwsc.eu.org
|
||||
401 肥羊提供(有广告),支持vless|hy2 https://sub.d1.mk
|
||||
402 作者提供,支持vless|hy2 https://sub.jwsc.eu.org
|
||||
403 肥羊提供(有广告),支持vless|hy2 https://api.v1.mk
|
||||
|
||||
497 作者提供,未加密仅备用 http://sub2.jwsc.eu.org
|
||||
498 本地服务器 http://127.0.0.1:25500
|
||||
|
||||
@@ -6,6 +6,7 @@ ruleset=🛑 广告拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/mast
|
||||
ruleset=🎥 奈飞解锁,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Netflix.list
|
||||
ruleset=🎥 奈飞解锁,https://raw.githubusercontent.com/LM-Firefly/Rules/master/Global-Services/Netflix.list
|
||||
ruleset=🎥 奈飞解锁,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/DisneyPlus.list
|
||||
ruleset=🤖 人工智能,https://raw.githubusercontent.com/juewuy/ShellClash/master/rules/ai.list
|
||||
ruleset=🚀 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyLite.list
|
||||
ruleset=🚀 节点选择,https://raw.githubusercontent.com/juewuy/ShellClash/master/rules/ai.list
|
||||
ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
@@ -18,6 +19,7 @@ custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/genera
|
||||
custom_proxy_group=🔯 故障转移首选`select`.*
|
||||
custom_proxy_group=🔯 故障转移`fallback`[]🔯 故障转移首选`[]👍 高级节点`[]♻️ 自动选择`http://www.gstatic.com/generate_204`180
|
||||
custom_proxy_group=🛑 广告拦截`select`[]DIRECT`[]REJECT
|
||||
custom_proxy_group=🤖 人工智能`select`[]🇺🇲 美国节点`[]🇸🇬 新加坡节点`[]🇯🇵 日韩节点`[]🚀 手动切换
|
||||
custom_proxy_group=🎥 奈飞解锁`select`[]🎥 流媒体解锁`[]👍 高级节点`[]🔯 故障转移`[]🚀 节点选择
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT`[]🚀 节点选择`[]♻️ 自动选择
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🔯 故障转移`[]🚀 节点选择`[]📺 省流节点`[]♻️ 自动选择`[]DIRECT
|
||||
|
||||
+194
-101
@@ -9,6 +9,7 @@ dir_avail(){
|
||||
df -h &>/dev/null && h=$2
|
||||
df $h $1 |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 -E 'Ava|可用' |awk '{print $2}'
|
||||
}
|
||||
|
||||
#导入订阅、配置文件相关
|
||||
setrules(){ #自定义clash规则
|
||||
set_rule_type(){
|
||||
@@ -761,7 +762,7 @@ set_core_config(){ #配置文件功能
|
||||
}
|
||||
#下载更新相关
|
||||
gettar(){
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/clashfm.tar.gz $tarurl
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/update.tar.gz bin/clashfm.tar.gz
|
||||
if [ "$?" != "0" ];then
|
||||
echo -e "\033[33m文件下载失败!\033[0m"
|
||||
error_down
|
||||
@@ -771,7 +772,7 @@ gettar(){
|
||||
echo -----------------------------------------------
|
||||
echo 开始解压文件!
|
||||
mkdir -p ${CRASHDIR} > /dev/null
|
||||
tar -zxvf "${TMPDIR}/clashfm.tar.gz" -C ${CRASHDIR}/ || tar -zxvf "${TMPDIR}/clashfm.tar.gz" --no-same-owner -C ${CRASHDIR}/
|
||||
tar -zxvf "${TMPDIR}/update.tar.gz" -C ${CRASHDIR}/ 2>/dev/null || tar -zxvf "${TMPDIR}/update.tar.gz" --no-same-owner -C ${CRASHDIR}/
|
||||
if [ $? -ne 0 ];then
|
||||
echo -e "\033[33m文件解压失败!\033[0m"
|
||||
error_down
|
||||
@@ -780,18 +781,17 @@ gettar(){
|
||||
echo -e "\033[32m脚本更新成功!\033[0m"
|
||||
fi
|
||||
fi
|
||||
rm -rf ${TMPDIR}/clashfm.tar.gz
|
||||
rm -rf ${TMPDIR}/update.tar.gz
|
||||
exit
|
||||
}
|
||||
getsh(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前脚本版本为:\033[33m $versionsh_l \033[0m"
|
||||
echo -e "最新脚本版本为:\033[32m $release_new \033[0m"
|
||||
echo -e "最新脚本版本为:\033[32m $version_new \033[0m"
|
||||
echo -e "注意更新时会停止服务!"
|
||||
echo -----------------------------------------------
|
||||
read -p "是否更新脚本?[1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
tarurl=$update_url/bin/clashfm.tar.gz
|
||||
#下载更新
|
||||
gettar
|
||||
#提示
|
||||
@@ -884,12 +884,14 @@ getcore(){
|
||||
[ -z "$crashcore" ] && crashcore=clashpre
|
||||
[ -z "$cpucore" ] && getcpucore
|
||||
[ "$crashcore" = singbox ] && core_new=singbox || core_new=clash
|
||||
#生成链接
|
||||
[ -z "$custcorelink" ] && corelink="${update_url}/bin/${crashcore}/${core_new}-linux-${cpucore}" || corelink="$custcorelink"
|
||||
#获取在线内核文件
|
||||
echo -----------------------------------------------
|
||||
echo 正在在线获取$crashcore核心文件……
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/core.new $corelink
|
||||
if [ -z "$custcorelink" ];then
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/core.new bin/${crashcore}/${core_new}-linux-${cpucore}
|
||||
else
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/core.new "$custcorelink"
|
||||
fi
|
||||
if [ "$?" = "1" ];then
|
||||
echo -e "\033[31m核心文件下载失败!\033[0m"
|
||||
rm -rf ${TMPDIR}/core.new
|
||||
@@ -931,7 +933,7 @@ setcustcore(){
|
||||
echo -e "\033[33m请选择需要使用的核心!\033[0m"
|
||||
echo -e "1 \033[32m 测试版ClashPre内核 \033[0m"
|
||||
echo -e "2 \033[32m 最新Meta.Alpha内核 \033[0m"
|
||||
echo -e "3 \033[32m Sing-Box官方内核 \033[0m"
|
||||
#echo -e "3 \033[32m Sing-Box官方内核 \033[0m"
|
||||
echo -e "4 \033[33m 自定义内核链接 \033[0m"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
@@ -984,11 +986,15 @@ setcore(){
|
||||
echo
|
||||
echo -e "3 \033[43;30mClash.Meta\033[0m: \033[32m多功能,支持最全面\033[0m"
|
||||
echo -e " (Meta稳定内核) \033[33m内存占用较高\033[0m"
|
||||
echo -e " 说明文档: \033[36;4mhttps://docs.metacubex.one\033[0m"
|
||||
echo -e " 说明文档: \033[36;4mhttps://wiki.metacubex.one\033[0m"
|
||||
echo
|
||||
echo -e "4 \033[32m自定义内核\033[0m: \033[33m仅限专业用户使用\033[0m"
|
||||
echo -e "4 \033[43;30mSing-Box\033[0m: \033[32m支持全面占用低\033[0m"
|
||||
echo -e " (sing-box内核) \033[33m另一个选择\033[0m"
|
||||
echo -e " 说明文档: \033[36;4mhttps://sing-box.sagernet.org\033[0m"
|
||||
echo
|
||||
echo "5 手动指定处理器架构"
|
||||
echo -e "5 \033[32m自定义内核\033[0m: \033[33m仅限专业用户使用\033[0m"
|
||||
echo
|
||||
echo "6 手动指定处理器架构"
|
||||
echo -----------------------------------------------
|
||||
echo 0 返回上级菜单
|
||||
read -p "请输入对应数字 > " num
|
||||
@@ -1009,9 +1015,14 @@ setcore(){
|
||||
getcore
|
||||
;;
|
||||
4)
|
||||
setcustcore
|
||||
crashcore=singbox
|
||||
custcorelink=''
|
||||
getcore
|
||||
;;
|
||||
5)
|
||||
setcustcore
|
||||
;;
|
||||
6)
|
||||
setcpucore
|
||||
setcore
|
||||
;;
|
||||
@@ -1023,10 +1034,9 @@ setcore(){
|
||||
|
||||
getgeo(){
|
||||
#生成链接
|
||||
[ -z "$custgeolink" ] && geolink="$update_url/bin/geodata/$geotype" || geolink="$custgeolink"
|
||||
echo -----------------------------------------------
|
||||
echo 正在从服务器获取数据库文件…………
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/$geoname $geolink
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/$geoname bin/geodata/$geotype
|
||||
if [ "$?" = "1" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m文件下载失败!\033[0m"
|
||||
@@ -1118,7 +1128,7 @@ setcustgeo(){
|
||||
echo -e "\033[0m请选择需要更新的数据库项目来源:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 \033[36;4mhttps://github.com/MetaCubeX/meta-rules-dat\033[0m (Clash及SingBox)"
|
||||
echo -e " 2 \033[36;4mhttps://github.com/DustinWin/clash-geosite\033[0m (Clash及SingBox)"
|
||||
#echo -e " 2 \033[36;4mhttps://github.com/DustinWin/clash-geosite\033[0m (Clash及SingBox)"
|
||||
echo -e " 3 \033[36;4mhttps://github.com/lyc8503/sing-box-rules\033[0m (仅限SingBox)"
|
||||
echo -e " 4 \033[36;4mhttps://github.com/Loyalsoldier/geoip\033[0m (仅限Clash-GeoIP)"
|
||||
echo -----------------------------------------------
|
||||
@@ -1277,10 +1287,10 @@ esac
|
||||
}
|
||||
|
||||
getdb(){
|
||||
dblink="${update_url}/bin/dashboard/${db_type}.tar.gz"
|
||||
dblink="${update_url}/"
|
||||
echo -----------------------------------------------
|
||||
echo 正在连接服务器获取安装文件…………
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/clashdb.tar.gz $dblink
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz
|
||||
if [ "$?" = "1" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m文件下载失败!\033[0m"
|
||||
@@ -1402,10 +1412,9 @@ setdb(){
|
||||
}
|
||||
|
||||
getcrt(){
|
||||
crtlink="${update_url}/bin/fix/ca-certificates.crt"
|
||||
echo -----------------------------------------------
|
||||
echo 正在连接服务器获取安装文件…………
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/ca-certificates.crt $crtlink
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/ca-certificates.crt bin/fix/ca-certificates.crt
|
||||
if [ "$?" = "1" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m文件下载失败!\033[0m"
|
||||
@@ -1414,12 +1423,11 @@ getcrt(){
|
||||
echo -----------------------------------------------
|
||||
mkdir -p $openssldir
|
||||
mv -f ${TMPDIR}/ca-certificates.crt $crtdir
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/ssl_test https://baidu.com echooff rediron skipceroff
|
||||
${CRASHDIR}/start.sh webget /dev/null https://baidu.com echooff rediron skipceroff
|
||||
if [ "$?" = "1" ];then
|
||||
export CURL_CA_BUNDLE=$crtdir
|
||||
echo "export CURL_CA_BUNDLE=$crtdir" >> /etc/profile
|
||||
fi
|
||||
rm -rf ${TMPDIR}/ssl_test
|
||||
echo -e "\033[32m证书安装成功!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
@@ -1454,68 +1462,123 @@ setcrt(){
|
||||
}
|
||||
#安装源
|
||||
setserver(){
|
||||
[ -z "$release_type" ] && release_name=未指定
|
||||
[ -n "$release_type" ] && release_name=${release_type}'(回退)'
|
||||
[ "$release_type" = stable ] && release_name=稳定版
|
||||
[ "$release_type" = master ] && release_name=公测版
|
||||
[ "$release_type" = dev ] && release_name=开发版
|
||||
[ -n "$url_id" ] && url_name=$(grep "$url_id" ${CRASHDIR}/configs/servers.list 2>/dev/null | awk '{print $2}') || url_name=$update_url
|
||||
saveserver(){
|
||||
#写入配置文件
|
||||
setconfig update_url \'$update_url\'
|
||||
setconfig release_url \'$release_url\'
|
||||
setconfig url_id $url_id
|
||||
setconfig release_type $release_type
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m源地址更新成功!\033[0m"
|
||||
release_new=""
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m切换ShellCrash版本及更新源地址\033[0m"
|
||||
echo -e "当前源地址:\033[4;32m$update_url\033[0m"
|
||||
echo -e "当前版本:\033[4;33m$release_name\033[0m 当前源:\033[4;32m$url_name\033[0m"
|
||||
echo -----------------------------------------------
|
||||
grep -aE '^1|^2' ${CRASHDIR}/configs/servers.list | awk '{print " "NR" "$4" "$2}'
|
||||
grep -E "^1|$release_name" ${CRASHDIR}/configs/servers.list | awk '{print " "NR" "$2}'
|
||||
echo -----------------------------------------------
|
||||
echo -e " a 自定义源地址(用于本地源或自建源)"
|
||||
echo -e " b \033[31m版本回退\033[0m"
|
||||
echo -e " a 切换至\033[32m稳定版\033[0m"
|
||||
echo -e " b 切换至\033[36m公测版\033[0m"
|
||||
echo -e " c 切换至\033[33m开发版\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " d 自定义源地址(用于本地源或自建源)"
|
||||
echo -e " e \033[31m版本回退\033[0m"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应字母或数字 > " num
|
||||
case $num in
|
||||
0)
|
||||
;;
|
||||
[1-99])
|
||||
release_type=$(grep -aE '^1|^2' ${CRASHDIR}/configs/servers.list | sed -n ""$num"p" | awk '{print $4}')
|
||||
if [ "release_type" = "稳定版" ];then
|
||||
release_url=$(grep -aE '^1' ${CRASHDIR}/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
|
||||
url_id_new=$(grep -E "^1|$release_name" ${CRASHDIR}/configs/servers.list | sed -n ""$num"p" | awk '{print $1}')
|
||||
if [ -z "$url_id_new" ];then
|
||||
errornum
|
||||
sleep 1
|
||||
setserver
|
||||
elif [ "$url_id_new" -ge 200 ];then
|
||||
update_url=$(grep -E "^1|$release_name" ${CRASHDIR}/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
|
||||
url_id=''
|
||||
saveserver
|
||||
else
|
||||
update_url=$(grep -aE '^1|^2' ${CRASHDIR}/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
|
||||
unset release_url
|
||||
url_id=$url_id_new
|
||||
update_url=''
|
||||
saveserver
|
||||
fi
|
||||
saveserver
|
||||
unset url_id_new
|
||||
;;
|
||||
a)
|
||||
release_type=stable
|
||||
setconfig release_type $release_type
|
||||
setserver
|
||||
;;
|
||||
b)
|
||||
release_type=master
|
||||
setconfig release_type $release_type
|
||||
setserver
|
||||
;;
|
||||
c)
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m开发版未经过妥善测试,可能依然存在大量bug!!!\033[0m"
|
||||
echo -e "\033[36m如果你没有足够的耐心或者测试经验,切勿使用此版本!\033[0m"
|
||||
echo -e "请务必加入我们的讨论组:\033[32;4mhttps://t.me/ShellClash\033[0m"
|
||||
read -p "是否依然切换到开发版?(1/0) > " res
|
||||
if [ "$res" = 1 ];then
|
||||
release_type=dev
|
||||
setconfig release_type $release_type
|
||||
fi
|
||||
setserver
|
||||
;;
|
||||
d)
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入个人源路径 > " update_url
|
||||
if [ -z "$update_url" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m取消输入,返回上级菜单\033[0m"
|
||||
else
|
||||
url_id=''
|
||||
release_type=''
|
||||
saveserver
|
||||
unset release_url
|
||||
fi
|
||||
;;
|
||||
b)
|
||||
e)
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m如无法连接,请务必先启用服务!!!\033[0m"
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/release_new https://raw.githubusercontent.com/juewuy/ShellCrash/master/bin/release_version echooff rediroff 2>${TMPDIR}/release_new
|
||||
echo -e "\033[31m请选择想要回退至的release版本:\033[0m"
|
||||
cat ${TMPDIR}/release_new | awk '{print " "NR" "$1}'
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" -o "$num" = 0 ]; then
|
||||
setserver
|
||||
elif [ $num -le $(cat ${TMPDIR}/release_new 2>/dev/null | awk 'END{print NR}') ]; then
|
||||
release_version=$(cat ${TMPDIR}/release_new | awk '{print $1}' | sed -n "$num"p)
|
||||
update_url="https://raw.githubusercontent.com/juewuy/ShellCrash/$release_version"
|
||||
saveserver
|
||||
unset release_url
|
||||
if [ -n "$url_id" ] && [ "$url_id" -lt 200 ];then
|
||||
echo -ne "\033[32m正在获取版本信息!\033[0m\r"
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/release_version bin/release_version
|
||||
if [ "$?" = "0" ];then
|
||||
echo -e "\033[31m请选择想要回退至的稳定版版本:\033[0m"
|
||||
cat ${TMPDIR}/release_version | awk '{print " "NR" "$1}'
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" -o "$num" = 0 ]; then
|
||||
setserver
|
||||
elif [ $num -le $(cat ${TMPDIR}/release_version 2>/dev/null | awk 'END{print NR}') ]; then
|
||||
release_type=$(cat ${TMPDIR}/release_version | awk '{print $1}' | sed -n "$num"p)
|
||||
update_url=''
|
||||
saveserver
|
||||
else
|
||||
echo -----------------------------------------------
|
||||
errornum
|
||||
sleep 1
|
||||
setserver
|
||||
fi
|
||||
else
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m版本回退信息获取失败,请尝试更换其他安装源!\033[0m"
|
||||
sleep 1
|
||||
setserver
|
||||
fi
|
||||
rm -rf ${TMPDIR}/release_version
|
||||
else
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m输入有误,请重新输入!\033[0m"
|
||||
echo -e "\033[31m当前源不支持版本回退,请尝试更换其他安装源!\033[0m"
|
||||
sleep 1
|
||||
setserver
|
||||
fi
|
||||
rm -rf ${TMPDIR}/release_new
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
@@ -1524,29 +1587,16 @@ setserver(){
|
||||
}
|
||||
#检查更新
|
||||
checkupdate(){
|
||||
if [ -z "$release_new" ];then
|
||||
if [ -n "$release_url" ];then
|
||||
[ -n "$(echo $release_url|grep 'jsdelivr')" ] && check_url=$release_url@master || check_url=$release_url/master
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/version_new $check_url/bin/release_version echoon rediroff 2>${TMPDIR}/version_new
|
||||
release_new=$(cat ${TMPDIR}/version_new | head -1)
|
||||
[ -n "$(echo $release_url|grep 'jsdelivr')" ] && update_url=$release_url@$release_new || update_url=$release_url/$release_new
|
||||
setconfig update_url \'$update_url\'
|
||||
release_type=正式版
|
||||
else
|
||||
release_type=测试版
|
||||
fi
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/version_new $update_url/bin/version echooff
|
||||
[ "$?" = "0" ] && release_new=$(cat ${TMPDIR}/version_new | grep -oE 'versionsh=.*' | awk -F'=' '{ print $2 }')
|
||||
if [ -n "$release_new" ];then
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/version_new bin/version echooff
|
||||
[ "$?" = "0" ] && version_new=$(cat ${TMPDIR}/version_new | grep -oE 'versionsh=.*' | awk -F'=' '{ print $2 }')
|
||||
if [ -n "$version_new" ];then
|
||||
source ${TMPDIR}/version_new 2>/dev/null
|
||||
else
|
||||
echo -e "\033[31m检查更新失败!请切换其他安装源!\033[0m"
|
||||
echo -e "\033[36m如全部安装源都无法使用,请先运行服务后再使用更新功能!\033[0m"
|
||||
sleep 1
|
||||
echo -e "\033[31m检查更新失败!请尝试切换其他安装源!\033[0m"
|
||||
setserver
|
||||
checkupdate
|
||||
fi
|
||||
rm -rf ${TMPDIR}/version_new
|
||||
fi
|
||||
}
|
||||
update(){
|
||||
echo -----------------------------------------------
|
||||
@@ -1557,13 +1607,13 @@ update(){
|
||||
echo -e "\033[30;47m欢迎使用更新功能:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前目录(\033[32m${CRASHDIR}\033[0m)剩余空间:\033[36m$(dir_avail ${CRASHDIR} -h)\033[0m"
|
||||
[ "$(dir_avail ${CRASHDIR})" -le 5120 ] && {
|
||||
[ "$(dir_avail ${CRASHDIR})" -le 5120 ] && [ "$CRASHDIR" = "$BINDIR" ] && {
|
||||
echo -e "\033[33m当前目录剩余空间较低,建议开启小闪存模式!\033[0m"
|
||||
sleep 1
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$versionsh$release_type\033[0m"
|
||||
echo -e " 2 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m"
|
||||
echo -e " 1 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$version_new\033[0m"
|
||||
echo -e " 2 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m"
|
||||
echo -e " 3 更新\033[32m数据库文件\033[0m"
|
||||
echo -e " 4 安装本地\033[35mDashboard\033[0m面板"
|
||||
echo -e " 5 安装/更新本地\033[33m根证书文件\033[0m"
|
||||
@@ -1615,7 +1665,7 @@ update(){
|
||||
update
|
||||
|
||||
elif [ "$num" = 9 ]; then
|
||||
$0 -u
|
||||
uninstall
|
||||
exit
|
||||
|
||||
elif [ "$num" = 99 ]; then
|
||||
@@ -1706,14 +1756,11 @@ userguide(){
|
||||
echo -e "\033[0m每次开机后首次运行服务时都会自动的重新下载相关文件\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "是否开启?(1/0) > " res
|
||||
[ "$res" = 1 ] && setconfig BINDIR /tmp/ShellCrash ${CRASHDIR}/configs/command.env
|
||||
[ "$res" = 1 ] && {
|
||||
BINDIR=/tmp/ShellCrash
|
||||
setconfig BINDIR /tmp/ShellCrash ${CRASHDIR}/configs/command.env
|
||||
}
|
||||
fi
|
||||
#下载本地面板
|
||||
# echo -----------------------------------------------
|
||||
# echo -e "\033[33m安装本地Dashboard面板,可以更快捷的管理clash内置规则!\033[0m"
|
||||
# echo -----------------------------------------------
|
||||
# read -p "需要安装本地Dashboard面板吗?(1/0) > " res
|
||||
# [ "$res" = 1 ] && checkupdate && setdb
|
||||
#检测及下载根证书
|
||||
if [ -d /etc/ssl/certs -a ! -f '/etc/ssl/certs/ca-certificates.crt' ];then
|
||||
echo -----------------------------------------------
|
||||
@@ -1723,14 +1770,13 @@ userguide(){
|
||||
[ "$res" = 1 ] && checkupdate && getcrt
|
||||
fi
|
||||
#设置加密DNS
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/ssl_test https://doh.pub echooff rediron
|
||||
${CRASHDIR}/start.sh webget /dev/null https://baidu.com echooff rediron
|
||||
if [ "$?" = "0" ];then
|
||||
dns_nameserver='https://223.5.5.5/dns-query, https://doh.pub/dns-query, tls://dns.rubyfish.cn:853'
|
||||
dns_fallback='https://1.0.0.1/dns-query, https://8.8.4.4/dns-query, https://doh.opendns.com/dns-query'
|
||||
setconfig dns_nameserver \'"$dns_nameserver"\'
|
||||
setconfig dns_fallback \'"$dns_fallback"\'
|
||||
fi
|
||||
rm -rf ${TMPDIR}/ssl_test
|
||||
#开启公网访问
|
||||
sethost(){
|
||||
read -p "请输入你的公网IP地址 > " host
|
||||
@@ -1774,12 +1820,14 @@ userguide(){
|
||||
[ "$res" = 1 ] && autoSSH
|
||||
fi
|
||||
#提示导入订阅或者配置文件
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m是否导入配置文件?\033[0m(这是运行前的最后一步)"
|
||||
echo -e "\033[0m你必须拥有一份yaml格式的配置文件才能运行服务!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "现在开始导入?(1/0) > " res
|
||||
[ "$res" = 1 ] && inuserguide=1 && set_core_config && inuserguide=""
|
||||
[ ! -s $CRASHDIR/yamls/config.yaml -a ! -s $CRASHDIR/jsons/config.json ] && {
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m是否导入配置文件?\033[0m(这是运行前的最后一步)"
|
||||
echo -e "\033[0m你必须拥有一份yaml格式的配置文件才能运行服务!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "现在开始导入?(1/0) > " res
|
||||
[ "$res" = 1 ] && inuserguide=1 && set_core_config && inuserguide=""
|
||||
}
|
||||
#回到主界面
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m很好!现在只需要执行启动就可以愉快的使用了!\033[0m"
|
||||
@@ -1789,13 +1837,66 @@ userguide(){
|
||||
main_menu
|
||||
}
|
||||
#测试菜单
|
||||
debug(){
|
||||
[ "$crashcore" = singbox ] && config_tmp=$TMPDIR/config.json || config_tmp=$TMPDIR/config.yaml
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m注意:Debug运行均会停止原本的内核服务\033[0m"
|
||||
echo -e "后台运行日志地址:\033[32m$TMPDIR/debug.log\033[0m"
|
||||
echo -e "如长时间运行后台监测,日志等级推荐error!防止文件过大!"
|
||||
echo -e "你也可以通过:\033[33mcrash -s debug 'warning'\033[0m 命令使用其他日志等级"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 仅测试\033[32m$config_tmp\033[0m配置文件可用性"
|
||||
echo -e " 2 前台运行\033[32m$config_tmp\033[0m配置文件,不配置防火墙劫持(\033[33m使用Ctrl+C手动停止\033[0m)"
|
||||
echo -e " 3 后台运行完整启动流程,并配置防火墙劫持,日志等级:\033[31merror\033[0m"
|
||||
echo -e " 4 后台运行完整启动流程,并配置防火墙劫持,日志等级:\033[32minfo\033[0m"
|
||||
echo -e " 5 后台运行完整启动流程,并配置防火墙劫持,日志等级:\033[33mdebug\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo " 0 返回上级目录!"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0) ;;
|
||||
1)
|
||||
$CRASHDIR/start.sh stop
|
||||
if [ "$crashcore" = singbox ] ;then
|
||||
$BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json &
|
||||
{ sleep 4 ; kill $! &>/dev/null & }
|
||||
wait
|
||||
else
|
||||
$BINDIR/CrashCore -t -d $BINDIR -f $TMPDIR/config.yaml
|
||||
fi
|
||||
echo -----------------------------------------------
|
||||
exit
|
||||
;;
|
||||
2)
|
||||
$CRASHDIR/start.sh stop
|
||||
$COMMAND
|
||||
echo -----------------------------------------------
|
||||
exit
|
||||
;;
|
||||
3)
|
||||
$CRASHDIR/start.sh debug error
|
||||
main_menu
|
||||
;;
|
||||
4)
|
||||
$CRASHDIR/start.sh debug info
|
||||
main_menu
|
||||
;;
|
||||
5)
|
||||
$CRASHDIR/start.sh debug debug
|
||||
main_menu
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
testcommand(){
|
||||
[ "$crashcore" = singbox ] && config_path=${JSONSDIR}/config.json || config_path=${YAMLSDIR}/config.yaml
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m这里是测试命令菜单\033[0m"
|
||||
echo -e "\033[33m如遇问题尽量运行相应命令后截图提交issue或TG讨论组\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo " 1 查看内核运行时的报错信息"
|
||||
echo " 1 Debug模式运行内核"
|
||||
echo " 2 查看系统DNS端口(:53)占用 "
|
||||
echo " 3 测试ssl加密(aes-128-gcm)跑分"
|
||||
echo " 4 查看ShellCrash相关路由规则"
|
||||
@@ -1810,16 +1911,8 @@ testcommand(){
|
||||
elif [ "$num" = 0 ]; then
|
||||
main_menu
|
||||
elif [ "$num" = 1 ]; then
|
||||
echo -----------------------------------------------
|
||||
ckcmd journalctl && error=$(journalctl -u shellcrash | grep -Eo 'error.*=.*|.*ERROR.*|.*FATAL.*')
|
||||
[ -z "$error" ] && error=$(cat $TMPDIR/core_test.log | grep -Eo 'error.*=.*|.*ERROR.*|.*FATAL.*')
|
||||
if [ -n "$error" ];then
|
||||
echo $error
|
||||
exit;
|
||||
else
|
||||
echo -e "\033[31m未找到因内核运行错误所产生的日志文件!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
debug
|
||||
testcommand
|
||||
elif [ "$num" = 2 ]; then
|
||||
echo -----------------------------------------------
|
||||
netstat -ntulp |grep 53
|
||||
|
||||
+7
-12
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
version=1.8.5d
|
||||
version=1.8.7d
|
||||
|
||||
setdir(){
|
||||
dir_avail(){
|
||||
@@ -127,8 +127,6 @@ setconfig(){
|
||||
[ -z "$3" ] && configpath=${CRASHDIR}/configs/ShellCrash.cfg || configpath="${3}"
|
||||
[ -n "$(grep "${1}=" "$configpath")" ] && sed -i "s#${1}=.*#${1}=${2}#g" $configpath || echo "${1}=${2}" >> $configpath
|
||||
}
|
||||
|
||||
${CRASHDIR}/start.sh stop 2>/dev/null #防止进程冲突
|
||||
#特殊固件识别及标记
|
||||
[ -f "/etc/storage/started_script.sh" ] && {
|
||||
systype=Padavan #老毛子固件
|
||||
@@ -152,8 +150,6 @@ mv -f /tmp/SC_tmp/* ${CRASHDIR} 2>/dev/null
|
||||
#初始化
|
||||
mkdir -p ${CRASHDIR}/configs
|
||||
[ -f "${CRASHDIR}/configs/ShellCrash.cfg" ] || echo '#ShellCrash配置文件,不明勿动!' > ${CRASHDIR}/configs/ShellCrash.cfg
|
||||
#本地安装跳过新手引导
|
||||
#[ -z "$url" ] && setconfig userguide 1
|
||||
#判断系统类型写入不同的启动文件
|
||||
if [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ];then
|
||||
#设为init.d方式启动
|
||||
@@ -174,7 +170,7 @@ else
|
||||
fi
|
||||
fi
|
||||
#修饰文件及版本号
|
||||
type bash &>/dev/null && shtype=bash || shtype=sh
|
||||
command -v bash &>/dev/null && shtype=bash || shtype=sh
|
||||
for file in start.sh task.sh ;do
|
||||
sed -i "s|/bin/sh|/bin/$shtype|" ${CRASHDIR}/${file}
|
||||
chmod 755 ${CRASHDIR}/${file}
|
||||
@@ -186,7 +182,7 @@ BINDIR=${CRASHDIR}
|
||||
touch ${CRASHDIR}/configs/command.env
|
||||
setconfig TMPDIR ${TMPDIR} ${CRASHDIR}/configs/command.env
|
||||
setconfig BINDIR ${BINDIR} ${CRASHDIR}/configs/command.env
|
||||
if [ -x ${CRASHDIR}/CrashCore ] && ${CRASHDIR}/CrashCore version &>/dev/null ;then
|
||||
if [ -x ${CRASHDIR}/CrashCore ] && [ -n "$(grep 'crashcore=singbox' ${CRASHDIR}/configs/ShellCrash.cfg)" ];then
|
||||
COMMAND='"$BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json"'
|
||||
else
|
||||
COMMAND='"$BINDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
|
||||
@@ -202,6 +198,8 @@ setconfig COMMAND "$COMMAND" ${CRASHDIR}/configs/command.env
|
||||
if [ -n "$profile" ];then
|
||||
sed -i '/alias crash=*/'d $profile
|
||||
echo "alias crash=\"$shtype $CRASHDIR/menu.sh\"" >> $profile #设置快捷命令环境变量
|
||||
sed -i '/alias clash=*/'d $profile
|
||||
echo "alias clash=\"$shtype $CRASHDIR/menu.sh\"" >> $profile #设置快捷命令环境变量
|
||||
sed -i '/export CRASHDIR=*/'d $profile
|
||||
echo "export CRASHDIR=\"$CRASHDIR\"" >> $profile #设置路径环境变量
|
||||
source $profile &>/dev/null || echo 运行错误!请使用bash而不是dash运行安装命令!!!
|
||||
@@ -271,8 +269,9 @@ for file in cron task.sh task.list;do
|
||||
done
|
||||
chmod 755 ${CRASHDIR}/task/task.sh
|
||||
#旧版文件清理
|
||||
|
||||
rm -rf /etc/init.d/clash
|
||||
rm -rf $CRASHDIR/clashservice
|
||||
rm -rf $CRASHDIR/shellcrash.rc
|
||||
rm -rf $CRASHDIR/clash.sh
|
||||
for file in log shellcrash.service mark? mark.bak;do
|
||||
rm -rf ${CRASHDIR}/$file
|
||||
@@ -282,9 +281,5 @@ sed -i "s/clashcore/crashcore/g" $configpath
|
||||
sed -i "s/clash_v/core_v/g" $configpath
|
||||
sed -i "s/clash.meta/meta/g" $configpath
|
||||
sed -i "s/ShellClash/ShellCrash/g" $configpath
|
||||
#旧版任务清理
|
||||
${CRASHDIR}/start.sh cronset "clash服务" 2>/dev/null
|
||||
${CRASHDIR}/start.sh cronset "订阅链接" 2>/dev/null
|
||||
${CRASHDIR}/start.sh cronset "ShellCrash初始化" 2>/dev/null
|
||||
|
||||
echo -e "\033[32m脚本初始化完成,请输入\033[30;47m crash \033[0;33m命令开始使用!\033[0m"
|
||||
|
||||
+72
-70
@@ -18,7 +18,9 @@ setconfig(){
|
||||
ckcmd(){
|
||||
command -v sh &>/dev/null && command -v $1 &>/dev/null || type $1 &>/dev/null
|
||||
}
|
||||
ckstatus(){
|
||||
|
||||
#脚本启动前检查
|
||||
ckstatus(){
|
||||
#检查/读取脚本配置文件
|
||||
if [ -f $CFG_PATH ];then
|
||||
[ -n "$(awk 'a[$0]++' $CFG_PATH)" ] && awk '!a[$0]++' $CFG_PATH > $CFG_PATH #检查重复行并去除
|
||||
@@ -29,8 +31,6 @@ ckstatus(){
|
||||
versionsh=$(cat ${CRASHDIR}/init.sh | grep -E ^version= | head -n 1 | sed 's/version=//')
|
||||
[ -n "$versionsh" ] && versionsh_l=$versionsh
|
||||
#服务器缺省地址
|
||||
[ -z "$update_url" ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellCrash
|
||||
#设置默认端口及变量
|
||||
[ -z "$mix_port" ] && mix_port=7890
|
||||
[ -z "$redir_port" ] && redir_port=7892
|
||||
[ -z "$db_port" ] && db_port=9999
|
||||
@@ -84,6 +84,7 @@ ckstatus(){
|
||||
checkport
|
||||
fi
|
||||
[ "$crashcore" = singbox ] && corename=Sing-Box || corename=Clash
|
||||
[ -f ${TMPDIR}/debug.log -a -n "$PID" ] && auto="\033[33m并处于debug状态!\033[0m"
|
||||
#输出状态
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;46m欢迎使用ShellCrash!\033[0m 版本:$versionsh_l"
|
||||
@@ -101,15 +102,15 @@ ckstatus(){
|
||||
#检查执行权限
|
||||
[ ! -x ${CRASHDIR}/start.sh ] && chmod +x ${CRASHDIR}/start.sh
|
||||
#检查/tmp内核文件
|
||||
for file in `ls -F /tmp | grep -v [/\$] | grep -v '\ ' | grep -Ev ".*[(gz)(zip)(7z)(tar)(xz)]$" | grep -iE '^clash$|^clash-linux.*|^mihomo.*|^sing.*box|^clash.meta.*'` ; do
|
||||
for file in `ls -F /tmp | grep -v [/\$] | grep -v '\ ' | grep -Ev ".*[(gz)(zip)(7z)(tar)]$" | grep -iE '^clash$|^clash-linux.*|^mihomo.*|^sing.*box|^clash.meta.*'` ; do
|
||||
file=/tmp/$file
|
||||
chmod +x $file
|
||||
echo -e "发现可用的内核文件: \033[36m$file\033[0m "
|
||||
read -p "是否加载(会停止当前服务)?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
${CRASHDIR}/start.sh stop
|
||||
core_v=$($file -v &>/dev/null)
|
||||
[ -z "$core_v" ] && $($file version &>/dev/null)
|
||||
core_v=$($file -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //')
|
||||
[ -z "$core_v" ] && core_v=$($file version 2>/dev/null | grep -Eo 'version .*' | sed 's/version //')
|
||||
if [ -n "$core_v" ];then
|
||||
source ${CRASHDIR}/getdate.sh && setcoretype && \
|
||||
mv -f $file ${CRASHDIR}/CrashCore && \
|
||||
@@ -152,7 +153,6 @@ ckstatus(){
|
||||
}
|
||||
}
|
||||
|
||||
#启动相关
|
||||
errornum(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m请输入正确的字母或数字!\033[0m"
|
||||
@@ -394,7 +394,7 @@ log_pusher(){ #日志菜单
|
||||
*) errornum ;;
|
||||
esac
|
||||
}
|
||||
setport(){
|
||||
setport(){ #端口设置
|
||||
source $CFG_PATH > /dev/null
|
||||
[ -z "$secret" ] && secret=未设置
|
||||
[ -z "$authentication" ] && auth=未设置 || auth=******
|
||||
@@ -514,7 +514,7 @@ setport(){
|
||||
setport
|
||||
fi
|
||||
}
|
||||
setdns(){
|
||||
setdns(){ #DNS设置
|
||||
[ -z "$dns_nameserver" ] && dns_nameserver='114.114.114.114, 223.5.5.5'
|
||||
[ -z "$dns_fallback" ] && dns_fallback='1.0.0.1, 8.8.4.4'
|
||||
[ -z "$hosts_opt" ] && hosts_opt=已开启
|
||||
@@ -627,7 +627,7 @@ setdns(){
|
||||
setdns
|
||||
fi
|
||||
}
|
||||
setipv6(){
|
||||
setipv6(){ #ipv6设置
|
||||
|
||||
[ -z "$ipv6_support" ] && ipv6_support=已开启
|
||||
[ -z "$ipv6_redir" ] && ipv6_redir=未开启
|
||||
@@ -687,7 +687,7 @@ setipv6(){
|
||||
;;
|
||||
esac
|
||||
}
|
||||
setfirewall(){
|
||||
setfirewall(){ #防火墙设置
|
||||
set_cust_host_ipv4(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前已自动设置透明路由的网段为: \033[32m$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'br' | grep -v 'iot' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/br.*$//g' | sed 's/metric.*$//g' | tr '\n' ' ' && echo ) \033[0m"
|
||||
@@ -763,7 +763,7 @@ setfirewall(){
|
||||
;;
|
||||
esac
|
||||
}
|
||||
checkport(){
|
||||
checkport(){ #自动检查端口冲突
|
||||
for portx in $dns_port $mix_port $redir_port $db_port ;do
|
||||
if [ -n "$(netstat -ntul 2>&1 |grep '\:$portx ')" ];then
|
||||
echo -----------------------------------------------
|
||||
@@ -777,7 +777,7 @@ checkport(){
|
||||
fi
|
||||
done
|
||||
}
|
||||
macfilter(){
|
||||
macfilter(){ #局域网设备过滤
|
||||
add_mac(){
|
||||
echo -----------------------------------------------
|
||||
echo 已添加的mac地址:
|
||||
@@ -908,7 +908,7 @@ macfilter(){
|
||||
macfilter
|
||||
fi
|
||||
}
|
||||
localproxy(){
|
||||
localproxy(){ #本机代理
|
||||
[ -w /etc/systemd/system/shellcrash.service -o -w /usr/lib/systemd/system/shellcrash.service -o -x /bin/su ] && local_enh=1
|
||||
[ -f /etc/rc.common -a -w /etc/passwd ] && local_enh=1
|
||||
echo -----------------------------------------------
|
||||
@@ -949,7 +949,7 @@ localproxy(){
|
||||
setconfig local_proxy $local_proxy
|
||||
setconfig local_type $local_type
|
||||
}
|
||||
setboot(){
|
||||
setboot(){ #启动相关设置
|
||||
[ -z "$start_old" ] && start_old=未开启
|
||||
[ -z "$start_delay" -o "$start_delay" = 0 ] && delay=未设置 || delay=${start_delay}秒
|
||||
[ "$autostart" = "enable" ] && auto_set="\033[33m禁止" || auto_set="\033[32m允许"
|
||||
@@ -1096,7 +1096,7 @@ metacfg(){
|
||||
echo -----------------------------------------------
|
||||
|
||||
}
|
||||
normal_set(){
|
||||
normal_set(){ #基础设置
|
||||
set_redir_mod(){
|
||||
set_redir_config(){
|
||||
setconfig redir_mod $redir_mod
|
||||
@@ -1110,7 +1110,7 @@ normal_set(){
|
||||
echo -e "\033[36m已设为 $redir_mod !!\033[0m"
|
||||
}
|
||||
[ -n "$(iptables -j TPROXY 2>&1 | grep 'on-port')" ] && sup_tp=1
|
||||
[ -n "$(lsmod | grep '^tun')" ] || ip tuntap &>/dev/null && sup_tun=1
|
||||
[ -n "$(ls /dev/net/tun)" ] || ip tuntap &>/dev/null && sup_tun=1
|
||||
ckcmd nft && sup_nft=1
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前代理模式为:\033[47;30m $redir_mod \033[0m;Clash核心为:\033[47;30m $crashcore \033[0m"
|
||||
@@ -1423,7 +1423,7 @@ normal_set(){
|
||||
errornum
|
||||
fi
|
||||
}
|
||||
advanced_set(){
|
||||
advanced_set(){ #进阶设置
|
||||
#获取设置默认显示
|
||||
[ -z "$proxies_bypass" ] && proxies_bypass=未启用
|
||||
[ -z "$start_old" ] && start_old=未开启
|
||||
@@ -1556,6 +1556,56 @@ autoSSH(){
|
||||
setconfig mi_autoSSH_pwd $mi_autoSSH_pwd
|
||||
sleep 1
|
||||
}
|
||||
uninstall(){
|
||||
read -p "确认卸载ShellCrash?(警告:该操作不可逆!)[1/0] > " 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
|
||||
read -p "是否保留脚本配置及订阅文件?[1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
mv -f ${CRASHDIR}/configs /tmp/ShellCrash
|
||||
mv -f ${CRASHDIR}/yamls /tmp/ShellCrash
|
||||
mv -f ${CRASHDIR}/jsons /tmp/ShellCrash
|
||||
rm -rf ${CRASHDIR}/*
|
||||
mv -f /tmp/ShellCrash/configs ${CRASHDIR}
|
||||
mv -f /tmp/ShellCrash/yamls ${CRASHDIR}
|
||||
mv -f /tmp/ShellCrash/jsons ${CRASHDIR}
|
||||
else
|
||||
rm -rf ${CRASHDIR}
|
||||
fi
|
||||
[ -w ~/.bashrc ] && profile=~/.bashrc
|
||||
[ -w /etc/profile ] && profile=/etc/profile
|
||||
sed -i '/alias clash=*/'d $profile
|
||||
sed -i '/alias crash=*/'d $profile
|
||||
sed -i '/export CRASHDIR=*/'d $profile
|
||||
sed -i '/export crashdir=*/'d $profile
|
||||
sed -i '/all_proxy/'d $profile
|
||||
sed -i '/ALL_PROXY/'d $profile
|
||||
sed -i "/启用外网访问SSH服务/d" /etc/firewall.user 2>/dev/null
|
||||
sed -i '/ShellCrash初始化/'d /etc/storage/started_script.sh 2>/dev/null
|
||||
sed -i '/ShellCrash初始化/'d /jffs/.asusrouter 2>/dev/null
|
||||
[ "$BINDIR" != "$CRASHDIR" ] && rm -rf ${BINDIR}
|
||||
rm -rf /etc/init.d/shellcrash
|
||||
rm -rf /etc/systemd/system/shellcrash.service
|
||||
rm -rf /usr/lib/systemd/system/shellcrash.service
|
||||
rm -rf /www/clash
|
||||
rm -rf /tmp/ShellCrash
|
||||
sed -Ei s/0:7890/7890:7890/g /etc/passwd
|
||||
userdel -r shellcrash 2>/dev/null
|
||||
nvram set script_usbmount="" 2>/dev/null
|
||||
nvram commit 2>/dev/null
|
||||
uci delete firewall.ShellCrash 2>/dev/null
|
||||
uci commit firewall 2>/dev/null
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m"
|
||||
echo -e "\033[33m请手动关闭当前窗口以重置环境变量!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
exit
|
||||
fi
|
||||
echo -e "\033[31m操作已取消!\033[0m"
|
||||
}
|
||||
tools(){
|
||||
ssh_tools(){
|
||||
stop_iptables(){
|
||||
@@ -1668,7 +1718,7 @@ tools(){
|
||||
echo -----------------------------------------------
|
||||
if [ ! -f ${CRASHDIR}/tools/ShellDDNS.sh ];then
|
||||
echo -e "正在获取在线脚本……"
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/ShellDDNS.sh $update_url/tools/ShellDDNS.sh
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/ShellDDNS.sh tools/ShellDDNS.sh
|
||||
if [ "$?" = "0" ];then
|
||||
mv -f ${TMPDIR}/ShellDDNS.sh ${CRASHDIR}/tools/ShellDDNS.sh
|
||||
source ${CRASHDIR}/tools/ShellDDNS.sh
|
||||
@@ -1691,7 +1741,6 @@ tools(){
|
||||
sed -i "/^\s*#.*otapredownload/ s/^\s*#//" /etc/crontabs/root || \
|
||||
echo "15 3,4,5 * * * /usr/sbin/otapredownload >/dev/null 2>&1" >> /etc/crontabs/root
|
||||
fi
|
||||
|
||||
echo -----------------------------------------------
|
||||
echo -e "已\033[33m$mi_update\033[0m小米路由器的自动更新,如未生效,请在官方APP中同步设置!"
|
||||
sleep 1
|
||||
@@ -1717,10 +1766,9 @@ tools(){
|
||||
sleep 1
|
||||
read -p "我已知晓,出现问题会自行承担!(1/0) > " res
|
||||
if [ "$res" = 1 ];then
|
||||
tunfixlink="${update_url}/bin/fix/tun.ko"
|
||||
echo -----------------------------------------------
|
||||
echo 正在连接服务器获取Tun模块补丁文件…………
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/tun.ko $tunfixlink
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/tun.ko bin/fix/tun.ko
|
||||
if [ "$?" = "0" ];then
|
||||
mv -f ${TMPDIR}/tun.ko ${CRASHDIR}/tools/tun.ko && \
|
||||
${CRASHDIR}/misnap_init.sh tunfix && \
|
||||
@@ -1844,7 +1892,7 @@ case "$1" in
|
||||
echo " -i 初始化脚本"
|
||||
echo -----------------------------------------
|
||||
echo " crash -s start 启动服务"
|
||||
echo " crash -s stop 停止服务"
|
||||
echo " crash -s stop 停止服务"
|
||||
echo " 安装目录/start.sh init 开机初始化"
|
||||
echo -----------------------------------------
|
||||
echo "在线求助:t.me/ShellClash"
|
||||
@@ -1867,53 +1915,7 @@ case "$1" in
|
||||
$shtype -x ${CRASHDIR}/start.sh $2 $3 $4 $5 $6
|
||||
;;
|
||||
-u)
|
||||
read -p "确认卸载ShellCrash?(警告:该操作不可逆!)[1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
${CRASHDIR}/start.sh stop
|
||||
${CRASHDIR}/start.sh cronset "clash服务" 2>/dev/null
|
||||
${CRASHDIR}/start.sh cronset "订阅链接" 2>/dev/null
|
||||
${CRASHDIR}/start.sh cronset "ShellCrash初始化" 2>/dev/null
|
||||
read -p "是否保留脚本配置及订阅文件?[1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
mv -f ${CRASHDIR}/configs /tmp/ShellCrash
|
||||
mv -f ${CRASHDIR}/yamls /tmp/ShellCrash
|
||||
rm -rf ${CRASHDIR}/*
|
||||
mv -f /tmp/ShellCrash/configs ${CRASHDIR}
|
||||
mv -f /tmp/ShellCrash/yamls ${CRASHDIR}
|
||||
else
|
||||
rm -rf ${CRASHDIR}
|
||||
fi
|
||||
[ -w ~/.bashrc ] && profile=~/.bashrc
|
||||
[ -w /etc/profile ] && profile=/etc/profile
|
||||
sed -i '/alias clash=*/'d $profile
|
||||
sed -i '/alias crash=*/'d $profile
|
||||
sed -i '/export CRASHDIR=*/'d $profile
|
||||
sed -i '/export crashdir=*/'d $profile
|
||||
sed -i '/all_proxy/'d $profile
|
||||
sed -i '/ALL_PROXY/'d $profile
|
||||
sed -i "/启用外网访问SSH服务/d" /etc/firewall.user
|
||||
sed -i '/ShellCrash初始化/'d /etc/storage/started_script.sh 2>/dev/null
|
||||
sed -i '/ShellCrash初始化/'d /jffs/.asusrouter 2>/dev/null
|
||||
rm -rf ${BINDIR}
|
||||
rm -rf /etc/init.d/shellcrash
|
||||
rm -rf /etc/systemd/system/shellcrash.service
|
||||
rm -rf /usr/lib/systemd/system/shellcrash.service
|
||||
rm -rf /www/clash
|
||||
rm -rf /tmp/ShellCrash
|
||||
sed -Ei s/0:7890/7890:7890/g /etc/passwd
|
||||
userdel -r shellcrash 2>/dev/null
|
||||
nvram set script_usbmount="" 2>/dev/null
|
||||
nvram commit 2>/dev/null
|
||||
uci delete firewall.ShellClash 2>/dev/null
|
||||
uci delete firewall.ShellCrash 2>/dev/null
|
||||
uci commit firewall 2>/dev/null
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m"
|
||||
echo -e "\033[33m请手动关闭当前窗口以重置环境变量!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
exit
|
||||
fi
|
||||
echo -e "\033[31m操作已取消!\033[0m"
|
||||
uninstall
|
||||
;;
|
||||
*)
|
||||
$0 -h
|
||||
|
||||
@@ -51,8 +51,10 @@ init(){
|
||||
done
|
||||
#初始化环境变量
|
||||
sed -i "/alias crash/d" $profile
|
||||
sed -i "/alias clash/d" $profile
|
||||
sed -i "/export CRASHDIR/d" $profile
|
||||
echo "alias crash=\"sh $CRASHDIR/menu.sh\"" >>$profile
|
||||
echo "alias clash=\"sh $CRASHDIR/menu.sh\"" >>$profile
|
||||
echo "export CRASHDIR=\"$CRASHDIR\"" >>$profile
|
||||
#软固化功能
|
||||
autoSSH
|
||||
|
||||
+75
-39
@@ -138,6 +138,20 @@ put_save(){ #推送面板选择
|
||||
wget -q --method=PUT --header="Authorization: Bearer ${secret}" --header="Content-Type:application/json" --body-data="$2" "$1" >/dev/null
|
||||
fi
|
||||
}
|
||||
get_bin(){ #专用于项目内部文件的下载
|
||||
source ${CRASHDIR}/configs/ShellCrash.cfg >/dev/null
|
||||
[ -z "$update_url" ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master
|
||||
if [ -n "$url_id" ];then
|
||||
if [ "$url_id" = 101 ];then
|
||||
url="$(grep "$url_id" ${CRASHDIR}/configs/servers.list | awk '{print $3}')@$release_type/$2" #jsdelivr特殊处理
|
||||
else
|
||||
url="$(grep "$url_id" ${CRASHDIR}/configs/servers.list | awk '{print $3}')/$release_type/$2"
|
||||
fi
|
||||
else
|
||||
url="$update_url/$2"
|
||||
fi
|
||||
$0 webget "$1" "$url" "$3" "$4" "$5" "$6"
|
||||
}
|
||||
mark_time(){ #时间戳
|
||||
echo `date +%s` > ${TMPDIR}/crash_start_time
|
||||
}
|
||||
@@ -199,16 +213,6 @@ check_clash_config(){ #检查clash配置文件
|
||||
done < ${TMPDIR}/clash_proxies_$USER
|
||||
rm -rf ${TMPDIR}/clash_proxies_$USER
|
||||
}
|
||||
#使用核心内置test功能检测
|
||||
if [ -x ${BINDIR}/CrashCore ];then
|
||||
${BINDIR}/CrashCore -t -d ${BINDIR} -f $core_config_new >/dev/null
|
||||
if [ "$?" != "0" ];then
|
||||
logger "配置文件加载失败!请查看报错信息!" 31
|
||||
${BINDIR}/CrashCore -t -d ${BINDIR} -f $core_config_new
|
||||
echo "$($BINDIR/CrashCore -t -d $BINDIR -f $core_config_new)" >> ${TMPDIR}/ShellCrash.log
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
check_singbox_config(){ #检查singbox配置文件
|
||||
#使用核心内置format功能检测并格式化
|
||||
@@ -542,7 +546,7 @@ EOF
|
||||
[ -z "$dns_fallback" ] && dns_fallback='1.0.0.1' || dns_fallback=$(echo $dns_fallback | awk -F ',' '{print $1}')
|
||||
[ "$ipv6_dns" = "已开启" ] && strategy='prefer_ipv4' || strategy='ipv4_only'
|
||||
[ "$dns_mod" = "redir_host" ] && proxy_dns=dns_proxy && direct_dns=dns_direct
|
||||
[ "$dns_mod" = "fake-ip" ] && proxy_dns=dns_fakeip && direct_dns=dns_fakeip
|
||||
[ "$dns_mod" = "fake-ip" ] && proxy_dns=dns_fakeip && direct_dns=dns_direct
|
||||
[ "$dns_mod" = "mix" ] && proxy_dns=dns_fakeip && direct_dns=dns_direct
|
||||
cat > ${TMPDIR}/dns.json <<EOF
|
||||
"dns": {
|
||||
@@ -570,31 +574,28 @@ EOF
|
||||
}],
|
||||
"rules": [{
|
||||
"outbound": ["any"],
|
||||
"query_type": [
|
||||
"A",
|
||||
"AAAA"
|
||||
],
|
||||
"server": "dns_resolver"
|
||||
}, {
|
||||
"geosite": ["cn"],
|
||||
"query_type": [ "A", "AAAA" ],
|
||||
"server": "$direct_dns"
|
||||
}, {
|
||||
"geosite": ["geolocation-!cn"],
|
||||
"query_type": [
|
||||
"A",
|
||||
"AAAA"
|
||||
],
|
||||
"query_type": [ "A", "AAAA" ],
|
||||
"server": "$proxy_dns"
|
||||
}],
|
||||
"final": "$direct_dns",
|
||||
"final": "dns_direct",
|
||||
"independent_cache": true,
|
||||
"reverse_mapping": true,
|
||||
"fakeip": { "enabled": true, "inet4_range": "198.18.0.0/15" }
|
||||
"fakeip": { "enabled": true, "inet4_range": "198.18.0.0/15", "inet6_range": "fc00::/18" }
|
||||
},
|
||||
EOF
|
||||
}
|
||||
#生成ntp.json
|
||||
cat > ${TMPDIR}/ntp.json <<EOF
|
||||
"ntp": {
|
||||
"enabled": false,
|
||||
"server": "time.apple.com",
|
||||
"enabled": true,
|
||||
"server": "203.107.6.88",
|
||||
"server_port": 123,
|
||||
"interval": "30m0s",
|
||||
"detour": "DIRECT"
|
||||
@@ -671,11 +672,19 @@ EOF
|
||||
}
|
||||
EOF
|
||||
#分割配置文件获得outbounds.json及route.json
|
||||
[ "$(wc -l < $core_config)" -le 5 ] && {
|
||||
${BINDIR}/CrashCore format -c $core_config > ${TMPDIR}/format.json
|
||||
mv -f ${TMPDIR}/format.json $core_config
|
||||
}
|
||||
cat $core_config | sed -n '/"outbounds":/,/"route":/{/"route":/d; p}' > ${TMPDIR}/outbounds.json
|
||||
cat $core_config | sed -n '/"route":/,/"experimental":/{/"experimental":/d; p}' > ${TMPDIR}/route.json
|
||||
#清理route.json中的process_name规则
|
||||
#清理route.json中的process_name规则以及"auto_detect_interface"
|
||||
sed -i '/"process_name": \[/,/],$/d' ${TMPDIR}/route.json
|
||||
sed -i '/"process_name": "[^"]*",/d' ${TMPDIR}/route.json
|
||||
sed -i 's/"auto_detect_interface": true/"auto_detect_interface": false/g' ${TMPDIR}/route.json
|
||||
#修饰route.json结尾
|
||||
sed -i '/^ }$/s/ }/ },/' ${TMPDIR}/route.json
|
||||
sed -i '/^}$/d' ${TMPDIR}/route.json
|
||||
#跳过本地tls证书验证
|
||||
if [ -z "$skip_cert" -o "$skip_cert" = "已开启" ];then
|
||||
sed -i 's/"insecure": false/"insecure": true/' ${TMPDIR}/outbounds.json
|
||||
@@ -688,6 +697,7 @@ EOF
|
||||
[ -s ${TMPDIR}/$char.json ] && json_add=${TMPDIR}/$char.json
|
||||
[ -s ${CRASHDIR}/jsons/$char.json ] && json_add=${CRASHDIR}/jsons/$char.json #如果有自定义配置文件则使用
|
||||
json_all="$json_all $json_add"
|
||||
json_add=''
|
||||
done
|
||||
cut -c 1- $json_all > ${TMPDIR}/config.json
|
||||
#测试自定义配置文件
|
||||
@@ -718,7 +728,7 @@ cn_ip_route(){ #CN-IP绕过
|
||||
mv ${CRASHDIR}/cn_ip.txt ${BINDIR}/cn_ip.txt
|
||||
else
|
||||
logger "未找到cn_ip列表,正在下载!" 33
|
||||
$0 webget ${BINDIR}/cn_ip.txt "$update_url/bin/geodata/china_ip_list.txt"
|
||||
get_bin ${BINDIR}/cn_ip.txt "bin/geodata/china_ip_list.txt"
|
||||
[ "$?" = "1" ] && rm -rf ${BINDIR}/cn_ip.txt && logger "列表下载失败!" 31
|
||||
fi
|
||||
}
|
||||
@@ -737,7 +747,7 @@ cn_ipv6_route(){ #CN-IPV6绕过
|
||||
mv ${CRASHDIR}/cn_ipv6.txt ${BINDIR}/cn_ipv6.txt
|
||||
else
|
||||
logger "未找到cn_ipv6列表,正在下载!" 33
|
||||
$0 webget ${BINDIR}/cn_ipv6.txt "$update_url/bin/geodata/china_ipv6_list.txt"
|
||||
get_bin ${BINDIR}/cn_ipv6.txt "bin/geodata/china_ipv6_list.txt"
|
||||
[ "$?" = "1" ] && rm -rf ${BINDIR}/cn_ipv6.txt && logger "列表下载失败!" 31
|
||||
fi
|
||||
}
|
||||
@@ -1285,11 +1295,14 @@ stop_firewall(){ #还原防火墙配置
|
||||
web_save(){ #最小化保存面板节点选择
|
||||
getconfig
|
||||
#使用get_save获取面板节点设置
|
||||
get_save http://127.0.0.1:${db_port}/proxies | awk -F ':\\{"' '{for(i=1;i<=NF;i++) print $i}' | grep -aE '(^all|^alive)".*"Selector"' > ${TMPDIR}/shellcrash_web_check_$USER
|
||||
get_save http://127.0.0.1:${db_port}/proxies | awk -F ':\\{"' '{for(i=1;i<=NF;i++) print $i}' | grep -aE '"Selector"' | grep -aoE '"name":.*"now":".*",' > ${TMPDIR}/shellcrash_web_check_$USER
|
||||
while read line ;do
|
||||
def=$(echo $line | awk -F "[[,]" '{print $2}')
|
||||
now=$(echo $line | grep -oE '"now".*",' | sed 's/"now"://g' | sed 's/"type":.*//g' | sed 's/,//g')
|
||||
[ "$def" != "$now" ] && echo $line | grep -oE '"name".*"now".*",' | sed 's/"name"://g' | sed 's/"now"://g' | sed 's/"type":.*//g' | sed 's/"//g' >> ${TMPDIR}/shellcrash_web_save_$USER
|
||||
def=$(echo $line | grep -oE '"all".*",' | awk -F "[:\"]" '{print $5}' )
|
||||
now=$(echo $line | grep -oE '"now".*",' | awk -F "[:\"]" '{print $5}' )
|
||||
[ "$def" != "$now" ] && {
|
||||
name=$(echo $line | grep -oE '"name".*",' | awk -F "[:\"]" '{print $5}' )
|
||||
echo "${name},${now}" >> ${TMPDIR}/shellcrash_web_save_$USER
|
||||
}
|
||||
done < ${TMPDIR}/shellcrash_web_check_$USER
|
||||
rm -rf ${TMPDIR}/shellcrash_web_check_$USER
|
||||
#对比文件,如果有变动且不为空则写入磁盘,否则清除缓存
|
||||
@@ -1382,14 +1395,17 @@ core_check(){
|
||||
logger "未找到【$crashcore】核心,正在下载!" 33
|
||||
[ -z "$cpucore" ] && source ${CRASHDIR}/getdate.sh && getcpucore
|
||||
[ -z "$cpucore" ] && logger 找不到设备的CPU信息,请手动指定处理器架构类型! 31 && exit 1
|
||||
$0 webget ${BINDIR}/core.new "$update_url/bin/$crashcore/clash-linux-$cpucore"
|
||||
get_bin ${BINDIR}/core.new "bin/$crashcore/clash-linux-$cpucore"
|
||||
#校验内核
|
||||
chmod +x ${BINDIR}/core.new 2>/dev/null
|
||||
if [ "$crashcore" = singbox ];then
|
||||
core_v=$(${TMPDIR}/core.new version 2>/dev/null | grep version | awk '{print $3}')
|
||||
COMMAND='"$BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json"'
|
||||
else
|
||||
core_v=$(${TMPDIR}/core.new -v 2>/dev/null | sed 's/ linux.*//;s/.* //')
|
||||
COMMAND='"$BINDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
|
||||
fi
|
||||
setconfig COMMAND "$COMMAND" ${CRASHDIR}/configs/command.env
|
||||
if [ -z "$core_v" ];then
|
||||
rm -rf ${TMPDIR}/core.new
|
||||
logger "核心下载失败,请重新运行或更换安装源!" 31
|
||||
@@ -1430,7 +1446,7 @@ clash_check(){ #clash启动前检查
|
||||
mv ${CRASHDIR}/Country.mmdb ${BINDIR}/Country.mmdb
|
||||
else
|
||||
logger "未找到GeoIP数据库,正在下载!" 33
|
||||
$0 webget ${BINDIR}/Country.mmdb $update_url/bin/geodata/cn_mini.mmdb
|
||||
get_bin ${BINDIR}/Country.mmdb bin/geodata/cn_mini.mmdb
|
||||
[ "$?" = "1" ] && rm -rf ${BINDIR}/Country.mmdb && logger "数据库下载失败,已退出,请前往更新界面尝试手动下载!" 31 && exit 1
|
||||
Geo_v=$(date +"%Y%m%d")
|
||||
setconfig Geo_v $Geo_v
|
||||
@@ -1442,7 +1458,7 @@ clash_check(){ #clash启动前检查
|
||||
mv -f ${CRASHDIR}/GeoSite.dat ${BINDIR}/GeoSite.dat
|
||||
else
|
||||
logger "未找到GeoSite数据库,正在下载!" 33
|
||||
$0 webget ${BINDIR}/GeoSite.dat $update_url/bin/geodata/geosite.dat
|
||||
get_bin ${BINDIR}/GeoSite.dat bin/geodata/geosite.dat
|
||||
[ "$?" = "1" ] && rm -rf ${BINDIR}/GeoSite.dat && logger "数据库下载失败,已退出,请前往更新界面尝试手动下载!" 31 && exit 1
|
||||
fi
|
||||
fi
|
||||
@@ -1455,7 +1471,7 @@ singbox_check(){ #singbox启动前检查
|
||||
mv ${CRASHDIR}/geoip.db ${BINDIR}/geoip.db
|
||||
else
|
||||
logger "未找到GeoIP数据库,正在下载!" 33
|
||||
$0 webget ${BINDIR}/geoip.db $update_url/bin/geodata/geoip_cn.db
|
||||
get_bin ${BINDIR}/geoip.db bin/geodata/geoip_cn.db
|
||||
[ "$?" = "1" ] && rm -rf ${BINDIR}/geoip.db && logger "数据库下载失败,已退出,请前往更新界面尝试手动下载!" 31 && exit 1
|
||||
Geo_v=$(date +"%Y%m%d")
|
||||
setconfig Geo_v $Geo_v
|
||||
@@ -1467,7 +1483,7 @@ singbox_check(){ #singbox启动前检查
|
||||
mv -f ${CRASHDIR}/geosite.db ${BINDIR}/geosite.db
|
||||
else
|
||||
logger "未找到GeoSite数据库,正在下载!" 33
|
||||
$0 webget ${BINDIR}/geosite.db $update_url/bin/geodata/geosite_cn.db
|
||||
get_bin ${BINDIR}/geosite.db bin/geodata/geosite_cn.db
|
||||
[ "$?" = "1" ] && rm -rf ${BINDIR}/geosite.db && logger "数据库下载失败,已退出,请前往更新界面尝试手动下载!" 31 && exit 1
|
||||
Geo_v=$(date +"%Y%m%d")
|
||||
setconfig Geo_v $Geo_v
|
||||
@@ -1498,7 +1514,7 @@ bfstart(){ #启动前
|
||||
[ ! -s ${BINDIR}/ui/index.html ] && makehtml #如没有面板则创建跳转界面
|
||||
catpac #生成pac文件
|
||||
#内核及内核配置文件检查
|
||||
[ ! -x ${BINDIR}/CrashCore ] && chmod +x ${BINDIR}/CrashCore #检测可执行权限
|
||||
[ ! -x ${BINDIR}/CrashCore ] && chmod +x ${BINDIR}/CrashCore 2>/dev/null #检测可执行权限
|
||||
if [ "$crashcore" = singbox ];then
|
||||
singbox_check
|
||||
[ "$disoverride" != "1" ] && modify_json || ln -sf $core_config ${TMPDIR}/config.json
|
||||
@@ -1532,6 +1548,8 @@ bfstart(){ #启动前
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
#清理debug日志
|
||||
rm -rf ${TMPDIR}/debug.log
|
||||
#执行条件任务
|
||||
[ -s ${CRASHDIR}/task/bfstart ] && source ${CRASHDIR}/task/bfstart
|
||||
return 0
|
||||
@@ -1616,7 +1634,7 @@ start_old(){ #保守模式
|
||||
#使用传统后台执行二进制文件的方式执行
|
||||
if [ "$local_proxy" = "已开启" -a -n "$(echo $local_type | grep '增强模式')" ];then
|
||||
if ckcmd su;then
|
||||
su shellcrash -c "$COMMAND" >/dev/null &
|
||||
su shellcrash -c "$COMMAND &>/dev/null" &
|
||||
else
|
||||
logger "当前设备缺少su命令,保守模式下无法兼容本机代理增强模式,已停止启动!" 31
|
||||
exit 1
|
||||
@@ -1701,6 +1719,22 @@ restart)
|
||||
$0 stop
|
||||
$0 start
|
||||
;;
|
||||
debug)
|
||||
[ -n "$(pidof CrashCore)" ] && $0 stop >/dev/null #禁止多实例
|
||||
getconfig
|
||||
stop_firewall >/dev/null #清理路由策略
|
||||
bfstart
|
||||
[ -n "$2" ] && {
|
||||
if [ "$crashcore" = singbox ];then
|
||||
sed -i "s/\"level\": \"info\"/\"level\": \"$2\"/" ${TMPDIR}/config.json
|
||||
else
|
||||
sed -i "s/log-level: info/log-level: $2/" ${TMPDIR}/config.yaml
|
||||
fi
|
||||
}
|
||||
$COMMAND &>${TMPDIR}/debug.log &
|
||||
afstart
|
||||
logger "已运行debug模式!如需停止,请正常重启一次服务!" 33
|
||||
;;
|
||||
init)
|
||||
profile=/etc/profile
|
||||
if [ -d "/etc/storage/clash" -o -d "/etc/storage/ShellCrash" ];then
|
||||
@@ -1719,8 +1753,10 @@ init)
|
||||
fi
|
||||
fi
|
||||
sed -i "/alias crash/d" $profile
|
||||
sed -i "/alias clash/d" $profile
|
||||
sed -i "/export CRASHDIR/d" $profile
|
||||
echo "alias crash=\"$CRASHDIR/menu.sh\"" >> $profile
|
||||
echo "alias clash=\"$CRASHDIR/menu.sh\"" >> $profile
|
||||
echo "export CRASHDIR=\"$CRASHDIR\"" >> $profile
|
||||
[ -f ${CRASHDIR}/.dis_startup ] && cronset "保守模式守护进程" || $0 start
|
||||
;;
|
||||
@@ -1741,7 +1777,7 @@ webget)
|
||||
[ "$4" = "echooff" ] && progress='-s' || progress='-#'
|
||||
[ "$5" = "rediroff" ] && redirect='' || redirect='-L'
|
||||
[ "$6" = "skipceroff" ] && certificate='' || certificate='-k'
|
||||
result=$(curl $agent -w %{http_code} --connect-timeout 3 $progress $redirect $certificate -o "$2" "$url" 2>/dev/null)
|
||||
result=$(curl $agent -w %{http_code} --connect-timeout 3 $progress $redirect $certificate -o "$2" "$url" )
|
||||
[ "$result" != "200" ] && export all_proxy="" && result=$(curl $agent -w %{http_code} --connect-timeout 5 $progress $redirect $certificate -o "$2" "$3")
|
||||
else
|
||||
if wget --version > /dev/null 2>&1;then
|
||||
@@ -1752,7 +1788,7 @@ webget)
|
||||
fi
|
||||
[ "$4" = "echoon" ] && progress=''
|
||||
[ "$4" = "echooff" ] && progress='-q'
|
||||
wget -Y on $agent $progress $redirect $certificate $timeout -O "$2" "$url" 2>/dev/null
|
||||
wget -Y on $agent $progress $redirect $certificate $timeout -O "$2" "$url"
|
||||
if [ "$?" != "0" ];then
|
||||
wget -Y off $agent $progress $redirect $certificate $timeout -O "$2" "$3"
|
||||
[ "$?" = "0" ] && result="200"
|
||||
|
||||
+5
-5
@@ -19,7 +19,7 @@ ckcmd(){ #检查命令是否存在
|
||||
|
||||
#任务命令
|
||||
check_update(){ #检查更新工具
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/crashversion "$update_url/bin/version" echooff
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/crashversion "bin/version" echooff
|
||||
[ "$?" = "0" ] && source ${TMPDIR}/crashversion 2>/dev/null
|
||||
rm -rf ${TMPDIR}/crashversion
|
||||
}
|
||||
@@ -33,7 +33,7 @@ update_core(){ #自动更新内核
|
||||
else
|
||||
#更新内核
|
||||
[ "$crashcore" = singbox ] && core_new=singbox || core_new=clash
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/core.new "${update_url}/bin/${crashcore}/${core_new}-linux-${cpucore}"
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/core.new "bin/${crashcore}/${core_new}-linux-${cpucore}"
|
||||
if [ "$?" != "0" ];then
|
||||
logger "任务【自动更新内核】出错-下载失败!"
|
||||
rm -rf ${TMPDIR}/core.new
|
||||
@@ -68,7 +68,7 @@ update_shellcrash(){ #自动更新脚本
|
||||
logger "任务【自动更新脚本】中止-未检测到版本更新"
|
||||
exit 1
|
||||
else
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/update.tar.gz "$update_url/bin/update.tar.gz"
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/update.tar.gz "bin/update.tar.gz"
|
||||
if [ "$?" != "0" ];then
|
||||
rm -rf ${TMPDIR}/update.tar.gz
|
||||
logger "任务【自动更新内核】出错-下载失败!"
|
||||
@@ -98,7 +98,7 @@ update_mmdb(){ #自动更新数据库
|
||||
logger "任务【自动更新数据库文件】跳过-未检测到$2版本更新"
|
||||
else
|
||||
#更新文件
|
||||
${CRASHDIR}/start.sh webget ${TMPDIR}/$1 "$update_url/bin/geodata/$2"
|
||||
${CRASHDIR}/start.sh get_bin ${TMPDIR}/$1 "bin/geodata/$2"
|
||||
if [ "$?" != "0" ];then
|
||||
logger "任务【自动更新数据库文件】更新【$2】下载失败!"
|
||||
rm -rf ${TMPDIR}/$1
|
||||
@@ -124,7 +124,7 @@ reset_firewall(){ #重设透明路由防火墙
|
||||
${CRASHDIR}/start.sh afstart
|
||||
}
|
||||
ntp(){
|
||||
ckcmd ntpd && ntpd -n -q -p 203.107.6.88 &>/dev/null || exit 0 &
|
||||
[ "$crashcore" != singbox ] && ckcmd ntpd && ntpd -n -q -p 203.107.6.88 &>/dev/null || exit 0 &
|
||||
}
|
||||
#任务工具
|
||||
|
||||
|
||||
Reference in New Issue
Block a user