Merge branch 'dev' into master

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