mirror of
https://github.com/juewuy/ShellCrash.git
synced 2024-11-16 11:42:18 +08:00
v1.8.2d
——————————— d: ~改名!ShellClash成为过去时! ~执行命令改为crash(覆盖安装则兼容clash命令) ~优化数据库下载逻辑,独立显示版本号 ~定时任务增加更多功能 ~增加推荐任务(任务菜单及新手引导) ~每10分钟保存面板配置及自动同步ntp时间功能移至推荐任务 ~增加自动下载数据库功能 ~自动更新相关任务支持版本校验 ~增加更细化的任务执行日志 ~修复meta内核因内存不足导致无法更新的bug ~修复部分定时任务会每分钟执行一次的bug b: ~修复定时任务相关bug a: ~同步最新版本Meta1.17.0内核 ~重写定时任务功能 ·增加更多任务 ·增加自动任务执行条件 ·增加更多定时时间条件 ·增加任务日志及日志推送 ·优化管理脚本 ·优化自定义命令功能 ~iptables增加对tcp53端口的dns劫持 ~部分提示及描述优化 ~修复nft模式本机代理语句报错的bug ~修复服务启动前会执行两次启动检查的bug ~修复自定义规则无法删除旧规则的bug ~修复节点绕过功能未添加no-resolve参数的bug
This commit is contained in:
parent
1381172d9f
commit
74bfde8eb1
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
0
bin/clash.meta/clash-linux-amd64 → bin/meta/clash-linux-amd64
Executable file → Normal file
0
bin/clash.meta/clash-linux-amd64 → bin/meta/clash-linux-amd64
Executable file → Normal file
0
bin/clash.meta/clash-linux-armv5 → bin/meta/clash-linux-armv5
Executable file → Normal file
0
bin/clash.meta/clash-linux-armv5 → bin/meta/clash-linux-armv5
Executable file → Normal file
0
bin/clash.meta/clash-linux-armv7 → bin/meta/clash-linux-armv7
Executable file → Normal file
0
bin/clash.meta/clash-linux-armv7 → bin/meta/clash-linux-armv7
Executable file → Normal file
0
bin/clash.meta/clash-linux-armv8 → bin/meta/clash-linux-armv8
Executable file → Normal file
0
bin/clash.meta/clash-linux-armv8 → bin/meta/clash-linux-armv8
Executable file → Normal file
0
bin/clash.meta/clash-linux-mips-softfloat → bin/meta/clash-linux-mips-softfloat
Executable file → Normal file
0
bin/clash.meta/clash-linux-mips-softfloat → bin/meta/clash-linux-mips-softfloat
Executable file → Normal file
0
bin/clash.meta/clash-linux-mipsle-hardfloat → bin/meta/clash-linux-mipsle-hardfloat
Executable file → Normal file
0
bin/clash.meta/clash-linux-mipsle-hardfloat → bin/meta/clash-linux-mipsle-hardfloat
Executable file → Normal file
0
bin/clash.meta/clash-linux-mipsle-softfloat → bin/meta/clash-linux-mipsle-softfloat
Executable file → Normal file
0
bin/clash.meta/clash-linux-mipsle-softfloat → bin/meta/clash-linux-mipsle-softfloat
Executable file → Normal file
Binary file not shown.
|
@ -2,5 +2,5 @@ clashnet_v=v1.7.6
|
|||
clashpre_v=2022.11.25
|
||||
clash_v=v1.7.1
|
||||
meta_v=v1.17.0
|
||||
versionsh=1.8.1
|
||||
GeoIP_v=20231230
|
||||
versionsh=1.8.2d
|
||||
|
|
16
public/task.list
Normal file
16
public/task.list
Normal file
|
@ -0,0 +1,16 @@
|
|||
#任务ID#任务命令#任务说明(#号隔开,任务命令和说明中都不允许包含#号)
|
||||
|
||||
101#$clashdir/start.sh start#启动clash服务
|
||||
102#$clashdir/start.sh stop#停止clash服务
|
||||
103#$clashdir/start.sh restart#重启clash服务
|
||||
104#$clashdir/start.sh getyaml && $clashdir/start.sh restart#更新订阅并重启服务
|
||||
105#$clashdir/start.sh updateyaml#热更新订阅
|
||||
106#$clashdir/start.sh web_save#自动保存面板配置
|
||||
107#$clashdir/start.sh ntp#自动同步ntp时间
|
||||
|
||||
111#$clashdir/task/task.sh update_core#自动更新内核
|
||||
112#$clashdir/task/task.sh update_shellclash#自动更新脚本
|
||||
113#$clashdir/task/task.sh update_mmdb#自动更新数据库文件
|
||||
|
||||
121#$clashdir/task/task.sh reset_firewall#重设透明路由防火墙
|
||||
|
428
scripts/clash.sh
428
scripts/clash.sh
|
@ -1,9 +1,9 @@
|
|||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
CFG_PATH=$clashdir/configs/ShellClash.cfg
|
||||
YAMLSDIR=$clashdir/yamls
|
||||
TMPDIR=/tmp/ShellClash && [ ! -f $TMPDIR ] && mkdir -p $TMPDIR
|
||||
CFG_PATH=$CRASHDIR/configs/ShellCrash.cfg
|
||||
YAMLSDIR=$CRASHDIR/yamls
|
||||
TMPDIR=/tmp/ShellCrash && [ ! -f $TMPDIR ] && mkdir -p $TMPDIR
|
||||
#读取配置相关
|
||||
setconfig(){
|
||||
#参数1代表变量名,参数2代表变量值,参数3即文件路径
|
||||
|
@ -16,7 +16,7 @@ ckcmd(){
|
|||
ckstatus(){
|
||||
|
||||
#服务器缺省地址
|
||||
[ -z "$update_url" ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellClash
|
||||
[ -z "$update_url" ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellCrash
|
||||
#检查/读取脚本配置文件
|
||||
if [ -f $CFG_PATH ];then
|
||||
#检查重复行并去除
|
||||
|
@ -26,13 +26,13 @@ ckstatus(){
|
|||
#使用source加载配置文件
|
||||
source $CFG_PATH > /dev/null
|
||||
else
|
||||
mkdir -p $clashdir/configs
|
||||
mkdir -p $CRASHDIR/configs
|
||||
echo '#标识clash运行状态的文件,不明勿动!' > $CFG_PATH
|
||||
fi
|
||||
versionsh=$(cat $clashdir/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
|
||||
#设置默认核心资源目录
|
||||
[ -z "$bindir" ] && bindir=$clashdir
|
||||
[ -z "$bindir" ] && bindir=$CRASHDIR
|
||||
#设置默认端口及变量
|
||||
[ -z "$mix_port" ] && mix_port=7890
|
||||
[ -z "$redir_port" ] && redir_port=7892
|
||||
|
@ -42,14 +42,14 @@ ckstatus(){
|
|||
[ -z "$local_proxy" ] && local_proxy=未开启
|
||||
[ -z "$redir_mod" ] && redir_mod=纯净模式
|
||||
#检查mac地址记录
|
||||
[ ! -f $clashdir/configs/mac ] && touch $clashdir/configs/mac
|
||||
[ ! -f $CRASHDIR/configs/mac ] && touch $CRASHDIR/configs/mac
|
||||
#获取本机host地址
|
||||
[ -z "$host" ] && host=$(ubus call network.interface.lan status 2>&1 | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}';)
|
||||
[ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'lan' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1)
|
||||
[ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1)
|
||||
[ -z "$host" ] && host='设备IP地址'
|
||||
#dashboard目录位置
|
||||
[ -f $clashdir/ui/index.html ] && dbdir=$clashdir/ui && hostdir=":$db_port/ui"
|
||||
[ -f $CRASHDIR/ui/index.html ] && dbdir=$CRASHDIR/ui && hostdir=":$db_port/ui"
|
||||
[ -f /www/clash/index.html ] && dbdir=/www/clash && hostdir=/clash
|
||||
#开机自启检测
|
||||
if [ -f /etc/rc.common ];then
|
||||
|
@ -57,7 +57,7 @@ ckstatus(){
|
|||
elif [ -w /etc/systemd/system -o -w /usr/lib/systemd/system ];then
|
||||
[ -n "$(systemctl is-enabled clash.service 2>&1 | grep enable)" ] && autostart=enable || autostart=disable
|
||||
else
|
||||
[ -f $clashdir/.dis_startup ] && autostart=disable || autostart=enable
|
||||
[ -f $CRASHDIR/.dis_startup ] && autostart=disable || autostart=enable
|
||||
fi
|
||||
#开机自启描述
|
||||
if [ "$autostart" = "enable" ]; then
|
||||
|
@ -88,7 +88,7 @@ ckstatus(){
|
|||
fi
|
||||
#输出状态
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;46m欢迎使用ShellClash!\033[0m 版本:$versionsh_l"
|
||||
echo -e "\033[30;46m欢迎使用ShellCrash!\033[0m 版本:$versionsh_l"
|
||||
echo -e "Clash服务"$run","$auto""
|
||||
if [ -n "$PID" ];then
|
||||
echo -e "当前内存占用:\033[44m"$VmRSS"\033[0m,已运行:\033[46;30m"$day"\033[44;37m"$time"\033[0m"
|
||||
|
@ -98,12 +98,12 @@ ckstatus(){
|
|||
#检查新手引导
|
||||
if [ -z "$userguide" ];then
|
||||
setconfig userguide 1
|
||||
source $clashdir/getdate.sh && userguide
|
||||
source $CRASHDIR/getdate.sh && userguide
|
||||
fi
|
||||
#检查执行权限
|
||||
[ ! -x $clashdir/start.sh ] && chmod +x $clashdir/start.sh
|
||||
[ ! -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*|^clash.meta*'` ; do
|
||||
for file in `ls -F /tmp | grep -v [/\$] | grep -v '\ ' | grep -Ev ".*[(gz)(zip)(7z)(tar)(xz)]$" | grep -iE '^clash$|^clash-linux*|^mihomo*|^clash.meta*'` ; do
|
||||
file=/tmp/$file
|
||||
chmod +x $file
|
||||
tmp_version=$($file -v 2>/dev/null)
|
||||
|
@ -117,7 +117,7 @@ ckstatus(){
|
|||
read -p "请手动确定该内核类型 > " num
|
||||
case "$num" in
|
||||
2) clashcore=clashpre ;;
|
||||
3) clashcore=clash.meta ;;
|
||||
3) clashcore=meta ;;
|
||||
*) clashcore=clash ;;
|
||||
esac
|
||||
mv -f $file $bindir/clash && echo -e "\033[32m内核加载完成!\033[0m " && sleep 1
|
||||
|
@ -139,7 +139,7 @@ ckstatus(){
|
|||
echo -e "发现可用的YAML配置文件: \033[36m$file\033[0m "
|
||||
read -p "加载为yaml配置文件/或者移除该文件?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
mv -f $file $clashdir/yamls/config.yaml
|
||||
mv -f $file $CRASHDIR/yamls/config.yaml
|
||||
echo -e "\033[32m配置文件加载完成!\033[0m "
|
||||
sleep 1
|
||||
}
|
||||
|
@ -163,10 +163,10 @@ ckstatus(){
|
|||
#启动相关
|
||||
errornum(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m请输入正确的数字!\033[0m"
|
||||
echo -e "\033[31m请输入正确的字母或数字!\033[0m"
|
||||
}
|
||||
startover(){
|
||||
echo -e "\033[32mclash服务已启动!\033[0m"
|
||||
echo -e "\033[32m服务已启动!\033[0m"
|
||||
if [ -n "$hostdir" ];then
|
||||
echo -e "请使用 \033[4;32mhttp://$host$hostdir\033[0m 管理内置规则"
|
||||
else
|
||||
|
@ -183,20 +183,20 @@ startover(){
|
|||
clashstart(){
|
||||
#检查yaml配置文件
|
||||
echo -----------------------------------------------
|
||||
if [ -s $clashdir/yamls/config.yaml -o -n "$Url" -o -n "$Https" ];then
|
||||
$clashdir/start.sh start
|
||||
if [ -s $CRASHDIR/yamls/config.yaml -o -n "$Url" -o -n "$Https" ];then
|
||||
$CRASHDIR/start.sh start
|
||||
sleep 1
|
||||
[ -n "$(pidof clash)" ] && startover
|
||||
else
|
||||
echo -e "\033[31m没有找到配置文件,请先导入配置文件!\033[0m"
|
||||
source $clashdir/getdate.sh && clashlink
|
||||
source $CRASHDIR/getdate.sh && clashlink
|
||||
fi
|
||||
}
|
||||
checkrestart(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m检测到已变更的内容,请重启clash服务!\033[0m"
|
||||
echo -e "\033[32m检测到已变更的内容,请重启服务!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "是否现在重启clash服务?(1/0) > " res
|
||||
read -p "是否现在重启服务?(1/0) > " res
|
||||
[ "$res" = 1 ] && clashstart
|
||||
}
|
||||
#功能相关
|
||||
|
@ -205,6 +205,7 @@ log_pusher(){
|
|||
[ -n "$push_Deer" ] && stat_Deer=32m已启用 || stat_Deer=33m未启用
|
||||
[ -n "$push_bark" ] && stat_bark=32m已启用 || stat_bark=33m未启用
|
||||
[ -n "$push_Po" ] && stat_Po=32m已启用 || stat_Po=33m未启用
|
||||
[ -n "$task_push" ] && task_push=32m已启用 || task_push=33m未启用
|
||||
[ -n "$device_name" ] && device_s=32m$device_name || device_s=33m未设置
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 查看\033[36m运行日志\033[0m"
|
||||
|
@ -212,13 +213,14 @@ log_pusher(){
|
|||
echo -e " 3 PushDeer推送 ——\033[$stat_Deer\033[0m"
|
||||
echo -e " 4 Bark推送-IOS ——\033[$stat_bark\033[0m"
|
||||
echo -e " 5 Passover推送 ——\033[$stat_Po\033[0m"
|
||||
echo -e " 6 推送任务日志 ——\033[$task_push\033[0m"
|
||||
echo -e " 9 设置设备名称 ——\033[$device_s\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应数字 > " num
|
||||
case $num in
|
||||
1)
|
||||
echo -----------------------------------------------
|
||||
cat $TMPDIR/ShellClash_log
|
||||
cat $TMPDIR/ShellCrash.log
|
||||
exit
|
||||
;;
|
||||
2)
|
||||
|
@ -254,7 +256,7 @@ log_pusher(){
|
|||
push_TG=$TOKEN
|
||||
setconfig push_TG $TOKEN
|
||||
setconfig chat_ID $chat_ID
|
||||
$clashdir/start.sh logger "已完成Telegram日志推送设置!" 32
|
||||
$CRASHDIR/start.sh logger "已完成Telegram日志推送设置!" 32
|
||||
else
|
||||
echo -e "\033[31m无法获取对话ID,请重新配置!\033[0m"
|
||||
fi
|
||||
|
@ -282,7 +284,7 @@ log_pusher(){
|
|||
if [ -n "$url" ];then
|
||||
push_Deer=$url
|
||||
setconfig push_Deer $url
|
||||
$clashdir/start.sh logger "已完成PushDeer日志推送设置!" 32
|
||||
$CRASHDIR/start.sh logger "已完成PushDeer日志推送设置!" 32
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
fi
|
||||
|
@ -310,14 +312,14 @@ log_pusher(){
|
|||
push_bark=$url
|
||||
setconfig push_bark $url
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m例: ?group=ShellClash\033[0m"
|
||||
echo -e "\033[32m例: ?group=ShellCrash\033[0m"
|
||||
read -p "请输入你的Bark请求参数(默认回车为空) > " param
|
||||
param=$(echo $param | sed 's/\&/\\\&/g')
|
||||
if [ -n "$param" ];then
|
||||
bark_param=$param
|
||||
setconfig bark_param \'$param\'
|
||||
fi
|
||||
$clashdir/start.sh logger "已完成Bark日志推送设置!" 32
|
||||
$CRASHDIR/start.sh logger "已完成Bark日志推送设置!" 32
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
fi
|
||||
|
@ -353,7 +355,7 @@ log_pusher(){
|
|||
push_Po_key=$key
|
||||
setconfig push_Po $Token
|
||||
setconfig push_Po_key $key
|
||||
$clashdir/start.sh logger "已完成Passover日志推送设置!" 32
|
||||
$CRASHDIR/start.sh logger "已完成Passover日志推送设置!" 32
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
fi
|
||||
|
@ -366,6 +368,12 @@ log_pusher(){
|
|||
sleep 1
|
||||
log_pusher
|
||||
;;
|
||||
6)
|
||||
[ "$task_push" = 1 ] && task_push= || task_push=1
|
||||
setconfig task_push $task_push
|
||||
sleep 1
|
||||
log_pusher
|
||||
;;
|
||||
9)
|
||||
read -p "请输入本设备自定义推送名称 > " device_name
|
||||
setconfig device_name $device_name
|
||||
|
@ -761,7 +769,7 @@ macfilter(){
|
|||
add_mac(){
|
||||
echo -----------------------------------------------
|
||||
echo 已添加的mac地址:
|
||||
cat $clashdir/configs/mac
|
||||
cat $CRASHDIR/configs/mac
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m序号 设备IP 设备mac地址 设备名称\033[32m"
|
||||
cat $dhcpdir | awk '{print " "NR" "$3,$2,$4}'
|
||||
|
@ -773,8 +781,8 @@ macfilter(){
|
|||
if [ -z "$num" -o "$num" = 0 ]; then
|
||||
i=
|
||||
elif [ -n "$(echo $num | grep -aE '^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$')" ];then
|
||||
if [ -z "$(cat $clashdir/configs/mac | grep -E "$num")" ];then
|
||||
echo $num | grep -oE '^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$' >> $clashdir/configs/mac
|
||||
if [ -z "$(cat $CRASHDIR/configs/mac | grep -E "$num")" ];then
|
||||
echo $num | grep -oE '^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$' >> $CRASHDIR/configs/mac
|
||||
else
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m已添加的设备,请勿重复添加!\033[0m"
|
||||
|
@ -782,8 +790,8 @@ macfilter(){
|
|||
add_mac
|
||||
elif [ $num -le $(cat $dhcpdir 2>/dev/null | awk 'END{print NR}') ]; then
|
||||
macadd=$(cat $dhcpdir | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ -z "$(cat $clashdir/configs/mac | grep -E "$macadd")" ];then
|
||||
echo $macadd >> $clashdir/configs/mac
|
||||
if [ -z "$(cat $CRASHDIR/configs/mac | grep -E "$macadd")" ];then
|
||||
echo $macadd >> $CRASHDIR/configs/mac
|
||||
else
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m已添加的设备,请勿重复添加!\033[0m"
|
||||
|
@ -797,12 +805,12 @@ macfilter(){
|
|||
}
|
||||
del_mac(){
|
||||
echo -----------------------------------------------
|
||||
if [ -z "$(cat $clashdir/configs/mac)" ];then
|
||||
if [ -z "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
echo -e "\033[31m列表中没有需要移除的设备!\033[0m"
|
||||
else
|
||||
echo -e "\033[33m序号 设备IP 设备mac地址 设备名称\033[0m"
|
||||
i=1
|
||||
for mac in $(cat $clashdir/configs/mac); do
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do
|
||||
dev_ip=$(cat $dhcpdir | grep $mac | awk '{print $3}') && [ -z "$dev_ip" ] && dev_ip='000.000.00.00'
|
||||
dev_mac=$(cat $dhcpdir | grep $mac | awk '{print $2}') && [ -z "$dev_mac" ] && dev_mac=$mac
|
||||
dev_name=$(cat $dhcpdir | grep $mac | awk '{print $4}') && [ -z "$dev_name" ] && dev_name='未知设备'
|
||||
|
@ -814,8 +822,8 @@ macfilter(){
|
|||
read -p "请输入需要移除的设备的对应序号 > " num
|
||||
if [ -z "$num" ]||[ "$num" -le 0 ]; then
|
||||
n=
|
||||
elif [ $num -le $(cat $clashdir/configs/mac | wc -l) ];then
|
||||
sed -i "${num}d" $clashdir/configs/mac
|
||||
elif [ $num -le $(cat $CRASHDIR/configs/mac | wc -l) ];then
|
||||
sed -i "${num}d" $CRASHDIR/configs/mac
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m对应设备已移除!\033[0m"
|
||||
del_mac
|
||||
|
@ -844,11 +852,11 @@ macfilter(){
|
|||
echo -e "\033[30;47m请在此添加或移除设备\033[0m"
|
||||
echo -e "当前过滤方式为:\033[33m$macfilter_type模式\033[0m"
|
||||
echo -e "仅列表内设备\033[36m$macfilter_scrip经过\033[0mClash内核"
|
||||
if [ -n "$(cat $clashdir/configs/mac)" ]; then
|
||||
if [ -n "$(cat $CRASHDIR/configs/mac)" ]; then
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前已过滤设备为:\033[36m"
|
||||
echo -e "\033[33m 设备IP 设备mac地址 设备名称\033[0m"
|
||||
for mac in $(cat $clashdir/configs/mac); do
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do
|
||||
dev_ip=$(cat $dhcpdir | grep $mac | awk '{print $3}') && [ -z "$dev_ip" ] && dev_ip='000.000.00.00'
|
||||
dev_mac=$(cat $dhcpdir | grep $mac | awk '{print $2}') && [ -z "$dev_mac" ] && dev_mac=$mac
|
||||
dev_name=$(cat $dhcpdir | grep $mac | awk '{print $4}') && [ -z "$dev_name" ] && dev_name='未知设备'
|
||||
|
@ -879,7 +887,7 @@ macfilter(){
|
|||
del_mac
|
||||
macfilter
|
||||
elif [ "$num" = 4 ]; then
|
||||
:>$clashdir/configs/mac
|
||||
:>$CRASHDIR/configs/mac
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m设备列表已清空!\033[0m"
|
||||
macfilter
|
||||
|
@ -933,7 +941,7 @@ 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允许"
|
||||
[ "$bindir" = "$clashdir" ] && mini_clash=未开启 || mini_clash=已开启
|
||||
[ "$bindir" = "$CRASHDIR" ] && mini_clash=未开启 || mini_clash=已开启
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m欢迎使用启动设置菜单:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
|
@ -941,7 +949,7 @@ setboot(){
|
|||
echo -e " 2 使用保守模式: \033[36m$start_old\033[0m ————基于定时任务(每分钟检测)"
|
||||
echo -e " 3 设置自启延时: \033[36m$delay\033[0m ————用于解决自启后服务受限"
|
||||
echo -e " 4 启用小闪存模式: \033[36m$mini_clash\033[0m ————用于闪存空间不足的设备"
|
||||
[ "$bindir" != "$clashdir" ] && echo -e " 5 设置小闪存目录: \033[36m$bindir\033[0m"
|
||||
[ "$bindir" != "$CRASHDIR" ] && echo -e " 5 设置小闪存目录: \033[36m$bindir\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 0 \033[0m返回上级菜单\033[0m"
|
||||
read -p "请输入对应数字 > " num
|
||||
|
@ -951,13 +959,13 @@ setboot(){
|
|||
if [ "$autostart" = "enable" ]; then
|
||||
[ -d /etc/rc.d ] && cd /etc/rc.d && rm -rf *clash > /dev/null 2>&1 && cd - >/dev/null
|
||||
ckcmd systemctl && systemctl disable clash.service > /dev/null 2>&1
|
||||
touch $clashdir/.dis_startup
|
||||
touch $CRASHDIR/.dis_startup
|
||||
autostart=disable
|
||||
echo -e "\033[33m已禁止Clash开机启动!\033[0m"
|
||||
elif [ "$autostart" = "disable" ]; then
|
||||
[ -f /etc/rc.common ] && /etc/init.d/clash enable
|
||||
ckcmd systemctl && systemctl enable clash.service > /dev/null 2>&1
|
||||
rm -rf $clashdir/.dis_startup
|
||||
rm -rf $CRASHDIR/.dis_startup
|
||||
autostart=enable
|
||||
echo -e "\033[32m已设置Clash开机启动!\033[0m"
|
||||
fi
|
||||
|
@ -965,17 +973,17 @@ setboot(){
|
|||
;;
|
||||
2)
|
||||
if [ "$start_old" = "未开启" ] > /dev/null 2>&1; then
|
||||
echo -e "\033[33m改为使用保守模式启动clash服务!!\033[0m"
|
||||
echo -e "\033[33m改为使用保守模式启动服务!!\033[0m"
|
||||
start_old=已开启
|
||||
setconfig start_old $start_old
|
||||
$clashdir/start.sh stop
|
||||
$CRASHDIR/start.sh stop
|
||||
else
|
||||
if [ -f /etc/init.d/clash -o -w /etc/systemd/system -o -w /usr/lib/systemd/system ];then
|
||||
echo -e "\033[32m改为使用系统守护进程启动clash服务!!\033[0m"
|
||||
$clashdir/start.sh cronset "ShellClash初始化"
|
||||
echo -e "\033[32m改为使用系统守护进程启动服务!!\033[0m"
|
||||
$CRASHDIR/start.sh cronset "ShellCrash初始化"
|
||||
start_old=未开启
|
||||
setconfig start_old $start_old
|
||||
$clashdir/start.sh stop
|
||||
$CRASHDIR/start.sh stop
|
||||
|
||||
else
|
||||
echo -e "\033[31m当前设备不支持以其他模式启动!!\033[0m"
|
||||
|
@ -1002,12 +1010,12 @@ setboot(){
|
|||
setboot
|
||||
;;
|
||||
4)
|
||||
dir_size=$(df $clashdir |awk '{ for(i=1;i<=NF;i++){ if(NR==1){ arr[i]=$i; }else{ arr[i]=arr[i]" "$i; } } } END{ for(i=1;i<=NF;i++){ print arr[i]; } }' |grep Ava |awk '{print $2}')
|
||||
dir_size=$(df $CRASHDIR |awk '{ for(i=1;i<=NF;i++){ if(NR==1){ arr[i]=$i; }else{ arr[i]=arr[i]" "$i; } } } END{ for(i=1;i<=NF;i++){ print arr[i]; } }' |grep Ava |awk '{print $2}')
|
||||
if [ "$mini_clash" = "未开启" ]; then
|
||||
if [ "$dir_size" -gt 20480 ];then
|
||||
echo -e "\033[33m您的设备空间充足(>20M),无需开启!\033[0m"
|
||||
else
|
||||
[ "$bindir" = "$clashdir" ] && bindir="/tmp/clash_$USER"
|
||||
[ "$bindir" = "$CRASHDIR" ] && bindir="/tmp/clash_$USER"
|
||||
echo -e "\033[32m已经启用小闪存功能!\033[0m"
|
||||
echo -e "如需更换目录,请使用【设置小闪存目录】功能\033[0m"
|
||||
fi
|
||||
|
@ -1015,10 +1023,10 @@ setboot(){
|
|||
if [ "$dir_size" -lt 8192 ];then
|
||||
echo -e "\033[31m您的设备剩余空间不足8M,停用后可能无法正常运行!\033[0m"
|
||||
read -p "确认停用此功能?(1/0) > " res
|
||||
[ "$res" = 1 ] && bindir="$clashdir" && echo -e "\033[33m已经停用小闪存功能!\033[0m"
|
||||
[ "$res" = 1 ] && bindir="$CRASHDIR" && echo -e "\033[33m已经停用小闪存功能!\033[0m"
|
||||
else
|
||||
rm -rf /tmp/clash_$USER
|
||||
bindir="$clashdir"
|
||||
bindir="$CRASHDIR"
|
||||
echo -e "\033[33m已经停用小闪存功能!\033[0m"
|
||||
fi
|
||||
fi
|
||||
|
@ -1083,8 +1091,8 @@ clashcfg(){
|
|||
setconfig dns_mod $dns_mod
|
||||
if [ "$redir_mod" = "混合模式" -o "$redir_mod" = "Tun模式" ] && [ "$clashcore" = "clash" ];then
|
||||
rm -rf $bindir/clash
|
||||
rm -rf $clashdir/clash
|
||||
setconfig clashcore clash.meta
|
||||
rm -rf $CRASHDIR/clash
|
||||
setconfig clashcore meta
|
||||
fi
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m已设为 $redir_mod !!\033[0m"
|
||||
|
@ -1094,7 +1102,7 @@ clashcfg(){
|
|||
ckcmd nft && sup_nft=1
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前代理模式为:\033[47;30m $redir_mod \033[0m;Clash核心为:\033[47;30m $clashcore \033[0m"
|
||||
echo -e "\033[33m切换模式后需要手动重启clash服务以生效!\033[0m"
|
||||
echo -e "\033[33m切换模式后需要手动重启服务以生效!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 \033[32mRedir模式\033[0m: Redir转发TCP,不转发UDP"
|
||||
echo -e " 2 \033[36m混合模式\033[0m: Redir转发TCP,Tun转发UDP"
|
||||
|
@ -1126,7 +1134,7 @@ clashcfg(){
|
|||
elif [ "$num" = 3 ]; then
|
||||
if [ -f /etc/init.d/qca-nss-ecm -a "$systype" = "mi_snapshot" ] ;then
|
||||
read -p "当前设备的QOS服务与本模式冲突,是否禁用相关功能?(1/0) > " res
|
||||
[ "$res" = '1' ] && $clashdir/misnap_init.sh tproxyfix && redir_mod=Tproxy混合
|
||||
[ "$res" = '1' ] && $CRASHDIR/misnap_init.sh tproxyfix && redir_mod=Tproxy混合
|
||||
else
|
||||
redir_mod=Tproxy混合
|
||||
fi
|
||||
|
@ -1139,7 +1147,7 @@ clashcfg(){
|
|||
elif [ "$num" = 5 ]; then
|
||||
if [ -f /etc/init.d/qca-nss-ecm -a "$systype" = "mi_snapshot" ] ;then
|
||||
read -p "当前设备的QOS服务与本模式冲突,是否禁用相关功能?(1/0) > " res
|
||||
[ "$res" = '1' ] && $clashdir/misnap_init.sh tproxyfix && redir_mod=Tproxy模式
|
||||
[ "$res" = '1' ] && $CRASHDIR/misnap_init.sh tproxyfix && redir_mod=Tproxy模式
|
||||
else
|
||||
redir_mod=Tproxy模式
|
||||
fi
|
||||
|
@ -1181,7 +1189,7 @@ clashcfg(){
|
|||
set_dns_mod(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前DNS运行模式为:\033[47;30m $dns_mod \033[0m"
|
||||
echo -e "\033[33m切换模式后需要手动重启clash服务以生效!\033[0m"
|
||||
echo -e "\033[33m切换模式后需要手动重启服务以生效!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 fake-ip模式: \033[32m响应速度更快\033[0m"
|
||||
echo -e " 不支持绕过CN-IP功能"
|
||||
|
@ -1224,9 +1232,9 @@ clashcfg(){
|
|||
echo -e "示例:*.b.com"
|
||||
echo -e "示例:*.*.b.com\033[0m"
|
||||
echo -----------------------------------------------
|
||||
if [ -s $clashdir/configs/fake_ip_filter ];then
|
||||
if [ -s $CRASHDIR/configs/fake_ip_filter ];then
|
||||
echo -e "\033[33m已添加Fake-ip过滤地址:\033[0m"
|
||||
cat $clashdir/configs/fake_ip_filter | awk '{print NR" "$1}'
|
||||
cat $CRASHDIR/configs/fake_ip_filter | awk '{print NR" "$1}'
|
||||
else
|
||||
echo -e "\033[33m你还未添加Fake-ip过滤地址\033[0m"
|
||||
fi
|
||||
|
@ -1237,14 +1245,14 @@ clashcfg(){
|
|||
0) ;;
|
||||
'') ;;
|
||||
[0-99])
|
||||
sed -i "${input}d" $clashdir/configs/fake_ip_filter 2>/dev/null
|
||||
sed -i "${input}d" $CRASHDIR/configs/fake_ip_filter 2>/dev/null
|
||||
echo -e "\033[32m移除成功!\033[0m"
|
||||
fake_ip_filter
|
||||
;;
|
||||
*)
|
||||
echo -e "你输入的地址是:\033[32m$input\033[0m"
|
||||
read -p "确认添加?(1/0) > " res
|
||||
[ "$res" = 1 ] && echo $input >> $clashdir/configs/fake_ip_filter
|
||||
[ "$res" = 1 ] && echo $input >> $CRASHDIR/configs/fake_ip_filter
|
||||
fake_ip_filter
|
||||
;;
|
||||
esac
|
||||
|
@ -1257,7 +1265,7 @@ clashcfg(){
|
|||
[ -z "$cn_ip_route" ] && cn_ip_route=未开启
|
||||
[ -z "$local_proxy" ] && local_proxy=未开启
|
||||
[ -z "$quic_rj" ] && quic_rj=未开启
|
||||
[ -z "$(cat $clashdir/configs/mac)" ] && mac_return=未开启 || mac_return=已启用
|
||||
[ -z "$(cat $CRASHDIR/configs/mac)" ] && mac_return=未开启 || mac_return=已启用
|
||||
#
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m欢迎使用功能设置菜单:\033[0m"
|
||||
|
@ -1325,18 +1333,18 @@ clashcfg(){
|
|||
}
|
||||
echo -----------------------------------------------
|
||||
if [ -n "$(pidof clash)" ];then
|
||||
read -p "切换时将停止clash服务,是否继续?(1/0) > " res
|
||||
[ "$res" = 1 ] && $clashdir/start.sh stop && set_common_ports
|
||||
read -p "切换时将停止服务,是否继续?(1/0) > " res
|
||||
[ "$res" = 1 ] && $CRASHDIR/start.sh stop && set_common_ports
|
||||
else
|
||||
set_common_ports
|
||||
fi
|
||||
clashcfg
|
||||
|
||||
elif [ "$num" = 5 ]; then
|
||||
checkcfg_mac=$(cat $clashdir/configs/mac)
|
||||
checkcfg_mac=$(cat $CRASHDIR/configs/mac)
|
||||
macfilter
|
||||
if [ -n "$PID" ];then
|
||||
checkcfg_mac_new=$(cat $clashdir/configs/mac)
|
||||
checkcfg_mac_new=$(cat $CRASHDIR/configs/mac)
|
||||
[ "$checkcfg_mac" != "$checkcfg_mac_new" ] && checkrestart
|
||||
fi
|
||||
clashcfg
|
||||
|
@ -1349,7 +1357,7 @@ clashcfg(){
|
|||
setconfig local_proxy $local_proxy
|
||||
setconfig local_type
|
||||
sed -i '/user shellclash/d' /etc/init.d/clash 2>/dev/null
|
||||
echo -e "\033[33m已经停用本机代理规则,请尽快重启clash服务!!\033[0m"
|
||||
echo -e "\033[33m已经停用本机代理规则,请尽快重启服务!!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
clashcfg
|
||||
|
@ -1445,7 +1453,7 @@ clashadv(){
|
|||
if [ "$sniffer" = "未启用" ];then
|
||||
if [ "$clashcore" = "clash" ];then
|
||||
rm -rf $bindir/clash
|
||||
clashcore=clash.meta
|
||||
clashcore=meta
|
||||
setconfig clashcore $clashcore
|
||||
echo "已将clash内核切换为Meta内核!域名嗅探依赖Meta或者高版本clashpre内核!"
|
||||
fi
|
||||
|
@ -1464,7 +1472,7 @@ clashadv(){
|
|||
echo -----------------------------------------------
|
||||
if [ "$proxies_bypass" = "未启用" ];then
|
||||
proxies_bypass=已启用
|
||||
echo -e "\033[33m仅当ShellClash与子网络同类应用使用相同节点配置时方可生效!\033[0m"
|
||||
echo -e "\033[33m仅当ShellCrash与子网络同类应用使用相同节点配置时方可生效!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
proxies_bypass=未启用
|
||||
|
@ -1518,8 +1526,8 @@ autoSSH(){
|
|||
echo -e "\033[33m如有问题请加群反馈:\033[36;4mhttps://t.me/ShellClash\033[0m"
|
||||
read -p "请输入需要还原的SSH密码(不影响当前密码,回车可跳过) > " mi_autoSSH_pwd
|
||||
mi_autoSSH=已配置
|
||||
cp -f /etc/dropbear/dropbear_rsa_host_key $clashdir/configs/dropbear_rsa_host_key 2>/dev/null
|
||||
cp -f /etc/dropbear/authorized_keys $clashdir/configs/authorized_keys 2>/dev/null
|
||||
cp -f /etc/dropbear/dropbear_rsa_host_key $CRASHDIR/configs/dropbear_rsa_host_key 2>/dev/null
|
||||
cp -f /etc/dropbear/authorized_keys $CRASHDIR/configs/authorized_keys 2>/dev/null
|
||||
ckcmd nvram && {
|
||||
nvram set ssh_en=1
|
||||
nvram set telnet_en=1
|
||||
|
@ -1541,7 +1549,7 @@ tools(){
|
|||
[ -n "$(cat /etc/firewall.user 2>&1 | grep '启用外网访问SSH服务')" ] && ssh_ol=禁止 || ssh_ol=开启
|
||||
[ -z "$ssh_port" ] && ssh_port=10022
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m此功能仅针对使用Openwrt系统的设备生效,且不依赖clash服务\033[0m"
|
||||
echo -e "\033[33m此功能仅针对使用Openwrt系统的设备生效,且不依赖服务\033[0m"
|
||||
echo -e "\033[31m本功能不支持红米AX6S等镜像化系统设备,请勿尝试!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 \033[32m修改\033[0m外网访问端口:\033[36m$ssh_port\033[0m"
|
||||
|
@ -1600,16 +1608,16 @@ tools(){
|
|||
#获取设置默认显示
|
||||
[ -n "$(cat /etc/crontabs/root 2>&1| grep otapredownload)" ] && mi_update=禁用 || mi_update=启用
|
||||
[ "$mi_autoSSH" = "已配置" ] && mi_autoSSH_type=32m已配置 || mi_autoSSH_type=31m未配置
|
||||
[ -f $clashdir/tools/tun.ko ] && mi_tunfix=32m已启用 || mi_tunfix=31m未启用
|
||||
[ -f $CRASHDIR/tools/tun.ko ] && mi_tunfix=32m已启用 || mi_tunfix=31m未启用
|
||||
#
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m欢迎使用其他工具菜单:\033[0m"
|
||||
echo -e "\033[33m本页工具可能无法兼容全部Linux设备,请酌情使用!\033[0m"
|
||||
echo -e "磁盘占用/所在目录:"
|
||||
du -sh $clashdir
|
||||
du -sh $CRASHDIR
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 ShellClash\033[33m测试菜单\033[0m"
|
||||
echo -e " 2 ShellClash\033[32m新手引导\033[0m"
|
||||
echo -e " 1 ShellCrash\033[33m测试菜单\033[0m"
|
||||
echo -e " 2 ShellCrash\033[32m新手引导\033[0m"
|
||||
echo -e " 3 \033[36m日志及推送工具\033[0m"
|
||||
[ -f /etc/firewall.user ] && echo -e " 4 \033[32m配置\033[0m外网访问SSH"
|
||||
[ -x /usr/sbin/otapredownload ] && echo -e " 5 \033[33m$mi_update\033[0m小米系统自动更新"
|
||||
|
@ -1626,10 +1634,10 @@ tools(){
|
|||
i=
|
||||
|
||||
elif [ "$num" = 1 ]; then
|
||||
source $clashdir/getdate.sh && testcommand
|
||||
source $CRASHDIR/getdate.sh && testcommand
|
||||
|
||||
elif [ "$num" = 2 ]; then
|
||||
source $clashdir/getdate.sh && userguide
|
||||
source $CRASHDIR/getdate.sh && userguide
|
||||
|
||||
elif [ "$num" = 3 ]; then
|
||||
log_pusher
|
||||
|
@ -1642,17 +1650,17 @@ tools(){
|
|||
|
||||
elif [ "$num" = 7 ]; then
|
||||
echo -----------------------------------------------
|
||||
if [ ! -f $clashdir/tools/ShellDDNS.sh ];then
|
||||
if [ ! -f $CRASHDIR/tools/ShellDDNS.sh ];then
|
||||
echo -e "正在获取在线脚本……"
|
||||
$clashdir/start.sh webget $TMPDIR/ShellDDNS.sh $update_url/tools/ShellDDNS.sh
|
||||
$CRASHDIR/start.sh webget $TMPDIR/ShellDDNS.sh $update_url/tools/ShellDDNS.sh
|
||||
if [ "$?" = "0" ];then
|
||||
mv -f $TMPDIR/ShellDDNS.sh $clashdir/tools/ShellDDNS.sh
|
||||
source $clashdir/tools/ShellDDNS.sh
|
||||
mv -f $TMPDIR/ShellDDNS.sh $CRASHDIR/tools/ShellDDNS.sh
|
||||
source $CRASHDIR/tools/ShellDDNS.sh
|
||||
else
|
||||
echo -e "\033[31m文件下载失败!\033[0m"
|
||||
fi
|
||||
else
|
||||
source $clashdir/tools/ShellDDNS.sh
|
||||
source $CRASHDIR/tools/ShellDDNS.sh
|
||||
fi
|
||||
sleep 1
|
||||
tools
|
||||
|
@ -1672,10 +1680,10 @@ tools(){
|
|||
fi
|
||||
tools
|
||||
elif [ "$num" = 8 ]; then
|
||||
if [ -f $clashdir/tools/tun.ko ];then
|
||||
if [ -f $CRASHDIR/tools/tun.ko ];then
|
||||
read -p "是否禁用此功能并移除相关补丁?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
rm -rf $clashdir/tools/tun.ko
|
||||
rm -rf $CRASHDIR/tools/tun.ko
|
||||
echo -e "\033[33m补丁文件已移除,请立即重启设备以防止出错!\033[0m"
|
||||
}
|
||||
elif [ -z "$(modinfo tun)" ];then
|
||||
|
@ -1687,11 +1695,11 @@ tools(){
|
|||
tunfixlink="${update_url}/bin/fix/tun.ko"
|
||||
echo -----------------------------------------------
|
||||
echo 正在连接服务器获取Tun模块补丁文件…………
|
||||
$clashdir/start.sh webget $TMPDIR/tun.ko $tunfixlink
|
||||
$CRASHDIR/start.sh webget $TMPDIR/tun.ko $tunfixlink
|
||||
if [ "$?" = "0" ];then
|
||||
mv -f $TMPDIR/tun.ko $clashdir/tools/tun.ko && \
|
||||
$clashdir/misnap_init.sh tunfix && \
|
||||
echo -e "\033[32m设置成功!请重启clash服务!\033[0m"
|
||||
mv -f $TMPDIR/tun.ko $CRASHDIR/tools/tun.ko && \
|
||||
$CRASHDIR/misnap_init.sh tunfix && \
|
||||
echo -e "\033[32m设置成功!请重启服务!\033[0m"
|
||||
else
|
||||
echo -e "\033[31m文件下载失败,请重试!\033[0m"
|
||||
fi
|
||||
|
@ -1705,186 +1713,18 @@ tools(){
|
|||
errornum
|
||||
fi
|
||||
}
|
||||
clashcron(){
|
||||
croncmd(){
|
||||
if [ -n "$(crontab -h 2>&1 | grep '\-l')" ];then
|
||||
crontab $1
|
||||
else
|
||||
crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}')"
|
||||
[ ! -w "$crondir" ] && crondir="/etc/storage/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron"
|
||||
[ ! -w "$crondir" ] && echo "你的设备不支持定时任务配置,脚本大量功能无法启用,请前往 https://t.me/ShellClash 申请适配!"
|
||||
[ "$1" = "-l" ] && cat $crondir/$USER 2>/dev/null
|
||||
[ -f "$1" ] && cat $1 > $crondir/$USER
|
||||
fi
|
||||
}
|
||||
setcron(){
|
||||
setcrontab(){
|
||||
#设置具体时间
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入小时(0-23) > " num
|
||||
if [ -z "$num" ]; then
|
||||
errornum
|
||||
setcron
|
||||
elif [ $num -gt 23 ] || [ $num -lt 0 ]; then
|
||||
errornum
|
||||
setcron
|
||||
else
|
||||
hour=$num
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入分钟(0-59) > " num
|
||||
if [ -z "$num" ]; then
|
||||
errornum
|
||||
setcron
|
||||
elif [ $num -gt 59 ] || [ $num -lt 0 ]; then
|
||||
errornum
|
||||
setcron
|
||||
else
|
||||
min=$num
|
||||
echo -----------------------------------------------
|
||||
echo 将在$week1的$hour点$min分$cronname(旧的任务会被覆盖)
|
||||
read -p "是否确认添加定时任务?(1/0) > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
cronwords="$min $hour * * $week $cronset #$week1的$hour点$min分$cronname"
|
||||
tmpcron=$TMPDIR/cron_$USER
|
||||
croncmd -l > $tmpcron
|
||||
sed -i "/$cronname/d" $tmpcron
|
||||
sed -i '/^$/d' $tmpcron
|
||||
echo "$cronwords" >> $tmpcron
|
||||
croncmd $tmpcron
|
||||
#华硕/Padavan固件存档在本地,其他则删除
|
||||
[ "$clashdir" = "/jffs/clash" -o "$clashdir" = "/etc/storage/clash" ] && mv -f $tmpcron $clashdir/tools/cron || rm -f $tmpcron
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m定时任务已添加!!!\033[0m"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e " 正在设置:\033[32m$cronname\033[0m定时任务"
|
||||
echo -e " 输入 1~7 对应\033[33m每周的指定某天\033[0m运行"
|
||||
echo -e " 输入 8 设为\033[33m每天\033[0m定时运行"
|
||||
echo -e " 输入 1,3,6 代表\033[36m指定每周1,3,6\033[0m运行(小写逗号分隔)"
|
||||
echo -e " 输入 a,b,c 代表\033[36m指定每周a,b,c\033[0m运行(1<=abc<=7)"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 输入 9 \033[31m删除定时任务\033[0m"
|
||||
echo -e " 输入 0 返回上级菜单"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
i=
|
||||
elif [ "$num" = 9 ]; then
|
||||
croncmd -l > $TMPDIR/conf && sed -i "/$cronname/d" $TMPDIR/conf && croncmd $TMPDIR/conf
|
||||
sed -i "/$cronname/d" $clashdir/tools/cron 2>/dev/null
|
||||
rm -f $TMPDIR/conf
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m定时任务:$cronname已删除!\033[0m"
|
||||
elif [ "$num" = 8 ]; then
|
||||
week='*'
|
||||
week1=每天
|
||||
echo 已设为每天定时运行!
|
||||
setcrontab
|
||||
else
|
||||
week=$num
|
||||
week1=每周$week
|
||||
echo 已设为每周 $num 运行!
|
||||
setcrontab
|
||||
fi
|
||||
}
|
||||
#定时任务菜单
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m欢迎使用定时任务功能:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m已添加的定时任务:\033[36m"
|
||||
croncmd -l | grep -oE ' #.*'
|
||||
echo -e "\033[0m"-----------------------------------------------
|
||||
echo -e " 1 设置\033[33m定时重启\033[0mclash服务"
|
||||
echo -e " 2 设置\033[31m定时停止\033[0mclash服务"
|
||||
echo -e " 3 设置\033[32m定时开启\033[0mclash服务"
|
||||
echo -e " 4 设置\033[33m定时更新\033[0m订阅并重启服务"
|
||||
echo -e " 5 设置\033[33m定时热更新\033[0m订阅"
|
||||
echo -e " 6 设置\033[36m自定义命令\033[0m"
|
||||
echo -e " 7 删除\033[31m指定任务\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -z "$num" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
i=
|
||||
elif [ "$num" = 1 ]; then
|
||||
cronname=重启clash服务
|
||||
cronset="$clashdir/start.sh restart"
|
||||
setcron
|
||||
clashcron
|
||||
elif [ "$num" = 2 ]; then
|
||||
cronname=停止clash服务
|
||||
cronset="$clashdir/start.sh stop"
|
||||
setcron
|
||||
clashcron
|
||||
elif [ "$num" = 3 ]; then
|
||||
cronname=开启clash服务
|
||||
cronset="$clashdir/start.sh start"
|
||||
setcron
|
||||
clashcron
|
||||
elif [ "$num" = 4 ]; then
|
||||
cronname=更新订阅链接
|
||||
cronset="$clashdir/start.sh getyaml && $clashdir/start.sh restart"
|
||||
setcron
|
||||
clashcron
|
||||
elif [ "$num" = 5 ]; then
|
||||
cronname=更新订阅但不重启
|
||||
cronset="$clashdir/start.sh updateyaml"
|
||||
setcron
|
||||
clashcron
|
||||
elif [ "$num" = 6 ]; then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m可包含空格,请确保命令可执行!\033[0m"
|
||||
read -p "请输入命令语句 > " script
|
||||
if [ -n "$script" ];then
|
||||
cronset=$script
|
||||
echo -e "请检查输入:\033[32m$cronset\033[0m"
|
||||
read -p "请输入任务备注 > " txt
|
||||
[ -n "$txt" ] && cronname=$txt || cronname=ShellClash自定义
|
||||
setcron
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
clashcron
|
||||
elif [ "$num" = 7 ]; then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m将按照关键词匹配并删除所有匹配!\033[0m"
|
||||
read -p "请输入备注的关键词 > " txt
|
||||
[ -n "$txt" ] && {
|
||||
cronname=$txt
|
||||
croncmd -l > $TMPDIR/conf && sed -i "/$cronname/d" $TMPDIR/conf && croncmd $TMPDIR/conf
|
||||
sed -i "/$cronname/d" $clashdir/tools/cron 2>/dev/null
|
||||
rm -f $TMPDIR/conf
|
||||
echo -----------------------------------------------
|
||||
echo -e "所有关键词\033[32m$cronname\033[0m匹配的定时任务均已删除!\033[0m"
|
||||
sleep 1
|
||||
}
|
||||
clashcron
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
}
|
||||
#主菜单
|
||||
clashsh(){
|
||||
#############################
|
||||
ckstatus
|
||||
#############################
|
||||
echo -e " 1 \033[32m启动/重启\033[0mclash服务"
|
||||
echo -e " 2 clash\033[33m功能设置\033[0m"
|
||||
echo -e " 3 \033[31m停止\033[0mclash服务"
|
||||
echo -e " 4 clash\033[36m启动设置\033[0m"
|
||||
echo -e " 5 设置\033[33m定时任务\033[0m$cronoff"
|
||||
echo -e " 1 \033[32m启动/重启\033[0m服务"
|
||||
echo -e " 2 内核\033[33m功能设置\033[0m"
|
||||
echo -e " 3 \033[31m停止\033[0m内核服务"
|
||||
echo -e " 4 内核\033[36m启动设置\033[0m"
|
||||
echo -e " 5 配置\033[33m自动任务\033[0m"
|
||||
echo -e " 6 导入\033[32m配置文件\033[0m"
|
||||
echo -e " 7 clash\033[31m进阶设置\033[0m"
|
||||
echo -e " 7 内核\033[31m进阶设置\033[0m"
|
||||
echo -e " 8 \033[35m其他工具\033[0m"
|
||||
echo -e " 9 \033[36m更新/卸载\033[0m"
|
||||
echo -----------------------------------------------
|
||||
|
@ -1911,7 +1751,7 @@ clashsh(){
|
|||
clashsh
|
||||
|
||||
elif [ "$num" = 3 ]; then
|
||||
$clashdir/start.sh stop
|
||||
$CRASHDIR/start.sh stop
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31mClash服务已停止!\033[0m"
|
||||
clashsh
|
||||
|
@ -1921,11 +1761,11 @@ clashsh(){
|
|||
clashsh
|
||||
|
||||
elif [ "$num" = 5 ]; then
|
||||
clashcron
|
||||
source $CRASHDIR/task/task.sh && task_menu
|
||||
clashsh
|
||||
|
||||
elif [ "$num" = 6 ]; then
|
||||
source $clashdir/getdate.sh && clashlink
|
||||
source $CRASHDIR/getdate.sh && clashlink
|
||||
clashsh
|
||||
|
||||
elif [ "$num" = 7 ]; then
|
||||
|
@ -1943,7 +1783,7 @@ clashsh(){
|
|||
|
||||
elif [ "$num" = 9 ]; then
|
||||
checkcfg=$(cat $CFG_PATH)
|
||||
source $clashdir/getdate.sh && update
|
||||
source $CRASHDIR/getdate.sh && update
|
||||
if [ -n "$PID" ];then
|
||||
checkcfg_new=$(cat $CFG_PATH)
|
||||
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart
|
||||
|
@ -1956,10 +1796,10 @@ clashsh(){
|
|||
fi
|
||||
}
|
||||
|
||||
[ -z "$clashdir" ] && {
|
||||
[ -z "$CRASHDIR" ] && {
|
||||
echo 环境变量配置有误!正在初始化~~~
|
||||
clashdir=$(cd `dirname $0`; pwd)
|
||||
source $clashdir/init.sh
|
||||
CRASHDIR=$(cd `dirname $0`; pwd)
|
||||
source $CRASHDIR/init.sh
|
||||
sleep 1
|
||||
echo 请重启SSH窗口以完成初始化!
|
||||
exit
|
||||
|
@ -1970,7 +1810,7 @@ clashsh(){
|
|||
case "$1" in
|
||||
-h)
|
||||
echo -----------------------------------------
|
||||
echo "欢迎使用ShellClash"
|
||||
echo "欢迎使用ShellCrash"
|
||||
echo -----------------------------------------
|
||||
echo " -t 测试模式"
|
||||
echo " -h 帮助列表"
|
||||
|
@ -1982,46 +1822,48 @@ case "$1" in
|
|||
echo -----------------------------------------
|
||||
echo "在线求助:t.me/ShellClash"
|
||||
echo "官方博客:juewuy.github.io"
|
||||
echo "发布页面:github.com/juewuy/ShellClash"
|
||||
echo "发布页面:github.com/juewuy/ShellCrash"
|
||||
echo -----------------------------------------
|
||||
;;
|
||||
-t)
|
||||
shtype=sh && [ -n "$(ls -l /bin/sh|grep -o dash)" ] && shtype=bash
|
||||
$shtype -x $clashdir/clash.sh
|
||||
$shtype -x $CRASHDIR/clash.sh
|
||||
;;
|
||||
-s)
|
||||
$clashdir/start.sh $2 $3 $4 $5 $6
|
||||
$CRASHDIR/start.sh $2 $3 $4 $5 $6
|
||||
;;
|
||||
-st)
|
||||
shtype=sh && [ -n "$(ls -l /bin/sh|grep -o dash)" ] && shtype=bash
|
||||
$shtype -x $clashdir/start.sh $2 $3 $4 $5 $6
|
||||
$shtype -x $CRASHDIR/start.sh $2 $3 $4 $5 $6
|
||||
;;
|
||||
-u)
|
||||
read -p "确认卸载ShellClash?(警告:该操作不可逆!)[1/0] > " res
|
||||
read -p "确认卸载ShellCrash?(警告:该操作不可逆!)[1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
$clashdir/start.sh stop
|
||||
$clashdir/start.sh cronset "clash服务"
|
||||
$clashdir/start.sh cronset "订阅链接"
|
||||
$clashdir/start.sh cronset "ShellClash初始化"
|
||||
$CRASHDIR/start.sh stop
|
||||
$CRASHDIR/start.sh cronset "clash服务"
|
||||
$CRASHDIR/start.sh cronset "订阅链接"
|
||||
$CRASHDIR/start.sh cronset "ShellCrash初始化"
|
||||
read -p "是否保留脚本配置及订阅文件?[1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
mv -f $clashdir/configs /tmp/clash_$USER
|
||||
mv -f $clashdir/yamls /tmp/clash_$USER
|
||||
rm -rf $clashdir/*
|
||||
mv -f /tmp/clash_$USER/configs $clashdir
|
||||
mv -f /tmp/clash_$USER/yamls $clashdir
|
||||
mv -f $CRASHDIR/configs /tmp/clash_$USER
|
||||
mv -f $CRASHDIR/yamls /tmp/clash_$USER
|
||||
rm -rf $CRASHDIR/*
|
||||
mv -f /tmp/clash_$USER/configs $CRASHDIR
|
||||
mv -f /tmp/clash_$USER/yamls $CRASHDIR
|
||||
else
|
||||
rm -rf $clashdir
|
||||
rm -rf $CRASHDIR
|
||||
fi
|
||||
[ -w ~/.bashrc ] && profile=~/.bashrc
|
||||
[ -w /etc/profile ] && profile=/etc/profile
|
||||
sed -i '/alias clash=*/'d $profile
|
||||
sed -i '/export clashdir=*/'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 '/ShellClash初始化/'d /etc/storage/started_script.sh 2>/dev/null
|
||||
sed -i '/ShellClash初始化/'d /jffs/.asusrouter 2>/dev/null
|
||||
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/clash
|
||||
rm -rf /etc/systemd/system/clash.service
|
||||
|
@ -2033,7 +1875,7 @@ case "$1" in
|
|||
nvram set script_usbmount="" 2>/dev/null
|
||||
nvram commit 2>/dev/null
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m已卸载ShellClash相关文件!有缘再会!\033[0m"
|
||||
echo -e "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m"
|
||||
echo -e "\033[33m请手动关闭当前窗口以重置环境变量!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
exit
|
||||
|
|
|
@ -6,9 +6,9 @@ SERVICE_DAEMONIZE=1
|
|||
SERVICE_WRITE_PID=1
|
||||
USE_PROCD=1
|
||||
#获取目录
|
||||
DIR=$(cat /etc/profile | grep clashdir | awk -F "\"" '{print $2}')
|
||||
[ -z "$DIR" ] && DIR=$(cat ~/.bashrc | grep clashdir | awk -F "\"" '{print $2}')
|
||||
BINDIR=$(cat $DIR/configs/ShellClash.cfg | grep bindir | awk -F "=" '{print $2}')
|
||||
DIR=$(cat /etc/profile | grep CRASHDIR | awk -F "\"" '{print $2}')
|
||||
[ -z "$DIR" ] && DIR=$(cat ~/.bashrc | grep CRASHDIR | awk -F "\"" '{print $2}')
|
||||
BINDIR=$(cat $DIR/configs/ShellCrash.cfg | grep bindir | awk -F "=" '{print $2}')
|
||||
[ -z "$BINDIR" ] && BINDIR=$DIR
|
||||
|
||||
start_service() {
|
||||
|
|
|
@ -12,18 +12,18 @@ dir_avail(){
|
|||
#导入订阅、配置文件相关
|
||||
linkconfig(){
|
||||
echo -----------------------------------------------
|
||||
echo 当前使用规则为:$(grep -aE '^5' $clashdir/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}')
|
||||
grep -aE '^5' $clashdir/configs/servers.list | awk '{print " "NR" "$2$4}'
|
||||
echo 当前使用规则为:$(grep -aE '^5' $CRASHDIR/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}')
|
||||
grep -aE '^5' $CRASHDIR/configs/servers.list | awk '{print " "NR" "$2$4}'
|
||||
echo -----------------------------------------------
|
||||
echo 0 返回上级菜单
|
||||
read -p "请输入对应数字 > " num
|
||||
totalnum=$(grep -acE '^5' $clashdir/configs/servers.list )
|
||||
totalnum=$(grep -acE '^5' $CRASHDIR/configs/servers.list )
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then
|
||||
errornum
|
||||
elif [ "$num" = 0 ];then
|
||||
echo
|
||||
elif [ "$num" -le "$totalnum" ];then
|
||||
#将对应标记值写入mark
|
||||
#将对应标记值写入配置
|
||||
rule_link=$num
|
||||
setconfig rule_link $rule_link
|
||||
echo -----------------------------------------------
|
||||
|
@ -34,18 +34,18 @@ linkserver(){
|
|||
echo -----------------------------------------------
|
||||
echo -e "\033[36m以下为互联网采集的第三方服务器,具体安全性请自行斟酌!\033[0m"
|
||||
echo -e "\033[32m感谢以下作者的无私奉献!!!\033[0m"
|
||||
echo 当前使用后端为:$(grep -aE '^3|^4' $clashdir/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
grep -aE '^3|^4' $clashdir/configs/servers.list | awk '{print " "NR" "$3" "$2}'
|
||||
echo 当前使用后端为:$(grep -aE '^3|^4' $CRASHDIR/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
grep -aE '^3|^4' $CRASHDIR/configs/servers.list | awk '{print " "NR" "$3" "$2}'
|
||||
echo -----------------------------------------------
|
||||
echo 0 返回上级菜单
|
||||
read -p "请输入对应数字 > " num
|
||||
totalnum=$(grep -acE '^3|^4' $clashdir/configs/servers.list )
|
||||
totalnum=$(grep -acE '^3|^4' $CRASHDIR/configs/servers.list )
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then
|
||||
errornum
|
||||
elif [ "$num" = 0 ];then
|
||||
echo
|
||||
elif [ "$num" -le "$totalnum" ];then
|
||||
#将对应标记值写入mark
|
||||
#将对应标记值写入配置
|
||||
server_link=$num
|
||||
setconfig server_link $server_link
|
||||
echo -----------------------------------------------
|
||||
|
@ -93,10 +93,10 @@ linkfilter2(){
|
|||
setconfig include \'$include\'
|
||||
}
|
||||
getyaml(){
|
||||
$clashdir/start.sh getyaml
|
||||
$CRASHDIR/start.sh getyaml
|
||||
if [ "$?" = 0 ];then
|
||||
if [ "$inuserguide" != 1 ];then
|
||||
read -p "是否启动clash服务以使配置文件生效?(1/0) > " res
|
||||
read -p "是否启动服务以使配置文件生效?(1/0) > " res
|
||||
[ "$res" = 1 ] && clashstart || clashsh
|
||||
exit;
|
||||
fi
|
||||
|
@ -142,7 +142,7 @@ getlink(){
|
|||
elif [ "$link" = '1' ]; then
|
||||
if [ -n "$Url_link" ];then
|
||||
i=100
|
||||
#将用户链接写入mark
|
||||
#将用户链接写入配置
|
||||
setconfig Https
|
||||
setconfig Url \'$Url_link\'
|
||||
#获取在线yaml文件
|
||||
|
@ -197,7 +197,7 @@ getlink2(){
|
|||
echo -e "\033[4;32m$link\033[0m"
|
||||
read -p "确认导入配置文件?原配置文件将被更名为config.yaml.bak![1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
#将用户链接写入mark
|
||||
#将用户链接写入配置
|
||||
sed -i '/Url=*/'d $CFG_PATH
|
||||
setconfig Https \'$link\'
|
||||
setconfig Url
|
||||
|
@ -278,8 +278,10 @@ setrules(){
|
|||
0) ;;
|
||||
'') ;;
|
||||
*)
|
||||
if [ $num -le $(cat $YAMLSDIR/rules.yaml | grep -Ev '^#' | grep -Ev '^ *$' | wc -l) ];then
|
||||
sed -i "$num{/^\s*[^#]/d}" $YAMLSDIR/rules.yaml
|
||||
text=$(cat $YAMLSDIR/rules.yaml | grep -Ev '^#' | sed -n "$num p")
|
||||
if [ -n $text ];then
|
||||
sed -i "/$text/d" $YAMLSDIR/rules.yaml
|
||||
sleep 1
|
||||
del_rule_type
|
||||
else
|
||||
errornum
|
||||
|
@ -292,7 +294,7 @@ setrules(){
|
|||
echo -e "\033[36m如需批量操作,请手动编辑:$YAMLSDIR/rules.yaml\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 新增自定义规则"
|
||||
echo -e " 2 管理自定义规则"
|
||||
echo -e " 2 移除自定义规则"
|
||||
echo -e " 3 清空规则列表"
|
||||
echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m"
|
||||
echo -e " 0 返回上级菜单"
|
||||
|
@ -323,7 +325,7 @@ setrules(){
|
|||
echo -----------------------------------------------
|
||||
if [ "$proxies_bypass" = "未启用" ];then
|
||||
echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellClash中使用的节点相同,否则无法生效!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m"
|
||||
read -p "启用节点绕过?(1/0) > " res
|
||||
[ "$res" = "1" ] && proxies_bypass=已启用
|
||||
else
|
||||
|
@ -513,7 +515,7 @@ setproxies(){
|
|||
echo -----------------------------------------------
|
||||
if [ "$proxies_bypass" = "未启用" ];then
|
||||
echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellClash中使用的节点相同,否则无法生效!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同,否则无法生效!\033[0m"
|
||||
read -p "启用节点绕过?(1/0) > " res
|
||||
[ "$res" = "1" ] && proxies_bypass=已启用
|
||||
else
|
||||
|
@ -548,10 +550,10 @@ override(){
|
|||
source $CFG_PATH
|
||||
if [ -n "$(pidof clash)" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m检测到clash服务正在运行,需要先停止clash服务!\033[0m"
|
||||
read -p "是否停止clash服务?(1/0) > " res
|
||||
echo -e "\033[33m检测到服务正在运行,需要先停止服务!\033[0m"
|
||||
read -p "是否停止服务?(1/0) > " res
|
||||
if [ "$res" = "1" ];then
|
||||
$clashdir/start.sh stop
|
||||
$CRASHDIR/start.sh stop
|
||||
setport
|
||||
fi
|
||||
else
|
||||
|
@ -686,7 +688,7 @@ clashlink(){
|
|||
if [ "$res" = '1' ]; then
|
||||
mv $YAMLSDIR/config.yaml.bak $YAMLSDIR/config.yaml
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m配置文件已还原!请手动重启clash服务!\033[0m"
|
||||
echo -e "\033[32m配置文件已还原!请手动重启服务!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
echo -----------------------------------------------
|
||||
|
@ -715,7 +717,8 @@ clashlink(){
|
|||
fi
|
||||
;;
|
||||
5)
|
||||
clashcron
|
||||
source $CRASHDIR/task/task.sh && task_add
|
||||
clashlink
|
||||
;;
|
||||
6)
|
||||
checkcfg=$(cat $CFG_PATH)
|
||||
|
@ -731,23 +734,23 @@ clashlink(){
|
|||
}
|
||||
#下载更新相关
|
||||
gettar(){
|
||||
$clashdir/start.sh webget $TMPDIR/clashfm.tar.gz $tarurl
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clashfm.tar.gz $tarurl
|
||||
if [ "$?" != "0" ];then
|
||||
echo -e "\033[33m文件下载失败!\033[0m"
|
||||
error_down
|
||||
else
|
||||
$clashdir/start.sh stop 2>/dev/null
|
||||
$CRASHDIR/start.sh stop 2>/dev/null
|
||||
#解压
|
||||
echo -----------------------------------------------
|
||||
echo 开始解压文件!
|
||||
mkdir -p $clashdir > /dev/null
|
||||
tar -zxvf "$TMPDIR/clashfm.tar.gz" -C $clashdir/
|
||||
mkdir -p $CRASHDIR > /dev/null
|
||||
tar -zxvf "$TMPDIR/clashfm.tar.gz" -C $CRASHDIR/
|
||||
if [ $? -ne 0 ];then
|
||||
rm -rf $TMPDIR/clashfm.tar.gz
|
||||
echo -e "\033[33m文件解压失败!\033[0m"
|
||||
error_down
|
||||
else
|
||||
source $clashdir/init.sh >/dev/null
|
||||
source $CRASHDIR/init.sh >/dev/null
|
||||
echo -e "\033[32m脚本更新成功!\033[0m"
|
||||
fi
|
||||
fi
|
||||
|
@ -757,7 +760,7 @@ getsh(){
|
|||
echo -----------------------------------------------
|
||||
echo -e "当前脚本版本为:\033[33m $versionsh_l \033[0m"
|
||||
echo -e "最新脚本版本为:\033[32m $release_new \033[0m"
|
||||
echo -e "注意更新时会停止clash服务!"
|
||||
echo -e "注意更新时会停止服务!"
|
||||
echo -----------------------------------------------
|
||||
read -p "是否更新脚本?[1/0] > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
|
@ -812,13 +815,14 @@ getcore(){
|
|||
#获取在线clash核心文件
|
||||
echo -----------------------------------------------
|
||||
echo 正在在线获取clash核心文件……
|
||||
$clashdir/start.sh webget $TMPDIR/clash.new $corelink
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clash.new $corelink
|
||||
if [ "$?" = "1" ];then
|
||||
echo -e "\033[31m核心文件下载失败!\033[0m"
|
||||
rm -rf $TMPDIR/clash.new
|
||||
[ -z "$custcorelink" ] && error_down
|
||||
else
|
||||
chmod +x $TMPDIR/clash.new
|
||||
$CRASHDIR/start.sh stop
|
||||
clashv=$($TMPDIR/clash.new -v 2>/dev/null | sed 's/ linux.*//;s/.* //')
|
||||
if [ -z "$clashv" ];then
|
||||
echo -e "\033[31m核心文件下载成功但校验失败!请尝试手动指定CPU版本\033[0m"
|
||||
|
@ -829,7 +833,6 @@ getcore(){
|
|||
mv -f $TMPDIR/clash.new $bindir/clash
|
||||
chmod +x $bindir/clash
|
||||
setconfig clashcore $clashcore
|
||||
setconfig clashv $version
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
@ -838,7 +841,7 @@ setcustcore(){
|
|||
echo -----------------------------------------------
|
||||
echo -e "\033[36m自定义内核均未经过适配,可能存在部分功能不兼容的问题!\033[0m"
|
||||
echo -e "\033[36m如你不熟悉clash的运行机制,请使用脚本已经适配过的内核!\033[0m"
|
||||
echo -e "\033[36m自定义内核不兼容小闪存模式,且下载可能依赖clash服务!\033[0m"
|
||||
echo -e "\033[36m自定义内核不兼容小闪存模式,且下载可能依赖服务!\033[0m"
|
||||
echo -e "\033[33m继续后如出现任何问题,请务必自行解决,一切提问恕不受理!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
sleep 1
|
||||
|
@ -852,18 +855,18 @@ setcustcore(){
|
|||
case "$num" in
|
||||
1)
|
||||
clashcore=clashpre
|
||||
custcorelink=https://github.com/juewuy/ShellClash/releases/download/clash.premium.latest/clash-linux-$cpucore
|
||||
custcorelink=https://github.com/juewuy/ShellCrash/releases/download/clash.premium.latest/clash-linux-$cpucore
|
||||
getcore
|
||||
;;
|
||||
2)
|
||||
clashcore=clash.meta
|
||||
custcorelink=https://github.com/juewuy/ShellClash/releases/download/clash.meta.alpha/clash-linux-$cpucore
|
||||
clashcore=meta
|
||||
custcorelink=https://github.com/juewuy/ShellCrash/releases/download/clash.meta.alpha/clash-linux-$cpucore
|
||||
getcore
|
||||
;;
|
||||
3)
|
||||
read -p "请输入自定义内核的链接地址(必须是二进制文件) > " link
|
||||
[ -n "$link" ] && custcorelink="$link"
|
||||
clashcore=clash.meta
|
||||
clashcore=meta
|
||||
getcore
|
||||
;;
|
||||
*)
|
||||
|
@ -874,7 +877,7 @@ setcustcore(){
|
|||
}
|
||||
setcore(){
|
||||
#获取核心及版本信息
|
||||
[ ! -f $clashdir/clash ] && clashcore="未安装核心"
|
||||
[ ! -f $CRASHDIR/clash ] && clashcore="未安装核心"
|
||||
###
|
||||
echo -----------------------------------------------
|
||||
[ -z "$cpucore" ] && getcpucore
|
||||
|
@ -912,7 +915,7 @@ setcore(){
|
|||
getcore
|
||||
;;
|
||||
3)
|
||||
clashcore=clash.meta
|
||||
clashcore=meta
|
||||
custcorelink=''
|
||||
getcore
|
||||
;;
|
||||
|
@ -932,7 +935,7 @@ setcore(){
|
|||
getgeo(){
|
||||
echo -----------------------------------------------
|
||||
echo 正在从服务器获取数据库文件…………
|
||||
$clashdir/start.sh webget $TMPDIR/$geoname $update_url/bin/geodata/$geotype
|
||||
$CRASHDIR/start.sh webget $TMPDIR/$geoname $update_url/bin/geodata/$geotype
|
||||
if [ "$?" = "1" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m文件下载失败!\033[0m"
|
||||
|
@ -940,26 +943,29 @@ getgeo(){
|
|||
else
|
||||
mv -f $TMPDIR/$geoname $bindir/$geoname
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32mGeoIP/CN_IP数据库文件下载成功!\033[0m"
|
||||
Geo_v=$GeoIP_v
|
||||
setconfig Geo_v $GeoIP_v
|
||||
if [ "$geoname" = "Country.mmdb" ];then
|
||||
geotype=$geotype
|
||||
setconfig geotype $geotype
|
||||
fi
|
||||
echo -e "\033[32m$geotype数据库文件下载成功!\033[0m"
|
||||
#全球版GeoIP和精简版CN-IP数据库不共存
|
||||
[ "$geoname" = "Country.mmdb" ] && {
|
||||
setconfig Country_v
|
||||
setconfig cn_mini_v
|
||||
}
|
||||
geo_v="$(echo $geotype | awk -F "." '{print $1}')_v"
|
||||
setconfig $geo_v $GeoIP_v
|
||||
fi
|
||||
sleep 1
|
||||
}
|
||||
setgeo(){
|
||||
[ -n "$cn_mini.mmdb_v" ] && geo_type_des=精简版 || geo_type_des=全球版
|
||||
echo -----------------------------------------------
|
||||
[ "$geotype" = "cn_mini.mmdb" ] && echo -e "当前使用的是\033[47;30m精简版数据库\033[0m" || echo -e "当前使用的是\033[47;30m全球版数据库\033[0m"
|
||||
echo -e "\033[36m请选择需要更新/切换的GeoIP/CN_IP数据库:\033[0m"
|
||||
echo -e "\033[36m请选择需要更新的GeoIP/CN_IP数据库:\033[0m"
|
||||
echo -e "\033[36m全球版GeoIP和精简版CN-IP数据库不共存\033[0m"
|
||||
echo -e "在线数据库最新版本:\033[32m$GeoIP_v\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 由\033[32malecthw\033[0m提供的全球版GeoIP数据库(约6mb)"
|
||||
echo -e " 2 由\033[32mHackl0us\033[0m提供的精简版CN-IP数据库(约0.2mb)"
|
||||
echo -e " 3 由\033[32m17mon\033[0m提供的CN-IP文件(需启用CN_IP绕过,约0.2mb)"
|
||||
echo -e " 4 由\033[32mChanthMiao\033[0m提供的CN-IPV6文件(需ipv6启用CN_IP绕过,约50kb)"
|
||||
[ "$clashcore" = "clash.meta" ] && \
|
||||
echo -e " 5 由\033[32mLoyalsoldier\033[0m提供的GeoSite数据库(限Meta内核,约4.5mb)"
|
||||
echo -e " 1 全球版GeoIP数据库(约6mb) \033[33m$Country_v\033[0m"
|
||||
echo -e " 2 精简版CN-IP数据库(约0.2mb) \033[33m$cn_mini_v\033[0m"
|
||||
echo -e " 3 CN-IP绕过文件(约0.2mb) \033[33m$china_ip_list_v\033[0m"
|
||||
echo -e " 4 CN-IPV6绕过文件(约50kb) \033[33m$china_ipv6_list_v\033[0m"
|
||||
echo -e " 5 GeoSite数据库(约4.5mb) \033[33m$geosite_v\033[0m"
|
||||
echo " 0 返回上级菜单"
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应数字 > " num
|
||||
|
@ -967,10 +973,12 @@ setgeo(){
|
|||
geotype=Country.mmdb
|
||||
geoname=Country.mmdb
|
||||
getgeo
|
||||
setgeo
|
||||
elif [ "$num" = '2' ]; then
|
||||
geotype=cn_mini.mmdb
|
||||
geoname=Country.mmdb
|
||||
getgeo
|
||||
setgeo
|
||||
elif [ "$num" = '3' ]; then
|
||||
if [ "$cn_ip_route" = "已开启" ]; then
|
||||
geotype=china_ip_list.txt
|
||||
|
@ -981,6 +989,7 @@ setgeo(){
|
|||
echo -e "\033[31m未开启绕过内核功能,无需更新CN-IP文件!!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
setgeo
|
||||
elif [ "$num" = '4' ]; then
|
||||
if [ "$cn_ipv6_route" = "已开启" -a "$ipv6_redir" = "已开启" ]; then
|
||||
geotype=china_ipv6_list.txt
|
||||
|
@ -991,10 +1000,18 @@ setgeo(){
|
|||
echo -e "\033[31m未开启ipv6下CN绕过功能,无需更新CN-IPV6文件!!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
setgeo
|
||||
elif [ "$num" = '5' ]; then
|
||||
geotype=geosite.dat
|
||||
geoname=GeoSite.dat
|
||||
getgeo
|
||||
if [ "$clashcore" = "meta" ]; then
|
||||
geotype=geosite.dat
|
||||
geoname=GeoSite.dat
|
||||
getgeo
|
||||
else
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m当前未使用meta内核,无需更新GeoSite数据库!!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
setgeo
|
||||
else
|
||||
update
|
||||
fi
|
||||
|
@ -1002,21 +1019,21 @@ setgeo(){
|
|||
|
||||
getdb(){
|
||||
#下载及安装
|
||||
if [ -f /www/clash/index.html -o -f $clashdir/ui/index.html ];then
|
||||
if [ -f /www/clash/index.html -o -f $CRASHDIR/ui/index.html ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m检测到您已经安装过本地面板了!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "是否覆盖安装?[1/0] > " res
|
||||
if [ "$res" = 1 ]; then
|
||||
rm -rf /www/clash
|
||||
rm -rf $clashdir/ui
|
||||
rm -rf $CRASHDIR/ui
|
||||
rm -rf $bindir/ui
|
||||
fi
|
||||
fi
|
||||
dblink="${update_url}/bin/dashboard/${db_type}.tar.gz"
|
||||
echo -----------------------------------------------
|
||||
echo 正在连接服务器获取安装文件…………
|
||||
$clashdir/start.sh webget $TMPDIR/clashdb.tar.gz $dblink
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clashdb.tar.gz $dblink
|
||||
if [ "$?" = "1" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m文件下载失败!\033[0m"
|
||||
|
@ -1053,14 +1070,14 @@ setdb(){
|
|||
echo -----------------------------------------------
|
||||
echo -e "请选择面板\033[33m安装目录:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 在$clashdir/ui目录安装"
|
||||
echo -e " 1 在$CRASHDIR/ui目录安装"
|
||||
echo -e " 2 在/www/clash目录安装"
|
||||
echo -----------------------------------------------
|
||||
echo " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
|
||||
if [ "$num" = '1' ]; then
|
||||
dbdir=$clashdir/ui
|
||||
dbdir=$CRASHDIR/ui
|
||||
hostdir=":$db_port/ui"
|
||||
elif [ "$num" = '2' ]; then
|
||||
dbdir=/www/clash
|
||||
|
@ -1069,7 +1086,7 @@ setdb(){
|
|||
setdb
|
||||
fi
|
||||
else
|
||||
dbdir=$clashdir/ui
|
||||
dbdir=$CRASHDIR/ui
|
||||
hostdir=":$db_port/ui"
|
||||
fi
|
||||
}
|
||||
|
@ -1113,7 +1130,7 @@ setdb(){
|
|||
read -p "确认卸载本地面板?(1/0) > " res
|
||||
if [ "$res" = 1 ];then
|
||||
rm -rf /www/clash
|
||||
rm -rf $clashdir/ui
|
||||
rm -rf $CRASHDIR/ui
|
||||
rm -rf $bindir/ui
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m面板已经卸载!\033[0m"
|
||||
|
@ -1128,7 +1145,7 @@ getcrt(){
|
|||
crtlink="${update_url}/bin/fix/ca-certificates.crt"
|
||||
echo -----------------------------------------------
|
||||
echo 正在连接服务器获取安装文件…………
|
||||
$clashdir/start.sh webget $TMPDIR/ca-certificates.crt $crtlink
|
||||
$CRASHDIR/start.sh webget $TMPDIR/ca-certificates.crt $crtlink
|
||||
if [ "$?" = "1" ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[31m文件下载失败!\033[0m"
|
||||
|
@ -1137,7 +1154,7 @@ getcrt(){
|
|||
echo -----------------------------------------------
|
||||
mkdir -p $openssldir
|
||||
mv -f $TMPDIR/ca-certificates.crt $crtdir
|
||||
$clashdir/start.sh webget $TMPDIR/ssl_test https://baidu.com echooff rediron skipceroff
|
||||
$CRASHDIR/start.sh webget $TMPDIR/ssl_test https://baidu.com echooff rediron skipceroff
|
||||
if [ "$?" = "1" ];then
|
||||
export CURL_CA_BUNDLE=$crtdir
|
||||
echo "export CURL_CA_BUNDLE=$crtdir" >> /etc/profile
|
||||
|
@ -1178,7 +1195,7 @@ setcrt(){
|
|||
#安装源
|
||||
setserver(){
|
||||
saveserver(){
|
||||
#写入mark文件
|
||||
#写入配置文件
|
||||
setconfig update_url \'$update_url\'
|
||||
setconfig release_url \'$release_url\'
|
||||
echo -----------------------------------------------
|
||||
|
@ -1186,10 +1203,10 @@ setserver(){
|
|||
release_new=""
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m切换ShellClash版本及更新源地址\033[0m"
|
||||
echo -e "\033[30;47m切换ShellCrash版本及更新源地址\033[0m"
|
||||
echo -e "当前源地址:\033[4;32m$update_url\033[0m"
|
||||
echo -----------------------------------------------
|
||||
grep -aE '^1|^2' $clashdir/configs/servers.list | awk '{print " "NR" "$4" "$2}'
|
||||
grep -aE '^1|^2' $CRASHDIR/configs/servers.list | awk '{print " "NR" "$4" "$2}'
|
||||
echo -----------------------------------------------
|
||||
echo -e " a 自定义源地址(用于本地源或自建源)"
|
||||
echo -e " b \033[31m版本回退\033[0m"
|
||||
|
@ -1197,11 +1214,11 @@ setserver(){
|
|||
read -p "请输入对应数字 > " num
|
||||
case $num in
|
||||
[0-99])
|
||||
release_type=$(grep -aE '^1|^2' $clashdir/configs/servers.list | sed -n ""$num"p" | awk '{print $4}')
|
||||
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' $clashdir/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
|
||||
release_url=$(grep -aE '^1' $CRASHDIR/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
|
||||
else
|
||||
update_url=$(grep -aE '^1|^2' $clashdir/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
|
||||
update_url=$(grep -aE '^1|^2' $CRASHDIR/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
|
||||
unset release_url
|
||||
fi
|
||||
saveserver
|
||||
|
@ -1219,8 +1236,8 @@ setserver(){
|
|||
;;
|
||||
b)
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m如无法连接,请务必先启用clash服务!!!\033[0m"
|
||||
$clashdir/start.sh webget $TMPDIR/clashrelease https://raw.githubusercontent.com/juewuy/ShellClash/master/bin/release_version echooff rediroff 2>$TMPDIR/clashrelease
|
||||
echo -e "\033[33m如无法连接,请务必先启用服务!!!\033[0m"
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clashrelease https://raw.githubusercontent.com/juewuy/ShellCrash/master/bin/release_version echooff rediroff 2>$TMPDIR/clashrelease
|
||||
echo -e "\033[31m请选择想要回退至的release版本:\033[0m"
|
||||
cat $TMPDIR/clashrelease | awk '{print " "NR" "$1}'
|
||||
echo -e " 0 返回上级菜单"
|
||||
|
@ -1229,7 +1246,7 @@ setserver(){
|
|||
setserver
|
||||
elif [ $num -le $(cat $TMPDIR/clashrelease 2>/dev/null | awk 'END{print NR}') ]; then
|
||||
release_version=$(cat $TMPDIR/clashrelease | awk '{print $1}' | sed -n "$num"p)
|
||||
update_url="https://raw.githubusercontent.com/juewuy/ShellClash/$release_version"
|
||||
update_url="https://raw.githubusercontent.com/juewuy/ShellCrash/$release_version"
|
||||
saveserver
|
||||
unset release_url
|
||||
else
|
||||
|
@ -1248,7 +1265,7 @@ 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
|
||||
$clashdir/start.sh webget $TMPDIR/clashversion $check_url/bin/release_version echoon rediroff 2>$TMPDIR/clashversion
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clashversion $check_url/bin/release_version echoon rediroff 2>$TMPDIR/clashversion
|
||||
release_new=$(cat $TMPDIR/clashversion | 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\'
|
||||
|
@ -1256,13 +1273,13 @@ if [ -z "$release_new" ];then
|
|||
else
|
||||
release_type=测试版
|
||||
fi
|
||||
$clashdir/start.sh webget $TMPDIR/clashversion $update_url/bin/version echooff
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clashversion $update_url/bin/version echooff
|
||||
[ "$?" = "0" ] && release_new=$(cat $TMPDIR/clashversion | grep -oE 'versionsh=.*' | awk -F'=' '{ print $2 }')
|
||||
if [ -n "$release_new" ];then
|
||||
source $TMPDIR/clashversion 2>/dev/null
|
||||
else
|
||||
echo -e "\033[31m检查更新失败!请切换其他安装源!\033[0m"
|
||||
echo -e "\033[36m如全部安装源都无法使用,请先运行clash服务后再使用更新功能!\033[0m"
|
||||
echo -e "\033[36m如全部安装源都无法使用,请先运行服务后再使用更新功能!\033[0m"
|
||||
sleep 1
|
||||
setserver
|
||||
fi
|
||||
|
@ -1273,30 +1290,27 @@ update(){
|
|||
echo -----------------------------------------------
|
||||
echo -ne "\033[32m正在检查更新!\033[0m\r"
|
||||
checkupdate
|
||||
[ "$clashcore" = "clash" ] && clash_n=$clash_v || clash_n=$clashpre_v
|
||||
[ "$clashcore" = "clashpre" ] && clash_n=$clashpre_v
|
||||
[ "$clashcore" = "clash.net" ] && clash_n=$clashnet_v
|
||||
[ "$clashcore" = "clash.meta" ] && clash_n=$meta_v
|
||||
clash_v=$($bindir/clash -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //')
|
||||
[ -z "$clash_v" ] && clash_v=$clashv
|
||||
clash_v_new=$(eval echo \$${clashcore}_v)
|
||||
echo -e "\033[30;47m欢迎使用更新功能:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前目录(\033[32m$clashdir\033[0m)剩余空间:\033[36m$(dir_avail $clashdir -h)\033[0m"
|
||||
[ "$(dir_avail $clashdir)" -le 5120 ] && {
|
||||
echo -e "当前目录(\033[32m$CRASHDIR\033[0m)剩余空间:\033[36m$(dir_avail $CRASHDIR -h)\033[0m"
|
||||
[ "$(dir_avail $CRASHDIR)" -le 5120 ] && {
|
||||
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[33mclash核心 \033[33m$clash_v\033[0m > \033[32m$clash_n\033[0m"
|
||||
echo -e " 3 更新\033[32mGeoIP/CN-IP \033[33m$Geo_v\033[0m > \033[32m$GeoIP_v\033[0m"
|
||||
echo -e " 2 切换\033[33mclash核心 \033[33m$clash_v\033[0m > \033[32m$clash_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"
|
||||
echo -e " 6 查看\033[32mPAC\033[0m自动代理配置"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 7 切换\033[36m安装源\033[0m及\033[36m安装版本\033[0m"
|
||||
echo -e " 8 \033[32m重新初始化运行环境\033[0m"
|
||||
echo -e " 9 \033[31m卸载\033[34mShellClash\033[0m"
|
||||
echo -e " 8 \033[32m配置自动更新\033[0m"
|
||||
echo -e " 9 \033[31m卸载ShellCrash\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e "99 \033[36m鸣谢!\033[0m"
|
||||
echo -e " 0 返回上级菜单"
|
||||
|
@ -1336,7 +1350,7 @@ update(){
|
|||
setserver
|
||||
update
|
||||
elif [ "$num" = 8 ]; then
|
||||
source $clashdir/init.sh
|
||||
source $CRASHDIR/task/task.sh && task_add
|
||||
update
|
||||
|
||||
elif [ "$num" = 9 ]; then
|
||||
|
@ -1367,7 +1381,7 @@ userguide(){
|
|||
|
||||
forwhat(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;46m 欢迎使用ShellClash新手引导! \033[0m"
|
||||
echo -e "\033[30;46m 欢迎使用ShellCrash新手引导! \033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m请先选择你的使用环境: \033[0m"
|
||||
echo -e "\033[0m(你之后依然可以在设置中更改各种配置)\033[0m"
|
||||
|
@ -1395,7 +1409,7 @@ userguide(){
|
|||
#设置开机启动
|
||||
[ -f /etc/rc.common ] && /etc/init.d/clash enable
|
||||
ckcmd systemctl && systemctl enable clash.service > /dev/null 2>&1
|
||||
rm -rf $clashdir/.dis_startup
|
||||
rm -rf $CRASHDIR/.dis_startup
|
||||
autostart=enable
|
||||
#检测IP转发
|
||||
if [ "$(cat /proc/sys/net/ipv4/ip_forward)" = "0" ];then
|
||||
|
@ -1423,7 +1437,7 @@ userguide(){
|
|||
}
|
||||
forwhat
|
||||
#检测小内存模式
|
||||
dir_size=$(df $clashdir | awk '{print $4}' | sed 1d)
|
||||
dir_size=$(df $CRASHDIR | awk '{print $4}' | sed 1d)
|
||||
if [ "$dir_size" -lt 10240 ];then
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m检测到你的安装目录空间不足10M,是否开启小闪存模式?\033[0m"
|
||||
|
@ -1448,7 +1462,7 @@ userguide(){
|
|||
[ "$res" = 1 ] && checkupdate && getcrt
|
||||
fi
|
||||
#设置加密DNS
|
||||
$clashdir/start.sh webget $TMPDIR/ssl_test https://doh.pub echooff rediron
|
||||
$CRASHDIR/start.sh webget $TMPDIR/ssl_test https://doh.pub 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'
|
||||
|
@ -1489,6 +1503,8 @@ userguide(){
|
|||
setconfig authentication \'$authentication\'
|
||||
fi
|
||||
fi
|
||||
#启用推荐的自动任务配置
|
||||
source $CRASHDIR/task/task.sh && task_recom
|
||||
#小米设备软固化
|
||||
if [ "$systype" = "mi_snapshot" ];then
|
||||
echo -----------------------------------------------
|
||||
|
@ -1499,7 +1515,7 @@ userguide(){
|
|||
#提示导入订阅或者配置文件
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m是否导入配置文件?\033[0m(这是运行前的最后一步)"
|
||||
echo -e "\033[0m你必须拥有一份yaml格式的配置文件才能运行clash服务!\033[0m"
|
||||
echo -e "\033[0m你必须拥有一份yaml格式的配置文件才能运行服务!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "现在开始导入?(1/0) > " res
|
||||
[ "$res" = 1 ] && inuserguide=1 && clashlink && inuserguide=""
|
||||
|
@ -1507,7 +1523,7 @@ userguide(){
|
|||
echo -----------------------------------------------
|
||||
echo -e "\033[36m很好!现在只需要执行启动就可以愉快的使用了!\033[0m"
|
||||
echo -----------------------------------------------
|
||||
read -p "立即启动clash服务?(1/0) > " res
|
||||
read -p "立即启动服务?(1/0) > " res
|
||||
[ "$res" = 1 ] && clashstart && sleep 2
|
||||
clashsh
|
||||
}
|
||||
|
@ -1517,7 +1533,7 @@ testcommand(){
|
|||
echo -e "\033[30;47m这里是测试命令菜单\033[0m"
|
||||
echo -e "\033[33m如遇问题尽量运行相应命令后截图提交issue或TG讨论组\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo " 1 查看Clash运行时的报错信息(会停止clash服务)"
|
||||
echo " 1 查看Clash运行时的报错信息(会停止服务)"
|
||||
echo " 2 查看系统DNS端口(:53)占用 "
|
||||
echo " 3 测试ssl加密(aes-128-gcm)跑分"
|
||||
echo " 4 查看clash相关路由规则"
|
||||
|
@ -1532,11 +1548,11 @@ testcommand(){
|
|||
elif [ "$num" = 0 ]; then
|
||||
clashsh
|
||||
elif [ "$num" = 1 ]; then
|
||||
$clashdir/start.sh stop
|
||||
$CRASHDIR/start.sh stop
|
||||
echo -----------------------------------------------
|
||||
if $clashdir/clash -v &>/dev/null;then
|
||||
if $CRASHDIR/clash -v &>/dev/null;then
|
||||
clash -s modify_yaml &>/dev/null
|
||||
$clashdir/clash -t -d $clashdir -f $TMPDIR/config.yaml
|
||||
$CRASHDIR/clash -t -d $CRASHDIR -f $TMPDIR/config.yaml
|
||||
[ "$?" = 0 ] && testover=32m测试通过!|| testover=31m出现错误!请截图后到TG群询问!!!
|
||||
echo -e "\033[$testover\033[0m"
|
||||
else
|
||||
|
@ -1592,7 +1608,7 @@ testcommand(){
|
|||
exit;
|
||||
elif [ "$num" = 5 ]; then
|
||||
echo -----------------------------------------------
|
||||
sed -n '1,40p' $clashdir/config.yaml
|
||||
sed -n '1,40p' $CRASHDIR/config.yaml
|
||||
echo -----------------------------------------------
|
||||
exit;
|
||||
elif [ "$num" = 6 ]; then
|
||||
|
@ -1611,4 +1627,10 @@ testcommand(){
|
|||
errornum
|
||||
clashsh
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
*)
|
||||
$1
|
||||
;;
|
||||
esac
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
version=1.8.1
|
||||
version=1.8.2d
|
||||
|
||||
setdir(){
|
||||
dir_avail(){
|
||||
|
@ -76,7 +76,7 @@ if [ -n "$systype" ];then
|
|||
}
|
||||
[ "$systype" = "ng_snapshot" ] && dir=/tmp/mnt
|
||||
else
|
||||
echo -e "\033[33m安装ShellClash至少需要预留约1MB的磁盘空间\033[0m"
|
||||
echo -e "\033[33m安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m"
|
||||
echo -e " 1 在\033[32m/etc目录\033[0m下安装(适合root用户)"
|
||||
echo -e " 2 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)"
|
||||
echo -e " 3 在\033[32m当前用户目录\033[0m下安装(适合非root用户)"
|
||||
|
@ -119,16 +119,16 @@ if [ ! -w $dir ];then
|
|||
else
|
||||
echo -e "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail $dir -h)"
|
||||
read -p "确认安装?(1/0) > " res
|
||||
[ "$res" = "1" ] && clashdir=$dir/clash || setdir
|
||||
[ "$res" = "1" ] && CRASHDIR=$dir/clash || setdir
|
||||
fi
|
||||
}
|
||||
setconfig(){
|
||||
#参数1代表变量名,参数2代表变量值,参数3即文件路径
|
||||
[ -z "$3" ] && configpath=$clashdir/configs/ShellClash.cfg || configpath=$3
|
||||
[ -z "$3" ] && configpath=$CRASHDIR/configs/ShellCrash.cfg || configpath=$3
|
||||
[ -n "$(grep -E "^${1}=" $configpath)" ] && sed -i "s#^${1}=\(.*\)#${1}=${2}#g" $configpath || echo "${1}=${2}" >> $configpath
|
||||
}
|
||||
|
||||
$clashdir/start.sh stop 2>/dev/null #防止进程冲突
|
||||
$CRASHDIR/start.sh stop 2>/dev/null #防止进程冲突
|
||||
#特殊固件识别及标记
|
||||
[ -f "/etc/storage/started_script.sh" ] && {
|
||||
systype=Padavan #老毛子固件
|
||||
|
@ -143,30 +143,30 @@ $clashdir/start.sh stop 2>/dev/null #防止进程冲突
|
|||
[ -w "/var/mnt/cfg/firewall" ] && systype=ng_snapshot #NETGEAR设备
|
||||
|
||||
#检查环境变量
|
||||
[ -z "$clashdir" -a -d /tmp/SC_tmp ] && {
|
||||
[ -z "$CRASHDIR" -a -d /tmp/SC_tmp ] && {
|
||||
setdir
|
||||
}
|
||||
#移动文件
|
||||
mkdir -p $clashdir
|
||||
mv -f /tmp/SC_tmp/* $clashdir 2>/dev/null
|
||||
mkdir -p $CRASHDIR
|
||||
mv -f /tmp/SC_tmp/* $CRASHDIR 2>/dev/null
|
||||
|
||||
#初始化
|
||||
mkdir -p $clashdir/configs
|
||||
[ -f "$clashdir/configs/ShellClash.cfg" ] || echo '#ShellClash配置文件,不明勿动!' > $clashdir/configs/ShellClash.cfg
|
||||
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 ];then
|
||||
#设为init.d方式启动
|
||||
cp -f $clashdir/clashservice /etc/init.d/clash
|
||||
cp -f $CRASHDIR/clashservice /etc/init.d/clash
|
||||
chmod 755 /etc/init.d/clash
|
||||
else
|
||||
[ -w /etc/systemd/system ] && sysdir=/etc/systemd/system
|
||||
[ -w /usr/lib/systemd/system ] && sysdir=/usr/lib/systemd/system
|
||||
if [ -n "$sysdir" -a -z "$WSL_DISTRO_NAME" ];then #wsl环境不使用systemd
|
||||
#设为systemd方式启动
|
||||
mv -f $clashdir/clash.service $sysdir/clash.service 2>/dev/null
|
||||
sed -i "s%/etc/clash%$clashdir%g" $sysdir/clash.service
|
||||
mv -f $CRASHDIR/clash.service $sysdir/clash.service 2>/dev/null
|
||||
sed -i "s%/etc/clash%$CRASHDIR%g" $sysdir/clash.service
|
||||
systemctl daemon-reload
|
||||
else
|
||||
#设为保守模式启动
|
||||
|
@ -175,8 +175,9 @@ else
|
|||
fi
|
||||
#修饰文件及版本号
|
||||
type bash &>/dev/null && shtype=bash || shtype=sh
|
||||
sed -i "s|/bin/sh|/bin/$shtype|" $clashdir/start.sh
|
||||
chmod 755 $clashdir/start.sh
|
||||
sed -i "s|/bin/sh|/bin/$shtype|" $CRASHDIR/start.sh
|
||||
chmod 755 $CRASHDIR/start.sh
|
||||
chmod 755 $CRASHDIR/task.sh
|
||||
setconfig versionsh_l $version
|
||||
#设置更新地址
|
||||
[ -n "$url" ] && setconfig update_url $url
|
||||
|
@ -186,15 +187,15 @@ setconfig versionsh_l $version
|
|||
[ -w ~/.bashrc ] && profile=~/.bashrc
|
||||
[ -w /etc/profile ] && profile=/etc/profile
|
||||
if [ -n "$profile" ];then
|
||||
sed -i '/alias clash=*/'d $profile
|
||||
echo "alias clash=\"$shtype $clashdir/clash.sh\"" >> $profile #设置快捷命令环境变量
|
||||
sed -i '/export clashdir=*/'d $profile
|
||||
echo "export clashdir=\"$clashdir\"" >> $profile #设置clash路径环境变量
|
||||
sed -i '/alias crash=*/'d $profile
|
||||
echo "alias crash=\"$shtype $CRASHDIR/clash.sh\"" >> $profile #设置快捷命令环境变量
|
||||
sed -i '/export CRASHDIR=*/'d $profile
|
||||
echo "export CRASHDIR=\"$CRASHDIR\"" >> $profile #设置clash路径环境变量
|
||||
source $profile &>/dev/null || echo 运行错误!请使用bash而不是dash运行安装命令!!!
|
||||
#适配zsh环境变量
|
||||
[ -n "$(ls -l /bin/sh|grep -oE 'zsh')" ] && [ -z "$(cat ~/.zshrc 2>/dev/null|grep clashdir)" ] && {
|
||||
echo "alias clash=\"$shtype $clashdir/clash.sh\"" >> ~/.zshrc
|
||||
echo "export clashdir=\"$clashdir\"" >> ~/.zshrc
|
||||
[ -n "$(ls -l /bin/sh|grep -oE 'zsh')" ] && [ -z "$(cat ~/.zshrc 2>/dev/null|grep CRASHDIR)" ] && {
|
||||
echo "alias clash=\"$shtype $CRASHDIR/clash.sh\"" >> ~/.zshrc
|
||||
echo "export CRASHDIR=\"$CRASHDIR\"" >> ~/.zshrc
|
||||
source ~/.zshrc &>/dev/null
|
||||
}
|
||||
else
|
||||
|
@ -203,49 +204,59 @@ else
|
|||
fi
|
||||
#梅林/Padavan额外设置
|
||||
[ -n "$initdir" ] && {
|
||||
sed -i '/ShellClash初始化/'d $initdir
|
||||
sed -i '/ShellCrash初始化/'d $initdir
|
||||
touch $initdir
|
||||
echo "$clashdir/start.sh init #ShellClash初始化脚本" >> $initdir
|
||||
echo "$CRASHDIR/start.sh init #ShellCrash初始化脚本" >> $initdir
|
||||
chmod a+rx $initdir 2>/dev/null
|
||||
setconfig initdir $initdir
|
||||
}
|
||||
#镜像化OpenWrt(snapshot)额外设置
|
||||
if [ "$systype" = "mi_snapshot" -o "$systype" = "ng_snapshot" ];then
|
||||
chmod 755 $clashdir/misnap_init.sh
|
||||
uci set firewall.ShellClash=include
|
||||
uci set firewall.ShellClash.type='script'
|
||||
uci set firewall.ShellClash.path="$clashdir/misnap_init.sh"
|
||||
uci set firewall.ShellClash.enabled='1'
|
||||
chmod 755 $CRASHDIR/misnap_init.sh
|
||||
uci set firewall.ShellCrash=include
|
||||
uci set firewall.ShellCrash.type='script'
|
||||
uci set firewall.ShellCrash.path="$CRASHDIR/misnap_init.sh"
|
||||
uci set firewall.ShellCrash.enabled='1'
|
||||
uci commit firewall
|
||||
setconfig systype $systype
|
||||
else
|
||||
rm -rf $clashdir/misnap_init.sh
|
||||
rm -rf $CRASHDIR/misnap_init.sh
|
||||
fi
|
||||
#华硕USB启动额外设置
|
||||
[ "$usb_status" = "1" ] && {
|
||||
echo "$clashdir/start.sh init #ShellClash初始化脚本" > $clashdir/asus_usb_mount.sh
|
||||
nvram set script_usbmount="$clashdir/asus_usb_mount.sh"
|
||||
echo "$CRASHDIR/start.sh init #ShellCrash初始化脚本" > $CRASHDIR/asus_usb_mount.sh
|
||||
nvram set script_usbmount="$CRASHDIR/asus_usb_mount.sh"
|
||||
nvram commit
|
||||
}
|
||||
#删除临时文件
|
||||
rm -rf /tmp/*lash*gz
|
||||
rm -rf /tmp/SC_tmp
|
||||
#转换&清理旧版本文件
|
||||
mkdir -p $clashdir/yamls
|
||||
mkdir -p $clashdir/tools
|
||||
mkdir -p $CRASHDIR/yamls
|
||||
mkdir -p $CRASHDIR/tools
|
||||
mkdir -p $CRASHDIR/task
|
||||
for file in config.yaml.bak user.yaml proxies.yaml proxy-groups.yaml rules.yaml others.yaml ;do
|
||||
mv -f $clashdir/$file $clashdir/yamls/$file 2>/dev/null
|
||||
mv -f $CRASHDIR/$file $CRASHDIR/yamls/$file 2>/dev/null
|
||||
done
|
||||
[ ! -L $clashdir/config.yaml ] && mv -f $clashdir/config.yaml $clashdir/yamls/config.yaml 2>/dev/null
|
||||
[ ! -L $CRASHDIR/config.yaml ] && mv -f $CRASHDIR/config.yaml $CRASHDIR/yamls/config.yaml 2>/dev/null
|
||||
for file in fake_ip_filter mac web_save servers.list fake_ip_filter.list fallback_filter.list;do
|
||||
mv -f $clashdir/$file $clashdir/configs/$file 2>/dev/null
|
||||
mv -f $CRASHDIR/$file $CRASHDIR/configs/$file 2>/dev/null
|
||||
done
|
||||
mv -f $clashdir/mark $clashdir/configs/ShellClash.cfg 2>/dev/null
|
||||
for file in cron dropbear_rsa_host_key authorized_keys tun.ko ShellDDNS.sh;do
|
||||
mv -f $clashdir/$file $clashdir/tools/$file 2>/dev/null
|
||||
#配置文件改名
|
||||
mv -f $CRASHDIR/mark $CRASHDIR/configs/ShellCrash.cfg 2>/dev/null
|
||||
mv -f $CRASHDIR/configs/ShellClash.cfg $CRASHDIR/configs/ShellCrash.cfg 2>/dev/null
|
||||
for file in dropbear_rsa_host_key authorized_keys tun.ko ShellDDNS.sh;do
|
||||
mv -f $CRASHDIR/$file $CRASHDIR/tools/$file 2>/dev/null
|
||||
done
|
||||
for file in cron task.sh task.list;do
|
||||
mv -f $CRASHDIR/$file $CRASHDIR/task/$file 2>/dev/null
|
||||
done
|
||||
for file in log clash.service mark? mark.bak;do
|
||||
rm -rf $clashdir/$file
|
||||
rm -rf $CRASHDIR/$file
|
||||
done
|
||||
#旧版任务清理
|
||||
$CRASHDIR/start.sh cronset "clash服务"
|
||||
$CRASHDIR/start.sh cronset "订阅链接"
|
||||
$CRASHDIR/start.sh cronset "ShellCrash初始化"
|
||||
sleep 1
|
||||
echo -e "\033[32m脚本初始化完成,请输入\033[30;47m clash \033[0;33m命令开始使用!\033[0m"
|
||||
echo -e "\033[32m脚本初始化完成,请输入\033[30;47m crash \033[0;33m命令开始使用!\033[0m"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
clashdir="$(uci get firewall.ShellClash.path | sed 's/\/misnap_init.sh//')"
|
||||
CRASHDIR="$(uci get firewall.ShellClash.path | sed 's/\/misnap_init.sh//')"
|
||||
profile=/etc/profile
|
||||
|
||||
autoSSH(){
|
||||
|
@ -13,7 +13,7 @@ autoSSH(){
|
|||
[ -z "$(pidof dropbear)" -o -z "$(netstat -ntul | grep :22)" ] && {
|
||||
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear
|
||||
/etc/init.d/dropbear restart
|
||||
mi_autoSSH_pwd=$(grep 'mi_autoSSH_pwd=' $clashdir/mark | awk -F "=" '{print $2}')
|
||||
mi_autoSSH_pwd=$(grep 'mi_autoSSH_pwd=' $CRASHDIR/configs/ShellCrash.cfg | awk -F "=" '{print $2}')
|
||||
[ -n "$mi_autoSSH_pwd" ] && echo -e "$mi_autoSSH_pwd\n$mi_autoSSH_pwd" | passwd root
|
||||
}
|
||||
#配置nvram
|
||||
|
@ -21,8 +21,8 @@ autoSSH(){
|
|||
[ "$(nvram get telnet_en)" = 0 ] && nvram set telnet_en=1
|
||||
nvram commit &> /dev/null
|
||||
#备份还原SSH秘钥
|
||||
[ -f $clashdir/configs/dropbear_rsa_host_key ] && ln -sf $clashdir/configs/dropbear_rsa_host_key /etc/dropbear/dropbear_rsa_host_key
|
||||
[ -f $clashdir/configs/authorized_keys ] && ln -sf $clashdir/configs/authorized_keys /etc/dropbear/authorized_keys
|
||||
[ -f $CRASHDIR/configs/dropbear_rsa_host_key ] && ln -sf $CRASHDIR/configs/dropbear_rsa_host_key /etc/dropbear/dropbear_rsa_host_key
|
||||
[ -f $CRASHDIR/configs/authorized_keys ] && ln -sf $CRASHDIR/configs/authorized_keys /etc/dropbear/authorized_keys
|
||||
#自动清理升级备份文件夹
|
||||
rm -rf /data/etc_bak
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ tunfix(){
|
|||
mkdir -p /tmp/overlay/work
|
||||
mount -o noatime,lowerdir=${ko_dir},upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work -t overlay "overlay_mods_only" ${ko_dir}
|
||||
#将tun.ko链接到lib
|
||||
ln -sf $clashdir/tools/tun.ko ${ko_dir}/tun.ko
|
||||
ln -sf $CRASHDIR/tools/tun.ko ${ko_dir}/tun.ko
|
||||
}
|
||||
tproxyfix(){
|
||||
sed -i 's/sysctl -w net.bridge.bridge-nf-call-ip/#sysctl -w net.bridge.bridge-nf-call-ip/g' /etc/init.d/qca-nss-ecm
|
||||
|
@ -51,20 +51,20 @@ init(){
|
|||
done
|
||||
#初始化环境变量
|
||||
sed -i "/alias clash/d" $profile
|
||||
sed -i "/export clashdir/d" $profile
|
||||
echo "alias clash=\"$clashdir/clash.sh\"" >>$profile
|
||||
echo "export clashdir=\"$clashdir\"" >>$profile
|
||||
sed -i "/export CRASHDIR/d" $profile
|
||||
echo "alias clash=\"$CRASHDIR/clash.sh\"" >>$profile
|
||||
echo "export CRASHDIR=\"$CRASHDIR\"" >>$profile
|
||||
#软固化功能
|
||||
autoSSH
|
||||
#设置init.d服务
|
||||
cp -f $clashdir/clashservice /etc/init.d/clash
|
||||
cp -f $CRASHDIR/clashservice /etc/init.d/clash
|
||||
chmod 755 /etc/init.d/clash
|
||||
#启动服务
|
||||
if [ ! -f $clashdir/.dis_startup ]; then
|
||||
if [ ! -f $CRASHDIR/.dis_startup ]; then
|
||||
#AX6S/AX6000修复tun功能
|
||||
[ -f $clashdir/configs/tun.ko ] && tunfix
|
||||
[ -f $CRASHDIR/configs/tun.ko ] && tunfix
|
||||
#小米7000/小米万兆修复tproxy
|
||||
[ -f /etc/init.d/qca-nss-ecm ] && [ -n "$(grep 'redir_mod=Tproxy' $clashdir/configs/ShellClash.cfg )" ] && tproxyfix
|
||||
[ -f /etc/init.d/qca-nss-ecm ] && [ -n "$(grep 'redir_mod=Tproxy' $CRASHDIR/configs/ShellClash.cfg )" ] && tproxyfix
|
||||
#启动服务
|
||||
/etc/init.d/clash start
|
||||
/etc/init.d/clash enable
|
||||
|
|
298
scripts/start.sh
298
scripts/start.sh
|
@ -2,18 +2,18 @@
|
|||
# Copyright (C) Juewuy
|
||||
|
||||
#初始化目录
|
||||
[ -d "/etc/storage/clash" ] && clashdir=/etc/storage/clash
|
||||
[ -d "/jffs/clash" ] && clashdir=/jffs/clash
|
||||
[ -z "$clashdir" ] && clashdir=$(cat /etc/profile | grep clashdir | awk -F "\"" '{print $2}')
|
||||
[ -z "$clashdir" ] && clashdir=$(cat ~/.bashrc | grep clashdir | awk -F "\"" '{print $2}')
|
||||
CFG_PATH=$clashdir/configs/ShellClash.cfg
|
||||
TMPDIR=/tmp/ShellClash && [ ! -f $TMPDIR ] && mkdir -p $TMPDIR
|
||||
[ -d "/etc/storage/clash" ] && CRASHDIR=/etc/storage/clash
|
||||
[ -d "/jffs/clash" ] && CRASHDIR=/jffs/clash
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$(cat /etc/profile | grep CRASHDIR | awk -F "\"" '{print $2}')
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$(cat ~/.bashrc | grep CRASHDIR | awk -F "\"" '{print $2}')
|
||||
CFG_PATH=$CRASHDIR/configs/ShellCrash.cfg
|
||||
TMPDIR=/tmp/ShellCrash && [ ! -f $TMPDIR ] && mkdir -p $TMPDIR
|
||||
#脚本内部工具
|
||||
getconfig(){
|
||||
#加载配置文件
|
||||
source $CFG_PATH &> /dev/null
|
||||
#默认设置
|
||||
[ -z "$bindir" ] && bindir=$clashdir
|
||||
[ -z "$bindir" ] && bindir=$CRASHDIR
|
||||
[ -z "$redir_mod" ] && [ "$USER" = "root" -o "$USER" = "admin" ] && redir_mod=Redir模式
|
||||
[ -z "$redir_mod" ] && redir_mod=纯净模式
|
||||
[ -z "$skip_cert" ] && skip_cert=已开启
|
||||
|
@ -34,7 +34,7 @@ getconfig(){
|
|||
[ -z "$multiport" ] && multiport='22,53,80,123,143,194,443,465,587,853,993,995,5222,8080,8443'
|
||||
[ "$common_ports" = "已开启" ] && ports="-m multiport --dports $multiport"
|
||||
#yaml
|
||||
[ -z "$yaml" ] && yaml=$clashdir/yamls/config.yaml
|
||||
[ -z "$yaml" ] && yaml=$CRASHDIR/yamls/config.yaml
|
||||
}
|
||||
setconfig(){
|
||||
#参数1代表变量名,参数2代表变量值,参数3即文件路径
|
||||
|
@ -55,15 +55,15 @@ compare(){
|
|||
}
|
||||
logger(){
|
||||
#$1日志内容$2显示颜色$3是否推送
|
||||
[ -n "$2" ] && echo -e "\033[$2m$1\033[0m"
|
||||
[ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m"
|
||||
log_text="$(date "+%G-%m-%d_%H:%M:%S")~$1"
|
||||
echo $log_text >> $TMPDIR/ShellClash_log
|
||||
[ "$(wc -l $TMPDIR/ShellClash_log | awk '{print $1}')" -gt 99 ] && sed -i '1,5d' $TMPDIR/ShellClash_log
|
||||
echo $log_text >> $TMPDIR/ShellCrash.log
|
||||
[ "$(wc -l $TMPDIR/ShellCrash.log | awk '{print $1}')" -gt 99 ] && sed -i '1,5d' $TMPDIR/ShellCrash.log
|
||||
[ -z "$3" ] && {
|
||||
getconfig
|
||||
[ -n "$device_name" ] && log_text="$log_text($device_name)"
|
||||
[ -n "$(pidof clash)" ] && {
|
||||
[ -n "$authentication" ] && auth="$authentication@"
|
||||
[ -n "$authentication" ] && auth="$authentication@"
|
||||
export https_proxy="http://${auth}127.0.0.1:$mix_port"
|
||||
}
|
||||
[ -n "$push_TG" ] && {
|
||||
|
@ -143,7 +143,7 @@ getlanip(){
|
|||
while [ "$i" -le "10" ];do
|
||||
host_ipv4=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'br' | grep -Ev 'iot' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/br.*$//g' | sed 's/metric.*$//g' ) #ipv4局域网网段
|
||||
[ "$ipv6_redir" = "已开启" ] && host_ipv6=$(ip a 2>&1 | grep -w 'inet6' | grep -E 'global' | sed 's/.*inet6.//g' | sed 's/scope.*$//g' ) #ipv6公网地址段
|
||||
[ -f $TMPDIR/ShellClash_log ] && break
|
||||
[ -f $TMPDIR/ShellCrash.log ] && break
|
||||
[ -n "$host_ipv4" -a -n "$host_ipv6" ] && break
|
||||
sleep 2 && i=$((i+1))
|
||||
done
|
||||
|
@ -163,10 +163,10 @@ getlanip(){
|
|||
getyaml(){
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] && server_link=1
|
||||
Server=$(grep -aE '^3|^4' $clashdir/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
[ -n "$(echo $Url | grep -oE 'vless:|hysteria:')" ] && Server=$(grep -aE '^4' $clashdir/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
[ "$retry" = 4 ] && Server=$(grep -aE '^497' $clashdir/configs/servers.list | awk '{print $3}')
|
||||
Config=$(grep -aE '^5' $clashdir/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $3}')
|
||||
Server=$(grep -aE '^3|^4' $CRASHDIR/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
[ -n "$(echo $Url | grep -oE 'vless:|hysteria:')" ] && Server=$(grep -aE '^4' $CRASHDIR/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
[ "$retry" = 4 ] && Server=$(grep -aE '^497' $CRASHDIR/configs/servers.list | awk '{print $3}')
|
||||
Config=$(grep -aE '^5' $CRASHDIR/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $3}')
|
||||
#如果传来的是Url链接则合成Https链接,否则直接使用Https链接
|
||||
if [ -z "$Https" ];then
|
||||
Https="$Server/sub?target=clash&insert=true&new_name=true&scv=true&udp=true&exclude=$exclude&include=$include&url=$Url&config=$Config"
|
||||
|
@ -191,7 +191,7 @@ getyaml(){
|
|||
else
|
||||
if [ "$retry" = 4 ];then
|
||||
logger "无法获取配置文件,请检查链接格式以及网络连接状态!" 31
|
||||
echo -e "\033[32m你也可以尝试使用浏览器下载配置文件后,使用WinSCP手动上传到$TMPDIR目录!\033[0m"
|
||||
echo -e "\033[32m也可用浏览器下载以上链接后,使用WinSCP手动上传到/tmp目录后执行clash命令!\033[0m"
|
||||
exit 1
|
||||
elif [ "$retry" = 3 ];then
|
||||
retry=4
|
||||
|
@ -257,7 +257,7 @@ getyaml(){
|
|||
if [ "$?" != "0" ];then
|
||||
logger "配置文件加载失败!请查看报错信息!" 31
|
||||
$bindir/clash -t -d $bindir -f $yamlnew
|
||||
echo "$($bindir/clash -t -d $bindir -f $yamlnew)" >> $TMPDIR/ShellClash_log
|
||||
echo "$($bindir/clash -t -d $bindir -f $yamlnew)" >> $TMPDIR/ShellCrash.log
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
@ -280,19 +280,19 @@ modify_yaml(){
|
|||
[ "$ipv6_dns" = "已开启" ] && dns_v6='true' || dns_v6='false'
|
||||
external="external-controller: 0.0.0.0:$db_port"
|
||||
if [ "$redir_mod" = "混合模式" -o "$redir_mod" = "Tun模式" ];then
|
||||
[ "$clashcore" = 'clash.meta' ] && tun_meta=', device: utun, auto-route: false'
|
||||
[ "$clashcore" = 'meta' ] && tun_meta=', device: utun, auto-route: false'
|
||||
tun="tun: {enable: true, stack: system$tun_meta}"
|
||||
else
|
||||
tun='tun: {enable: false}'
|
||||
fi
|
||||
exper='experimental: {ignore-resolve-fail: true, interface-name: en0}'
|
||||
#Meta内核专属配置
|
||||
[ "$clashcore" = 'clash.meta' ] && {
|
||||
[ "$clashcore" = 'meta' ] && {
|
||||
[ "$redir_mod" != "纯净模式" ] && find_process='find-process-mode: "off"'
|
||||
}
|
||||
#dns配置
|
||||
[ -z "$(cat $clashdir/yamls/user.yaml 2>/dev/null | grep '^dns:')" ] && {
|
||||
[ "$clashcore" = 'clash.meta' ] && dns_default_meta='- https://223.5.5.5/dns-query'
|
||||
[ -z "$(cat $CRASHDIR/yamls/user.yaml 2>/dev/null | grep '^dns:')" ] && {
|
||||
[ "$clashcore" = 'meta' ] && dns_default_meta='- https://223.5.5.5/dns-query'
|
||||
cat > $TMPDIR/dns.yaml <<EOF
|
||||
dns:
|
||||
enable: true
|
||||
|
@ -308,7 +308,7 @@ dns:
|
|||
fake-ip-filter:
|
||||
EOF
|
||||
if [ "$dns_mod" = "fake-ip" ];then
|
||||
cat $clashdir/configs/fake_ip_filter $clashdir/configs/fake_ip_filter.list 2>/dev/null | grep '\.' | sed "s/^/ - '/" | sed "s/$/'/" >> $TMPDIR/dns.yaml
|
||||
cat $CRASHDIR/configs/fake_ip_filter $CRASHDIR/configs/fake_ip_filter.list 2>/dev/null | grep '\.' | sed "s/^/ - '/" | sed "s/$/'/" >> $TMPDIR/dns.yaml
|
||||
else
|
||||
echo " - '+.*'" >> $TMPDIR/dns.yaml
|
||||
fi
|
||||
|
@ -318,13 +318,13 @@ EOF
|
|||
fallback-filter:
|
||||
geoip: true
|
||||
EOF
|
||||
[ -s $clashdir/configs/fallback_filter.list ] && {
|
||||
[ -s $CRASHDIR/configs/fallback_filter.list ] && {
|
||||
echo " domain:" >> $TMPDIR/dns.yaml
|
||||
cat $clashdir/configs/fallback_filter.list | grep '\.' | sed "s/^/ - '/" | sed "s/$/'/" >> $TMPDIR/dns.yaml
|
||||
cat $CRASHDIR/configs/fallback_filter.list | grep '\.' | sed "s/^/ - '/" | sed "s/$/'/" >> $TMPDIR/dns.yaml
|
||||
}
|
||||
}
|
||||
#域名嗅探配置
|
||||
[ "$sniffer" = "已启用" ] && [ "$clashcore" = "clash.meta" ] && sniffer_set="sniffer: {enable: true, skip-domain: [Mijia Cloud], sniff: {tls: {ports: [443, 8443]}, http: {ports: [80, 8080-8880]}}}"
|
||||
[ "$sniffer" = "已启用" ] && [ "$clashcore" = "meta" ] && sniffer_set="sniffer: {enable: true, skip-domain: [Mijia Cloud], sniff: {tls: {ports: [443, 8443]}, http: {ports: [80, 8080-8880]}}}"
|
||||
[ "$clashcore" = "clashpre" ] && [ "$dns_mod" = "redir_host" ] && exper="experimental: {ignore-resolve-fail: true, interface-name: en0, sniff-tls-sni: true}"
|
||||
#生成set.yaml
|
||||
cat > $TMPDIR/set.yaml <<EOF
|
||||
|
@ -346,7 +346,7 @@ store-selected: $restore
|
|||
$find_process
|
||||
EOF
|
||||
#读取本机hosts并生成配置文件
|
||||
if [ "$hosts_opt" != "未启用" ] && [ -z "$(grep -aE '^hosts:' $clashdir/yamls/user.yaml 2>/dev/null)" ];then
|
||||
if [ "$hosts_opt" != "未启用" ] && [ -z "$(grep -aE '^hosts:' $CRASHDIR/yamls/user.yaml 2>/dev/null)" ];then
|
||||
#NTP劫持
|
||||
cat >> $TMPDIR/hosts.yaml <<EOF
|
||||
hosts:
|
||||
|
@ -376,16 +376,16 @@ EOF
|
|||
#插入自定义策略组
|
||||
sed -i "/#自定义策略组开始/,/#自定义策略组结束/d" $TMPDIR/proxy-groups.yaml
|
||||
sed -i "/#自定义策略组/d" $TMPDIR/proxy-groups.yaml
|
||||
[ -n "$(grep -Ev '^#' $clashdir/yamls/proxy-groups.yaml 2>/dev/null)" ] && {
|
||||
[ -n "$(grep -Ev '^#' $CRASHDIR/yamls/proxy-groups.yaml 2>/dev/null)" ] && {
|
||||
#获取空格数
|
||||
space_name=$(grep -aE '^ *- name: ' $TMPDIR/proxy-groups.yaml | head -n 1 | grep -oE '^ *')
|
||||
space_proxy=$(grep -A 1 'proxies:$' $TMPDIR/proxy-groups.yaml | grep -aE '^ *- ' | head -n 1 | grep -oE '^ *')
|
||||
#合并自定义策略组到proxy-groups.yaml
|
||||
cat $clashdir/yamls/proxy-groups.yaml | sed "/^#/d" | sed "s/#.*//g" | sed '1i\ #自定义策略组开始' | sed '$a\ #自定义策略组结束' | sed "s/^ */${space_name} /g" | sed "s/^ *- /${space_proxy}- /g" | sed "s/^ *- name: /${space_name}- name: /g" > $TMPDIR/proxy-groups_add.yaml
|
||||
cat $CRASHDIR/yamls/proxy-groups.yaml | sed "/^#/d" | sed "s/#.*//g" | sed '1i\ #自定义策略组开始' | sed '$a\ #自定义策略组结束' | sed "s/^ */${space_name} /g" | sed "s/^ *- /${space_proxy}- /g" | sed "s/^ *- name: /${space_name}- name: /g" > $TMPDIR/proxy-groups_add.yaml
|
||||
cat $TMPDIR/proxy-groups.yaml >> $TMPDIR/proxy-groups_add.yaml
|
||||
mv -f $TMPDIR/proxy-groups_add.yaml $TMPDIR/proxy-groups.yaml
|
||||
oldIFS="$IFS"
|
||||
grep "\- name: " $clashdir/yamls/proxy-groups.yaml | sed "/^#/d" | while read line;do #将自定义策略组插入现有的proxy-group
|
||||
grep "\- name: " $CRASHDIR/yamls/proxy-groups.yaml | sed "/^#/d" | while read line;do #将自定义策略组插入现有的proxy-group
|
||||
new_group=$(echo $line | grep -Eo '^ *- name:.*#' | cut -d'#' -f1 | sed 's/.*name: //g')
|
||||
proxy_groups=$(echo $line | grep -Eo '#.*' | sed "s/#//" )
|
||||
IFS="#"
|
||||
|
@ -404,11 +404,11 @@ EOF
|
|||
#插入自定义代理
|
||||
sed -i "/#自定义代理/d" $TMPDIR/proxies.yaml
|
||||
sed -i "/#自定义代理/d" $TMPDIR/proxy-groups.yaml
|
||||
[ -n "$(grep -Ev '^#' $clashdir/yamls/proxies.yaml 2>/dev/null)" ] && {
|
||||
[ -n "$(grep -Ev '^#' $CRASHDIR/yamls/proxies.yaml 2>/dev/null)" ] && {
|
||||
space_proxy=$(cat $TMPDIR/proxies.yaml | grep -aE '^ *- ' | head -n 1 | grep -oE '^ *') #获取空格数
|
||||
cat $clashdir/yamls/proxies.yaml | sed "s/^ *- /${space_proxy}- /g" | sed "/^#/d" | sed "/^ *$/d" | sed 's/#.*/ #自定义代理/g' >> $TMPDIR/proxies.yaml #插入节点
|
||||
cat $CRASHDIR/yamls/proxies.yaml | sed "s/^ *- /${space_proxy}- /g" | sed "/^#/d" | sed "/^ *$/d" | sed 's/#.*/ #自定义代理/g' >> $TMPDIR/proxies.yaml #插入节点
|
||||
oldIFS="$IFS"
|
||||
cat $clashdir/yamls/proxies.yaml | sed "/^#/d" | while read line;do #将节点插入proxy-group
|
||||
cat $CRASHDIR/yamls/proxies.yaml | sed "/^#/d" | while read line;do #将节点插入proxy-group
|
||||
proxy_name=$(echo $line | grep -Eo 'name: .+, ' | cut -d',' -f1 | sed 's/name: //g')
|
||||
proxy_groups=$(echo $line | grep -Eo '#.*' | sed "s/#//" )
|
||||
IFS="#"
|
||||
|
@ -427,23 +427,23 @@ EOF
|
|||
#节点绕过功能支持
|
||||
sed -i "/#节点绕过/d" $TMPDIR/rules.yaml
|
||||
[ "$proxies_bypass" = "已启用" ] && {
|
||||
cat $TMPDIR/proxies.yaml | sed '/^proxy-/,$d' | sed '/^rule-/,$d' | grep -v '^\s*#' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '!a[$0]++' | sed 's/^/\ -\ IP-CIDR,/g' | sed 's|$|/32,DIRECT #节点绕过|g' >> $TMPDIR/proxies_bypass
|
||||
cat $TMPDIR/proxies.yaml | sed '/^proxy-/,$d' | sed '/^rule-/,$d' | grep -v '^\s*#' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '!a[$0]++' | sed 's/^/\ -\ IP-CIDR,/g' | sed 's|$|/32,DIRECT,no-resolve #节点绕过|g' >> $TMPDIR/proxies_bypass
|
||||
cat $TMPDIR/proxies.yaml | sed '/^proxy-/,$d' | sed '/^rule-/,$d' | grep -v '^\s*#' | grep -vE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -oE '[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?'| awk '!a[$0]++' | sed 's/^/\ -\ DOMAIN,/g' | sed 's/$/,DIRECT #节点绕过/g' >> $TMPDIR/proxies_bypass
|
||||
cat $TMPDIR/rules.yaml >> $TMPDIR/proxies_bypass
|
||||
mv -f $TMPDIR/proxies_bypass $TMPDIR/rules.yaml
|
||||
}
|
||||
#插入自定义规则
|
||||
sed -i "/#自定义规则/d" $TMPDIR/rules.yaml
|
||||
[ -f $clashdir/yamls/rules.yaml ] && {
|
||||
cat $clashdir/yamls/rules.yaml | sed "/^#/d" | sed '$a\' | sed 's/$/ #自定义规则/g' > $TMPDIR/rules.add
|
||||
[ -f $CRASHDIR/yamls/rules.yaml ] && {
|
||||
cat $CRASHDIR/yamls/rules.yaml | sed "/^#/d" | sed '$a\' | sed 's/$/ #自定义规则/g' > $TMPDIR/rules.add
|
||||
cat $TMPDIR/rules.yaml >> $TMPDIR/rules.add
|
||||
mv -f $TMPDIR/rules.add $TMPDIR/rules.yaml
|
||||
}
|
||||
#对齐rules中的空格
|
||||
sed -i 's/^ *-/ -/g' $TMPDIR/rules.yaml
|
||||
#合并文件
|
||||
[ -s $clashdir/yamls/user.yaml ] && {
|
||||
yaml_user=$clashdir/yamls/user.yaml
|
||||
[ -s $CRASHDIR/yamls/user.yaml ] && {
|
||||
yaml_user=$CRASHDIR/yamls/user.yaml
|
||||
#set和user去重,且优先使用user.yaml
|
||||
cp -f $TMPDIR/set.yaml $TMPDIR/set_bak.yaml
|
||||
for char in mode allow-lan log-level tun experimental interface-name dns store-selected;do
|
||||
|
@ -452,7 +452,7 @@ EOF
|
|||
}
|
||||
[ -s $TMPDIR/dns.yaml ] && yaml_dns=$TMPDIR/dns.yaml
|
||||
[ -s $TMPDIR/hosts.yaml ] && yaml_hosts=$TMPDIR/hosts.yaml
|
||||
[ -s $clashdir/yamls/others.yaml ] && yaml_others=$clashdir/yamls/others.yaml
|
||||
[ -s $CRASHDIR/yamls/others.yaml ] && yaml_others=$CRASHDIR/yamls/others.yaml
|
||||
yaml_add=
|
||||
for char in $yaml_char;do #将额外配置文件合并
|
||||
[ -s $TMPDIR/${char}.yaml ] && {
|
||||
|
@ -485,8 +485,8 @@ EOF
|
|||
#设置路由规则
|
||||
cn_ip_route(){
|
||||
[ ! -f $bindir/cn_ip.txt ] && {
|
||||
if [ -f $clashdir/cn_ip.txt ];then
|
||||
mv $clashdir/cn_ip.txt $bindir/cn_ip.txt
|
||||
if [ -f $CRASHDIR/cn_ip.txt ];then
|
||||
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"
|
||||
|
@ -504,8 +504,8 @@ cn_ip_route(){
|
|||
}
|
||||
cn_ipv6_route(){
|
||||
[ ! -f $bindir/cn_ipv6.txt ] && {
|
||||
if [ -f $clashdir/cn_ipv6.txt ];then
|
||||
mv $clashdir/cn_ipv6.txt $bindir/cn_ipv6.txt
|
||||
if [ -f $CRASHDIR/cn_ipv6.txt ];then
|
||||
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"
|
||||
|
@ -534,12 +534,12 @@ start_redir(){
|
|||
[ "$dns_mod" = "redir_host" -a "$cn_ip_route" = "已开启" ] && \
|
||||
iptables -t nat -A clash -m set --match-set cn_ip dst -j RETURN 2>/dev/null
|
||||
#局域网设备过滤
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac白名单
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac白名单
|
||||
iptables -t nat -A clash -p tcp -m mac --mac-source $mac -j REDIRECT --to-ports $redir_port
|
||||
done
|
||||
else
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac黑名单
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac黑名单
|
||||
iptables -t nat -A clash -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
#仅代理本机局域网网段流量
|
||||
|
@ -560,12 +560,12 @@ start_redir(){
|
|||
[ "$dns_mod" = "redir_host" -a "$cn_ipv6_route" = "已开启" ] && \
|
||||
ip6tables -t nat -A clashv6 -m set --match-set cn_ip6 dst -j RETURN 2>/dev/null
|
||||
#局域网设备过滤
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac白名单
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac白名单
|
||||
ip6tables -t nat -A clashv6 -p tcp -m mac --mac-source $mac -j REDIRECT --to-ports $redir_port
|
||||
done
|
||||
else
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac黑名单
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac黑名单
|
||||
ip6tables -t nat -A clashv6 -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
#仅代理本机局域网网段流量
|
||||
|
@ -585,33 +585,37 @@ start_ipt_dns(){
|
|||
}
|
||||
#设置dns转发
|
||||
iptables -t nat -N clash_dns
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac白名单
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac白名单
|
||||
iptables -t nat -A clash_dns -p udp -m mac --mac-source $mac -j REDIRECT --to $dns_port
|
||||
done
|
||||
else
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac黑名单
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac黑名单
|
||||
iptables -t nat -A clash_dns -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
iptables -t nat -A clash_dns -p tcp -j REDIRECT --to $dns_port
|
||||
iptables -t nat -A clash_dns -p udp -j REDIRECT --to $dns_port
|
||||
fi
|
||||
iptables -t nat -I PREROUTING -p tcp --dport 53 -j clash_dns
|
||||
iptables -t nat -I PREROUTING -p udp --dport 53 -j clash_dns
|
||||
#ipv6DNS
|
||||
if [ -n "$(lsmod | grep 'ip6table_nat')" -a -n "$(lsmod | grep 'xt_nat')" ];then
|
||||
ip6tables -t nat -N clashv6_dns > /dev/null 2>&1
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac白名单
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac白名单
|
||||
ip6tables -t nat -A clashv6_dns -p udp -m mac --mac-source $mac -j REDIRECT --to $dns_port
|
||||
done
|
||||
else
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac黑名单
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac黑名单
|
||||
ip6tables -t nat -A clashv6_dns -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
ip6tables -t nat -A clashv6_dns -p tcp -j REDIRECT --to $dns_port
|
||||
ip6tables -t nat -A clashv6_dns -p udp -j REDIRECT --to $dns_port
|
||||
fi
|
||||
ip6tables -t nat -I PREROUTING -p tcp --dport 53 -j clashv6_dns
|
||||
ip6tables -t nat -I PREROUTING -p udp --dport 53 -j clashv6_dns
|
||||
else
|
||||
ip6tables -I INPUT -p udp --dport 53 -m comment --comment "ShellClash-IPV6_DNS-REJECT" -j REJECT 2>/dev/null
|
||||
ip6tables -I INPUT -p udp --dport 53 -m comment --comment "ShellCrash-IPV6_DNS-REJECT" -j REJECT 2>/dev/null
|
||||
fi
|
||||
return 0
|
||||
|
||||
|
@ -632,12 +636,12 @@ start_tproxy(){
|
|||
iptables -t mangle -A clash -m set --match-set cn_ip dst -j RETURN 2>/dev/null
|
||||
#tcp&udp分别进代理链
|
||||
tproxy_set(){
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac白名单
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac白名单
|
||||
iptables -t mangle -A clash -p $1 -m mac --mac-source $mac -j TPROXY --on-port $tproxy_port --tproxy-mark $fwmark
|
||||
done
|
||||
else
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac黑名单
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac黑名单
|
||||
iptables -t mangle -A clash -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
#仅代理本机局域网网段流量
|
||||
|
@ -654,7 +658,7 @@ start_tproxy(){
|
|||
#屏蔽QUIC
|
||||
[ "$quic_rj" = 已启用 ] && {
|
||||
[ "$dns_mod" = "redir_host" -a "$cn_ip_route" = "已开启" ] && set_cn_ip='-m set ! --match-set cn_ip dst'
|
||||
iptables -I INPUT -p udp --dport 443 -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip -j REJECT >/dev/null 2>&1
|
||||
iptables -I INPUT -p udp --dport 443 -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip -j REJECT >/dev/null 2>&1
|
||||
}
|
||||
#设置ipv6转发
|
||||
[ "$ipv6_redir" = "已开启" ] && {
|
||||
|
@ -670,14 +674,14 @@ start_tproxy(){
|
|||
ip6tables -t mangle -A clashv6 -m set --match-set cn_ip6 dst -j RETURN 2>/dev/null
|
||||
#tcp&udp分别进代理链
|
||||
tproxy_set6(){
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
#mac白名单
|
||||
for mac in $(cat $clashdir/configs/mac); do
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do
|
||||
ip6tables -t mangle -A clashv6 -p $1 -m mac --mac-source $mac -j TPROXY --on-port $tproxy_port --tproxy-mark $fwmark
|
||||
done
|
||||
else
|
||||
#mac黑名单
|
||||
for mac in $(cat $clashdir/configs/mac); do
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do
|
||||
ip6tables -t mangle -A clashv6 -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
#仅代理本机局域网网段流量
|
||||
|
@ -693,7 +697,7 @@ start_tproxy(){
|
|||
#屏蔽QUIC
|
||||
[ "$quic_rj" = 已启用 ] && {
|
||||
[ "$dns_mod" = "redir_host" -a "$cn_ipv6_route" = "已开启" ] && set_cn_ip6='-m set ! --match-set cn_ip6 dst'
|
||||
ip6tables -I INPUT -p udp --dport 443 -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip6 -j REJECT 2>/dev/null
|
||||
ip6tables -I INPUT -p udp --dport 443 -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip6 -j REJECT 2>/dev/null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -745,8 +749,8 @@ start_tun(){
|
|||
set_cn_ip='-m set ! --match-set cn_ip dst'
|
||||
set_cn_ip6='-m set ! --match-set cn_ip6 dst'
|
||||
}
|
||||
iptables -I FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip -j REJECT >/dev/null 2>&1
|
||||
ip6tables -I FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip6 -j REJECT >/dev/null 2>&1
|
||||
iptables -I FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip -j REJECT >/dev/null 2>&1
|
||||
ip6tables -I FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip6 -j REJECT >/dev/null 2>&1
|
||||
fi
|
||||
modprobe xt_mark &>/dev/null && {
|
||||
i=1
|
||||
|
@ -769,12 +773,12 @@ start_tun(){
|
|||
[ "$dns_mod" = "redir_host" -a "$cn_ip_route" = "已开启" ] && \
|
||||
iptables -t mangle -A clash -m set --match-set cn_ip dst -j RETURN 2>/dev/null
|
||||
#局域网设备过滤
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac白名单
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac白名单
|
||||
iptables -t mangle -A clash -m mac --mac-source $mac -j MARK --set-mark $fwmark
|
||||
done
|
||||
else
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac黑名单
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac黑名单
|
||||
iptables -t mangle -A clash -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
#仅代理本机局域网网段流量
|
||||
|
@ -786,7 +790,7 @@ start_tun(){
|
|||
[ "$1" = "all" ] && iptables -t mangle -A PREROUTING -p tcp $ports -j clash
|
||||
|
||||
#设置ipv6转发
|
||||
[ "$ipv6_redir" = "已开启" -a "$clashcore" = "clash.meta" ] && {
|
||||
[ "$ipv6_redir" = "已开启" -a "$clashcore" = "meta" ] && {
|
||||
ip -6 route add default dev utun table 101
|
||||
ip -6 rule add fwmark $fwmark table 101
|
||||
ip6tables -t mangle -N clashv6
|
||||
|
@ -798,12 +802,12 @@ start_tun(){
|
|||
[ "$dns_mod" = "redir_host" -a "$cn_ipv6_route" = "已开启" ] && \
|
||||
ip6tables -t mangle -A clashv6 -m set --match-set cn_ip6 dst -j RETURN 2>/dev/null
|
||||
#局域网设备过滤
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $clashdir/configs/mac)" ];then
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac白名单
|
||||
if [ "$macfilter_type" = "白名单" -a -n "$(cat $CRASHDIR/configs/mac)" ];then
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac白名单
|
||||
ip6tables -t mangle -A clashv6 -m mac --mac-source $mac -j MARK --set-mark $fwmark
|
||||
done
|
||||
else
|
||||
for mac in $(cat $clashdir/configs/mac); do #mac黑名单
|
||||
for mac in $(cat $CRASHDIR/configs/mac); do #mac黑名单
|
||||
ip6tables -t mangle -A clashv6 -m mac --mac-source $mac -j RETURN
|
||||
done
|
||||
#仅代理本机局域网网段流量
|
||||
|
@ -833,8 +837,8 @@ start_nft(){
|
|||
}
|
||||
[ -n "$(echo $redir_mod|grep Nft)" ] && {
|
||||
#过滤局域网设备
|
||||
[ -n "$(cat $clashdir/configs/mac)" ] && {
|
||||
MAC=$(awk '{printf "%s, ",$1}' $clashdir/configs/mac)
|
||||
[ -n "$(cat $CRASHDIR/configs/mac)" ] && {
|
||||
MAC=$(awk '{printf "%s, ",$1}' $CRASHDIR/configs/mac)
|
||||
[ "$macfilter_type" = "黑名单" ] && \
|
||||
nft add rule inet shellclash prerouting ether saddr {$MAC} return || \
|
||||
nft add rule inet shellclash prerouting ether saddr != {$MAC} return
|
||||
|
@ -877,13 +881,13 @@ start_nft(){
|
|||
nft add chain inet shellclash input { type filter hook input priority 0 \; }
|
||||
[ -n "$CN_IP" ] && nft add rule inet shellclash input ip daddr {$CN_IP} return
|
||||
[ -n "$CN_IP6" ] && nft add rule inet shellclash input ip6 daddr {$CN_IP6} return
|
||||
nft add rule inet shellclash input udp dport 443 reject comment 'ShellClash-QUIC-REJECT'
|
||||
nft add rule inet shellclash input udp dport 443 reject comment 'ShellCrash-QUIC-REJECT'
|
||||
}
|
||||
#代理本机(仅TCP)
|
||||
[ "$local_proxy" = "已开启" ] && [ "$local_type" = "nftables增强模式" ] && {
|
||||
#dns
|
||||
nft add chain inet shellclash dns_out { type nat hook output priority -100 \; }
|
||||
nft add rule inet shellclash dns_out meta skgid {453,7890} return && \
|
||||
nft add rule inet shellclash dns_out meta skgid { 453, 7890 } return && \
|
||||
nft add rule inet shellclash dns_out udp dport 53 redirect to $dns_port
|
||||
#output
|
||||
nft add chain inet shellclash output { type nat hook output priority -100 \; }
|
||||
|
@ -905,8 +909,8 @@ start_nft(){
|
|||
start_nft_dns(){
|
||||
nft add chain inet shellclash dns { type nat hook prerouting priority -100 \; }
|
||||
#过滤局域网设备
|
||||
[ -n "$(cat $clashdir/configs/mac)" ] && {
|
||||
MAC=$(awk '{printf "%s, ",$1}' $clashdir/configs/mac)
|
||||
[ -n "$(cat $CRASHDIR/configs/mac)" ] && {
|
||||
MAC=$(awk '{printf "%s, ",$1}' $CRASHDIR/configs/mac)
|
||||
[ "$macfilter_type" = "黑名单" ] && \
|
||||
nft add rule inet shellclash dns ether saddr {$MAC} return || \
|
||||
nft add rule inet shellclash dns ether saddr != {$MAC} return
|
||||
|
@ -952,6 +956,7 @@ stop_firewall(){
|
|||
iptables -t nat -F clash 2> /dev/null
|
||||
iptables -t nat -X clash 2> /dev/null
|
||||
#dns
|
||||
iptables -t nat -D PREROUTING -p tcp --dport 53 -j clash_dns 2> /dev/null
|
||||
iptables -t nat -D PREROUTING -p udp --dport 53 -j clash_dns 2> /dev/null
|
||||
iptables -t nat -F clash_dns 2> /dev/null
|
||||
iptables -t nat -X clash_dns 2> /dev/null
|
||||
|
@ -960,8 +965,8 @@ stop_firewall(){
|
|||
iptables -D FORWARD -s 198.18.0.0/16 -o utun -j RETURN 2> /dev/null
|
||||
#屏蔽QUIC
|
||||
[ "$dns_mod" = "redir_host" -a "$cn_ip_route" = "已开启" ] && set_cn_ip='-m set ! --match-set cn_ip dst'
|
||||
iptables -D INPUT -p udp --dport 443 -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip -j REJECT 2> /dev/null
|
||||
iptables -D FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip -j REJECT 2> /dev/null
|
||||
iptables -D INPUT -p udp --dport 443 -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip -j REJECT 2> /dev/null
|
||||
iptables -D FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip -j REJECT 2> /dev/null
|
||||
#本机代理
|
||||
iptables -t nat -D OUTPUT -p tcp $ports -j clash_out 2> /dev/null
|
||||
iptables -t nat -F clash_out 2> /dev/null
|
||||
|
@ -996,20 +1001,21 @@ stop_firewall(){
|
|||
ckcmd ip6tables && {
|
||||
#redir
|
||||
ip6tables -t nat -D PREROUTING -p tcp $ports -j clashv6 2> /dev/null
|
||||
ip6tables -D INPUT -p udp --dport 53 -m comment --comment "ShellClash-IPV6_DNS-REJECT" -j REJECT 2> /dev/null
|
||||
ip6tables -D INPUT -p udp --dport 53 -m comment --comment "ShellCrash-IPV6_DNS-REJECT" -j REJECT 2> /dev/null
|
||||
ip6tables -t nat -F clashv6 2> /dev/null
|
||||
ip6tables -t nat -X clashv6 2> /dev/null
|
||||
#dns
|
||||
ip6tables -t nat -D PREROUTING -p tcp --dport 53 -j clashv6_dns 2>/dev/null
|
||||
ip6tables -t nat -D PREROUTING -p udp --dport 53 -j clashv6_dns 2>/dev/null
|
||||
ip6tables -t nat -F clashv6_dns 2> /dev/null
|
||||
ip6tables -t nat -X clashv6_dns 2> /dev/null
|
||||
#tun
|
||||
ip6tables -D FORWARD -o utun -j ACCEPT 2> /dev/null
|
||||
ip6tables -D FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellClash-QUIC-REJECT" -j REJECT >/dev/null 2>&1
|
||||
ip6tables -D FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellCrash-QUIC-REJECT" -j REJECT >/dev/null 2>&1
|
||||
#屏蔽QUIC
|
||||
[ "$dns_mod" = "redir_host" -a "$cn_ipv6_route" = "已开启" ] && set_cn_ip6='-m set ! --match-set cn_ip6 dst'
|
||||
iptables -D INPUT -p udp --dport 443 -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip6 -j REJECT 2> /dev/null
|
||||
iptables -D FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip6 -j REJECT 2> /dev/null
|
||||
iptables -D INPUT -p udp --dport 443 -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip6 -j REJECT 2> /dev/null
|
||||
iptables -D FORWARD -p udp --dport 443 -o utun -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip6 -j REJECT 2> /dev/null
|
||||
#公网访问
|
||||
ip6tables -D INPUT -p tcp --dport $mix_port -j REJECT 2> /dev/null
|
||||
ip6tables -D INPUT -p tcp --dport $mix_port -j ACCEPT 2> /dev/null
|
||||
|
@ -1020,7 +1026,7 @@ stop_firewall(){
|
|||
ip6tables -t mangle -D PREROUTING -p udp $ports -j clashv6 2> /dev/null
|
||||
ip6tables -t mangle -F clashv6 2> /dev/null
|
||||
ip6tables -t mangle -X clashv6 2> /dev/null
|
||||
ip6tables -D INPUT -p udp --dport 443 -m comment --comment "ShellClash-QUIC-REJECT" $set_cn_ip -j REJECT 2> /dev/null
|
||||
ip6tables -D INPUT -p udp --dport 443 -m comment --comment "ShellCrash-QUIC-REJECT" $set_cn_ip -j REJECT 2> /dev/null
|
||||
}
|
||||
#清理ipset规则
|
||||
ipset destroy cn_ip >/dev/null 2>&1
|
||||
|
@ -1042,6 +1048,8 @@ stop_firewall(){
|
|||
nft flush table inet shellclash >/dev/null 2>&1
|
||||
nft delete table inet shellclash >/dev/null 2>&1
|
||||
}
|
||||
#还原防火墙文件
|
||||
[ -s /etc/init.d/firewall.bak ] && mv -f /etc/init.d/firewall.bak /etc/init.d/firewall
|
||||
}
|
||||
#面板配置保存相关
|
||||
web_save(){
|
||||
|
@ -1055,10 +1063,10 @@ web_save(){
|
|||
rm -rf $TMPDIR/clash_web_check_$USER
|
||||
#对比文件,如果有变动且不为空则写入磁盘,否则清除缓存
|
||||
if [ -s $TMPDIR/clash_web_save_$USER ];then
|
||||
compare $TMPDIR/clash_web_save_$USER $clashdir/configs/web_save
|
||||
[ "$?" = 0 ] && rm -rf $TMPDIR/clash_web_save_$USER || mv -f $TMPDIR/clash_web_save_$USER $clashdir/configs/web_save
|
||||
compare $TMPDIR/clash_web_save_$USER $CRASHDIR/configs/web_save
|
||||
[ "$?" = 0 ] && rm -rf $TMPDIR/clash_web_save_$USER || mv -f $TMPDIR/clash_web_save_$USER $CRASHDIR/configs/web_save
|
||||
else
|
||||
echo > $clashdir/configs/web_save
|
||||
echo > $CRASHDIR/configs/web_save
|
||||
fi
|
||||
}
|
||||
web_restore(){
|
||||
|
@ -1075,11 +1083,11 @@ web_restore(){
|
|||
i=$((i+1))
|
||||
done
|
||||
#发送数据
|
||||
num=$(cat $clashdir/configs/web_save | wc -l)
|
||||
num=$(cat $CRASHDIR/configs/web_save | wc -l)
|
||||
i=1
|
||||
while [ "$i" -le "$num" ];do
|
||||
group_name=$(awk -F ',' 'NR=="'${i}'" {print $1}' $clashdir/configs/web_save | sed 's/ /%20/g')
|
||||
now_name=$(awk -F ',' 'NR=="'${i}'" {print $2}' $clashdir/configs/web_save)
|
||||
group_name=$(awk -F ',' 'NR=="'${i}'" {print $1}' $CRASHDIR/configs/web_save | sed 's/ /%20/g')
|
||||
now_name=$(awk -F ',' 'NR=="'${i}'" {print $2}' $CRASHDIR/configs/web_save)
|
||||
put_save http://127.0.0.1:${db_port}/proxies/${group_name} "{\"name\":\"${now_name}\"}"
|
||||
i=$((i+1))
|
||||
done
|
||||
|
@ -1116,7 +1124,7 @@ bfstart(){
|
|||
#读取配置文件
|
||||
getconfig
|
||||
[ ! -d $bindir/ui ] && mkdir -p $bindir/ui
|
||||
[ -z "$update_url" ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellClash@master
|
||||
[ -z "$update_url" ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master
|
||||
#检查yaml配置文件
|
||||
if [ ! -f $yaml ];then
|
||||
if [ -n "$Url" -o -n "$Https" ];then
|
||||
|
@ -1129,35 +1137,35 @@ bfstart(){
|
|||
fi
|
||||
fi
|
||||
#检测vless/hysteria协议
|
||||
if [ -n "$(cat $yaml | grep -oE 'type: vless|type: hysteria')" ] && [ "$clashcore" != "clash.meta" ];then
|
||||
if [ -n "$(cat $yaml | grep -oE 'type: vless|type: hysteria')" ] && [ "$clashcore" != "meta" ];then
|
||||
echo -----------------------------------------------
|
||||
logger "检测到vless/hysteria协议!将改为使用clash.meta核心启动!" 33
|
||||
logger "检测到vless/hysteria协议!将改为使用meta核心启动!" 33
|
||||
rm -rf $bindir/clash
|
||||
clashcore=clash.meta
|
||||
setconfig clashcore clash.meta
|
||||
clashcore=meta
|
||||
setconfig clashcore meta
|
||||
echo -----------------------------------------------
|
||||
fi
|
||||
#检测是否存在高级版规则
|
||||
if [ "$clashcore" = "clash" -a -n "$(cat $yaml | grep -aE '^script:|proxy-providers|rule-providers|rule-set')" ];then
|
||||
echo -----------------------------------------------
|
||||
logger "检测到高级规则!将改为使用clash.meta核心启动!" 33
|
||||
logger "检测到高级规则!将改为使用meta核心启动!" 33
|
||||
rm -rf $bindir/clash
|
||||
clashcore=clash.meta
|
||||
setconfig clashcore clash.meta
|
||||
clashcore=meta
|
||||
setconfig clashcore meta
|
||||
echo -----------------------------------------------
|
||||
fi
|
||||
#检查clash核心
|
||||
if [ ! -f $bindir/clash ];then
|
||||
if [ -f $clashdir/clash ];then
|
||||
mv $clashdir/clash $bindir/clash
|
||||
if [ -f $CRASHDIR/clash ];then
|
||||
mv $CRASHDIR/clash $bindir/clash
|
||||
else
|
||||
logger "未找到clash核心,正在下载!" 33
|
||||
if [ -z "$clashcore" ];then
|
||||
[ "$redir_mod" = "混合模式" -o "$redir_mod" = "Tun模式" ] && clashcore=clashpre || clashcore=clash
|
||||
fi
|
||||
[ -z "$cpucore" ] && source $clashdir/getdate.sh && getcpucore
|
||||
[ -z "$cpucore" ] && source $CRASHDIR/getdate.sh && getcpucore
|
||||
[ -z "$cpucore" ] && logger 找不到设备的CPU信息,请手动指定处理器架构类型! 31 && setcpucore
|
||||
[ "$update_url" = "https://jwsc.eu.org:8888" ] && [ "$clashcore" != 'clash' ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellClash@master
|
||||
[ "$update_url" = "https://jwsc.eu.org:8888" ] && [ "$clashcore" != 'clash' ] && update_url=https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master
|
||||
$0 webget $bindir/clash "$update_url/bin/$clashcore/clash-linux-$cpucore"
|
||||
#校验内核
|
||||
chmod +x $bindir/clash 2>/dev/null
|
||||
|
@ -1175,8 +1183,8 @@ bfstart(){
|
|||
[ ! -x $bindir/clash ] && chmod +x $bindir/clash #检测可执行权限
|
||||
#检查数据库文件
|
||||
if [ ! -f $bindir/Country.mmdb ];then
|
||||
if [ -f $clashdir/Country.mmdb ];then
|
||||
mv $clashdir/Country.mmdb $bindir/Country.mmdb
|
||||
if [ -f $CRASHDIR/Country.mmdb ];then
|
||||
mv $CRASHDIR/Country.mmdb $bindir/Country.mmdb
|
||||
else
|
||||
logger "未找到GeoIP数据库,正在下载!" 33
|
||||
$0 webget $bindir/Country.mmdb $update_url/bin/geodata/cn_mini.mmdb
|
||||
|
@ -1186,8 +1194,8 @@ bfstart(){
|
|||
fi
|
||||
fi
|
||||
#检查dashboard文件
|
||||
if [ -f $clashdir/ui/index.html -a ! -f $bindir/ui/index.html ];then
|
||||
cp -rf $clashdir/ui $bindir
|
||||
if [ -f $CRASHDIR/ui/index.html -a ! -f $bindir/ui/index.html ];then
|
||||
cp -rf $CRASHDIR/ui $bindir
|
||||
fi
|
||||
#检查curl或wget支持
|
||||
curl --version > /dev/null 2>&1
|
||||
|
@ -1196,10 +1204,10 @@ bfstart(){
|
|||
#生成pac文件
|
||||
catpac
|
||||
#预下载GeoSite数据库
|
||||
if [ "$clashcore" = "clash.meta" ] && [ ! -f $bindir/GeoSite.dat ] && [ -n "$(cat $yaml|grep -Ei 'geosite')" ];then
|
||||
[ -f $clashdir/geosite.dat ] && mv -f $clashdir/geosite.dat $clashdir/GeoSite.dat
|
||||
if [ -f $clashdir/GeoSite.dat ];then
|
||||
mv -f $clashdir/GeoSite.dat $bindir/GeoSite.dat
|
||||
if [ "$clashcore" = "meta" ] && [ ! -f $bindir/GeoSite.dat ] && [ -n "$(cat $yaml|grep -Ei 'geosite')" ];then
|
||||
[ -f $CRASHDIR/geosite.dat ] && mv -f $CRASHDIR/geosite.dat $CRASHDIR/GeoSite.dat
|
||||
if [ -f $CRASHDIR/GeoSite.dat ];then
|
||||
mv -f $CRASHDIR/GeoSite.dat $bindir/GeoSite.dat
|
||||
else
|
||||
logger "未找到geosite数据库,正在下载!" 33
|
||||
$0 webget $bindir/GeoSite.dat $update_url/bin/geodata/geosite.dat
|
||||
|
@ -1232,6 +1240,8 @@ bfstart(){
|
|||
fi
|
||||
#生成配置文件
|
||||
[ "$disoverride" != "1" ] && modify_yaml || ln -sf $yaml $bindir/config.yaml
|
||||
#执行条件任务
|
||||
[ -s $CRASHDIR/task/bfstart ] && source $CRASHDIR/task/bfstart
|
||||
}
|
||||
afstart(){
|
||||
|
||||
|
@ -1281,18 +1291,20 @@ afstart(){
|
|||
[ "$local_type" = "iptables增强模式" ] && start_output
|
||||
[ "$local_type" = "nftables增强模式" ] && [ "$redir_mod" = "纯净模式" ] && start_nft
|
||||
}
|
||||
ckcmd iptables && start_wan
|
||||
#标记启动时间
|
||||
mark_time
|
||||
#加载定时任务
|
||||
[ -f $clashdir/tools/cron ] && croncmd $clashdir/tools/cron
|
||||
#启用面板配置自动保存
|
||||
cronset '#每10分钟保存节点配置' "*/10 * * * * test -n \"\$(pidof clash)\" && $clashdir/start.sh web_save #每10分钟保存节点配置"
|
||||
[ -f $clashdir/configs/web_save ] && web_restore & #后台还原面板配置
|
||||
#推送日志
|
||||
{ sleep 5;logger Clash服务已启动!;} &
|
||||
#同步本机时间
|
||||
{ ckcmd ntpd && ntpd -n -q -p 203.107.6.88 &>/dev/null;exit 0 ;} &
|
||||
ckcmd iptables && start_wan #本地防火墙
|
||||
mark_time #标记启动时间
|
||||
[ -s $CRASHDIR/task/cron ] && croncmd $CRASHDIR/task/cron #加载定时任务
|
||||
[ -s $CRASHDIR/configs/web_save ] && web_restore & #后台还原面板配置
|
||||
{ sleep 5;logger Clash服务已启动!;} & #推送日志
|
||||
#执行条件任务
|
||||
[ -s $CRASHDIR/task/afstart ] && { source $CRASHDIR/task/afstart ;} &
|
||||
[ -s $CRASHDIR/task/affirewall -a -s /etc/init.d/firewall -a ! -f /etc/init.d/firewall.bak ] && {
|
||||
#注入防火墙
|
||||
line=$(grep -En "fw3 restart" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i.bak "${line}a\\source $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
line=$(grep -En "fw3 .* start" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i "${line}a\\source $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
}
|
||||
else
|
||||
logger "Clash服务启动失败!请查看报错信息!" 33
|
||||
logger "$($bindir/clash -t -d $bindir | grep -Eo 'error.*=.*')" 31
|
||||
|
@ -1301,6 +1313,7 @@ afstart(){
|
|||
fi
|
||||
}
|
||||
start_old(){
|
||||
bfstart
|
||||
#使用传统后台执行二进制文件的方式执行
|
||||
if [ "$local_proxy" = "已开启" -a -n "$(echo $local_type | grep '增强模式')" ];then
|
||||
ckcmd su && su=su
|
||||
|
@ -1324,10 +1337,8 @@ afstart)
|
|||
start)
|
||||
[ -n "$(pidof clash)" ] && $0 stop #禁止多实例
|
||||
getconfig
|
||||
#检测必须文件并下载
|
||||
bfstart
|
||||
stop_firewall #清理路由策略
|
||||
#使用不同方式启动clash服务
|
||||
#使用不同方式启动服务
|
||||
if [ "$start_old" = "已开启" ];then
|
||||
start_old
|
||||
elif [ -f /etc/rc.common ];then
|
||||
|
@ -1344,7 +1355,7 @@ stop)
|
|||
[ -n "$(pidof clash)" ] && web_save #保存面板配置
|
||||
#删除守护进程&面板配置自动保存
|
||||
cronset "clash保守模式守护进程"
|
||||
cronset "保存节点配置"
|
||||
cronset "保存面板配置"
|
||||
cronset "流媒体预解析"
|
||||
#多种方式结束进程
|
||||
if [ -f /etc/rc.common ];then
|
||||
|
@ -1361,10 +1372,10 @@ restart)
|
|||
$0 start
|
||||
;;
|
||||
init)
|
||||
clashdir=$(cd $(dirname $0);pwd)
|
||||
CRASHDIR=$(cd $(dirname $0);pwd)
|
||||
profile=/etc/profile
|
||||
if [ -d "/etc/storage/clash" ];then
|
||||
clashdir=/etc/storage/clash
|
||||
CRASHDIR=/etc/storage/clash
|
||||
i=1
|
||||
while [ ! -w /etc/profile -a "$i" -lt 10 ];do
|
||||
sleep 5 && i=$((i+1))
|
||||
|
@ -1380,25 +1391,28 @@ init)
|
|||
fi
|
||||
fi
|
||||
sed -i "/alias clash/d" $profile
|
||||
sed -i "/export clashdir/d" $profile
|
||||
echo "alias clash=\"$clashdir/clash.sh\"" >> $profile
|
||||
echo "export clashdir=\"$clashdir\"" >> $profile
|
||||
[ -f $clashdir/.dis_startup ] && cronset "clash保守模式守护进程" || $0 start
|
||||
sed -i "/export CRASHDIR/d" $profile
|
||||
echo "alias clash=\"$CRASHDIR/clash.sh\"" >> $profile
|
||||
echo "export CRASHDIR=\"$CRASHDIR\"" >> $profile
|
||||
[ -f $CRASHDIR/.dis_startup ] && cronset "clash保守模式守护进程" || $0 start
|
||||
;;
|
||||
getyaml)
|
||||
getconfig
|
||||
getyaml && \
|
||||
logger ShellClash配置文件更新成功!
|
||||
logger "任务:【更新订阅并重启服务】配置文件已更新!"
|
||||
;;
|
||||
updateyaml)
|
||||
getconfig
|
||||
getyaml && \
|
||||
modify_yaml && \
|
||||
put_save http://127.0.0.1:${db_port}/configs "{\"path\":\"${clashdir}/config.yaml\"}" && \
|
||||
logger ShellClash配置文件更新成功!
|
||||
put_save http://127.0.0.1:${db_port}/configs "{\"path\":\"${CRASHDIR}/config.yaml\"}" && \
|
||||
logger "任务:【热更新订阅】配置文件已更新!"
|
||||
;;
|
||||
ntp)
|
||||
{ ckcmd ntpd && ntpd -n -q -p 203.107.6.88 &>/dev/null;exit 0 ;} &
|
||||
;;
|
||||
logger)
|
||||
logger $2 $3
|
||||
logger $2 $3 $4
|
||||
;;
|
||||
webget)
|
||||
#设置临时代理
|
||||
|
@ -1406,9 +1420,9 @@ webget)
|
|||
getconfig
|
||||
[ -n "$authentication" ] && auth="$authentication@"
|
||||
export all_proxy="http://${auth}127.0.0.1:$mix_port"
|
||||
url=$(echo $3 | sed 's#https://fastly.jsdelivr.net/gh/juewuy/ShellClash[@|/]#https://raw.githubusercontent.com/juewuy/ShellClash/#' | sed 's#https://gh.jwsc.eu.org/#https://raw.githubusercontent.com/juewuy/ShellClash/#')
|
||||
url=$(echo $3 | sed 's#https://fastly.jsdelivr.net/gh/juewuy/ShellCrash[@|/]#https://raw.githubusercontent.com/juewuy/ShellCrash/#' | sed 's#https://gh.jwsc.eu.org/#https://raw.githubusercontent.com/juewuy/ShellCrash/#')
|
||||
else
|
||||
url=$(echo $3 | sed 's#https://raw.githubusercontent.com/juewuy/ShellClash/#https://fastly.jsdelivr.net/gh/juewuy/ShellClash@#')
|
||||
url=$(echo $3 | sed 's#https://raw.githubusercontent.com/juewuy/ShellCrash/#https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@#')
|
||||
fi
|
||||
#参数【$2】代表下载目录,【$3】代表在线地址
|
||||
#参数【$4】代表输出显示,【$4】不启用重定向
|
||||
|
@ -1451,7 +1465,7 @@ web_restore)
|
|||
;;
|
||||
daemon)
|
||||
getconfig
|
||||
cronset '#clash保守模式守护进程' "*/1 * * * * test -z \"\$(pidof clash)\" && $clashdir/start.sh restart #clash保守模式守护进程"
|
||||
cronset '#clash保守模式守护进程' "*/1 * * * * test -z \"\$(pidof clash)\" && $CRASHDIR/start.sh restart #clash保守模式守护进程"
|
||||
;;
|
||||
cronset)
|
||||
cronset $2 $3
|
||||
|
|
486
scripts/task.sh
Normal file
486
scripts/task.sh
Normal file
|
@ -0,0 +1,486 @@
|
|||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
#加载全局变量
|
||||
[ -d "/etc/storage/clash" ] && CRASHDIR=/etc/storage/clash
|
||||
[ -d "/jffs/clash" ] && CRASHDIR=/jffs/clash
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$(cat /etc/profile | grep CRASHDIR | awk -F "\"" '{print $2}')
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$(cat ~/.bashrc | grep CRASHDIR | awk -F "\"" '{print $2}')
|
||||
[ -z "$bindir" ] && bindir=$CRASHDIR
|
||||
CFG_PATH=$CRASHDIR/configs/ShellCrash.cfg
|
||||
TMPDIR=/tmp/ShellCrash && [ ! -f $TMPDIR ] && mkdir -p $TMPDIR
|
||||
source $CFG_PATH &> /dev/null
|
||||
setconfig(){
|
||||
#参数1代表变量名,参数2代表变量值,参数3即文件路径
|
||||
[ -z "$3" ] && configpath=$CFG_PATH || configpath=$3
|
||||
[ -n "$(grep ${1} $configpath)" ] && sed -i "s#${1}=.*#${1}=${2}#g" $configpath || echo "${1}=${2}" >> $configpath
|
||||
}
|
||||
|
||||
#任务命令
|
||||
check_update(){ #检查更新工具
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clashversion "$update_url/bin/version" echooff
|
||||
[ "$?" = "0" ] && source $TMPDIR/clashversion 2>/dev/null
|
||||
rm -rf $TMPDIR/clashversion
|
||||
}
|
||||
update_core(){ #自动更新内核
|
||||
#检查版本
|
||||
check_update
|
||||
clash_v_new=$(eval echo \$${clashcore}_v)
|
||||
clash_v_now=$($bindir/clash -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //')
|
||||
if [ -z "$clash_v_new" -o "$clash_v_new" = "clash_v_now" ];then
|
||||
logger "任务:【自动更新内核】中止-未检测到版本更新"
|
||||
exit 1
|
||||
else
|
||||
#更新内核
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clash.new "$update_url/bin/$clashcore/clash-linux-$cpucore"
|
||||
if [ "$?" != "0" ];then
|
||||
logger "任务:【自动更新内核】出错-下载失败!"
|
||||
rm -rf $TMPDIR/clash.new
|
||||
return 1
|
||||
else
|
||||
chmod +x $TMPDIR/clash.new
|
||||
$CRASHDIR/start.sh stop
|
||||
clashv=$($TMPDIR/clash.new -v 2>/dev/null | sed 's/ linux.*//;s/.* //')
|
||||
if [ -z "$clashv" ];then
|
||||
logger "任务:【自动更新内核】出错-下载失败!"
|
||||
rm -rf $TMPDIR/clash.new
|
||||
[ $clashcore = meta ] && $CRASHDIR/start.sh start
|
||||
return 1
|
||||
else
|
||||
mv -f $TMPDIR/clash.new $bindir/clash
|
||||
logger "任务:【自动更新内核】下载完成,正在重启服务!"
|
||||
$CRASHDIR/start.sh start
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
update_shellclash(){ #自动更新脚本
|
||||
#检查版本
|
||||
check_update
|
||||
if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ];then
|
||||
logger "任务:【自动更新脚本】中止-未检测到版本更新"
|
||||
exit 1
|
||||
else
|
||||
$CRASHDIR/start.sh webget $TMPDIR/clashfm.tar.gz "$update_url/bin/clashfm.tar.gz"
|
||||
if [ "$?" != "0" ];then
|
||||
rm -rf $TMPDIR/clashfm.tar.gz
|
||||
logger "任务:【自动更新内核】出错-下载失败!"
|
||||
return 1
|
||||
else
|
||||
#解压
|
||||
tar -zxvf "$TMPDIR/clashfm.tar.gz" -C $CRASHDIR/
|
||||
if [ $? -ne 0 ];then
|
||||
rm -rf $TMPDIR/clashfm.tar.gz
|
||||
logger "任务:【自动更新内核】出错-解压失败!"
|
||||
return 1
|
||||
else
|
||||
source $CRASHDIR/init.sh >/dev/null
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
update_mmdb(){ #自动更新数据库
|
||||
getgeo(){
|
||||
#检查版本
|
||||
check_update
|
||||
geo_v="$(echo $2 | awk -F "." '{print $1}')_v" #获取版本号类型比如Country_v
|
||||
geo_v_new=$GeoIP_v
|
||||
geo_v_now=$(eval echo \$$geo_v)
|
||||
if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ];then
|
||||
logger "任务:【自动更新数据库文件】跳过-未检测到$2版本更新"
|
||||
else
|
||||
#更新文件
|
||||
$CRASHDIR/start.sh webget $TMPDIR/$1 "$update_url/bin/geodata/$2"
|
||||
if [ "$?" != "0" ];then
|
||||
logger "任务:【自动更新数据库文件】更新【$2】下载失败!"
|
||||
rm -rf $TMPDIR/$1
|
||||
return 1
|
||||
else
|
||||
mv -f $TMPDIR/$1 $bindir/$1
|
||||
setconfig $geo_v $GeoIP_v
|
||||
logger "任务:【自动更新数据库文件】更新【$2】成功!"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
}
|
||||
[ -n "${Country_v}" ] && getgeo Country.mmdb Country.mmdb
|
||||
[ -n "${cn_mini_v}" ] && getgeo Country.mmdb cn_mini.mmdb
|
||||
[ -n "${china_ip_list_v}" ] && getgeo cn_ip.txt china_ip_list.txt
|
||||
[ -n "${china_ipv6_list_v}" ] && getgeo cn_ipv6.txt china_ipv6_list.txt
|
||||
[ -n "${geosite_v}" ] && getgeo GeoSite.dat geosite.dat
|
||||
}
|
||||
reset_firewall(){ #重设透明路由防火墙
|
||||
$CRASHDIR/start.sh stop_firewall
|
||||
$CRASHDIR/start.sh afstart
|
||||
}
|
||||
#任务工具
|
||||
|
||||
logger(){
|
||||
[ "$task_push" = 1 ] && push= || push=off
|
||||
[ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m"
|
||||
[ "$3" = 'off' ] && push=off
|
||||
$CRASHDIR/start.sh logger $1 0 $push
|
||||
}
|
||||
croncmd(){
|
||||
if [ -n "$(crontab -h 2>&1 | grep '\-l')" ];then
|
||||
crontab $1
|
||||
else
|
||||
crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}')"
|
||||
[ ! -w "$crondir" ] && crondir="/etc/storage/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron"
|
||||
[ ! -w "$crondir" ] && echo "你的设备不支持定时任务配置,脚本大量功能无法启用,请前往 https://t.me/ShellCrash 申请适配!"
|
||||
[ "$1" = "-l" ] && cat $crondir/$USER 2>/dev/null
|
||||
[ -f "$1" ] && cat $1 > $crondir/$USER
|
||||
fi
|
||||
}
|
||||
cronset(){
|
||||
# 参数1代表要移除的关键字,参数2代表要添加的任务语句
|
||||
tmpcron=$TMPDIR/cron_$USER
|
||||
croncmd -l > $tmpcron
|
||||
sed -i "/$1/d" $tmpcron
|
||||
sed -i '/^$/d' $tmpcron
|
||||
echo "$2" >> $tmpcron
|
||||
croncmd $tmpcron
|
||||
rm -f $tmpcron
|
||||
#华硕/Padavan固件存档在本地,其他则删除
|
||||
[ "$CRASHDIR" = "/jffs/clash" -o "$CRASHDIR" = "/etc/storage/clash" ] && mv -f $tmpcron $CRASHDIR/task/cron || rm -f $tmpcron
|
||||
echo -e "任务:【$1】\033[32m添加成功!\033[0m"
|
||||
}
|
||||
set_cron(){
|
||||
[ -z $week ] && week=*
|
||||
[ -z $hour ] && hour=*
|
||||
[ -z $min ] && min=0
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m$cron_time\033[0m执行任务:\033[36m$task_name\033[0m"
|
||||
read -p "是否确认添加定时任务?(1/0) > " res
|
||||
if [ "$res" = '1' ]; then
|
||||
task_txt="$min $hour * * $week $CRASHDIR/task/task.sh $task_id $cron_time$task_name"
|
||||
cronset "$cron_time$task_name" "$task_txt"
|
||||
fi
|
||||
unset week hour min
|
||||
sleep 1
|
||||
}
|
||||
set_service(){
|
||||
# 参数1代表要任务类型,参数2代表任务ID,参数3代表任务描述
|
||||
task_file=$CRASHDIR/task/$1
|
||||
[ -s $task_file ] && sed -i "/$3/d" $task_file
|
||||
echo "$CRASHDIR/task/task.sh $2 $3" >> $task_file
|
||||
echo -e "任务:【$3】\033[32m添加成功!\033[0m"
|
||||
sleep 1
|
||||
}
|
||||
#任务界面
|
||||
task_user_add(){ #自定义命令添加
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m命令可包含空格,请确保命令可执行!\033[0m"
|
||||
echo -e "也可以手动编辑\033[32m$CRASHDIR/task/task.user\033[0m添加"
|
||||
read -p "请输入命令语句 > " script
|
||||
if [ -n "$script" ];then
|
||||
task_command=$script
|
||||
echo -e "请检查输入:\033[32m$task_command\033[0m"
|
||||
#获取本任务ID
|
||||
task_max_id=$(awk -F'#' '{print $1}' $CRASHDIR/task/task.user | sort -n | tail -n 1)
|
||||
[ -z "$task_max_id" ] && task_max_id=200
|
||||
task_id=$((task_max_id + 1))
|
||||
read -p "请输入任务备注 > " txt
|
||||
[ -n "$txt" ] && task_name=$txt || task_name=自定义任务$task_id
|
||||
echo "$task_id#$task_command#$task_name" >> $CRASHDIR/task/task.user
|
||||
echo -e "\033[32m自定义任务已添加!\033[0m"
|
||||
sleep 1
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
}
|
||||
task_user_del(){ #自定义命令删除
|
||||
echo -----------------------------------------------
|
||||
echo -e "请输入对应ID移除对应自定义任务(不会影响内置任务)"
|
||||
echo -e "也可以手动编辑\033[32m$CRASHDIR/task/task.user\033[0m"
|
||||
echo -----------------------------------------------
|
||||
cat $CRASHDIR/task/task.user 2>/dev/null | grep -Ev '^#' | awk -F '#' '{print $1" "$3}'
|
||||
echo -----------------------------------------------
|
||||
echo 0 返回上级菜单
|
||||
echo -----------------------------------------------
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ -n "$num" ];then
|
||||
sed -i "/^$num#/d" $CRASHDIR/task/task.user 2>/dev/null
|
||||
[ "$num" != 0 ] && task_user_del
|
||||
else
|
||||
echo -e "\033[31m输入错误,请重新输入!\033[0m"
|
||||
sleep 1
|
||||
fi
|
||||
}
|
||||
task_add(){ #任务添加
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m请选择需要添加的任务\033[0m"
|
||||
echo -----------------------------------------------
|
||||
#检测并创建自定义任务文件
|
||||
[ -f $CRASHDIR/task/task.user ] || echo '#任务ID(必须>200并顺序排列)#任务命令#任务说明(#号隔开,任务命令和说明中都不允许包含#号)' > $CRASHDIR/task/task.user
|
||||
#输出任务列表
|
||||
cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print " "NR" "$3}'
|
||||
echo -----------------------------------------------
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
;;
|
||||
[1-9]|[1-9][0-9])
|
||||
if [ "$num" -le "$(cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | wc -l)" ];then
|
||||
task_id=$(cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
|
||||
task_name=$(cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
|
||||
task_type
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
task_del(){ #任务删除
|
||||
#删除定时任务
|
||||
croncmd -l > $TMPDIR/cron && sed -i "/$1/d" $TMPDIR/cron && croncmd $TMPDIR/cron
|
||||
sed -i "/$1/d" $CRASHDIR/task/cron 2>/dev/null
|
||||
rm -f $TMPDIR/cron
|
||||
#删除条件任务
|
||||
sed -i "/$1/d" $CRASHDIR/task/bfstart 2>/dev/null
|
||||
sed -i "/$1/d" $CRASHDIR/task/afstart 2>/dev/null
|
||||
sed -i "/$1/d" $CRASHDIR/task/affirewall 2>/dev/null
|
||||
}
|
||||
task_type(){ #任务条件选择菜单
|
||||
echo -----------------------------------------------
|
||||
echo -e "请选择任务\033[36m【$task_name】\033[0m执行条件:"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 定时任务\033[32m每周执行\033[0m"
|
||||
echo -e " 2 定时任务\033[32m每日执行\033[0m"
|
||||
echo -e " 3 定时任务\033[32m每小时执行\033[0m"
|
||||
echo -e " 4 定时任务\033[32m每分钟执行\033[0m"
|
||||
echo -e " 5 服务\033[33m启动前执行\033[0m"
|
||||
echo -e " 6 服务\033[33m启动后执行\033[0m"
|
||||
echo -e " 7 防火墙服务\033[33m重启后执行\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
|
||||
0)
|
||||
;;
|
||||
1)
|
||||
echo -----------------------------------------------
|
||||
echo -e " 输入 1~7 对应\033[33m每周的指定某天\033[0m运行"
|
||||
echo -e " 输入 1,3,6 代表\033[36m每周1,3,6\033[0m运行"
|
||||
echo -e " 输入 1-5 代表\033[36m周一至周五\033[0m运行"
|
||||
read -p "请在每周哪天执行? > " week
|
||||
echo -----------------------------------------------
|
||||
read -p "想在该日的具体哪个小时执行?(0-23) > " hour
|
||||
cron_time="在每周$week的$hour点整"
|
||||
set_cron
|
||||
;;
|
||||
2)
|
||||
echo -----------------------------------------------
|
||||
echo -e " 输入 1,7,15 代表\033[36m每到1,7,15点\033[0m运行"
|
||||
echo -e " 输入 6-18 代表\033[36m早6点至晚18点间每小时\033[0m运行"
|
||||
read -p "想在每日的具体哪个小时执行?(0-23) > " hour
|
||||
echo -----------------------------------------------
|
||||
read -p "想在具体哪分钟执行?(1-59的整数) > " min
|
||||
cron_time="在每日的$hour点$min分"
|
||||
set_cron
|
||||
;;
|
||||
3)
|
||||
echo -----------------------------------------------
|
||||
read -p "想每隔多少小时执行一次?(1-23的整数) > " num
|
||||
hour="*/$num"
|
||||
cron_time="每隔$num小时"
|
||||
set_cron
|
||||
;;
|
||||
4)
|
||||
echo -----------------------------------------------
|
||||
read -p "想每隔多少分钟执行一次?(1-59的整数) > " num
|
||||
min="*/$num"
|
||||
cron_time="每隔$num分钟"
|
||||
set_cron
|
||||
;;
|
||||
5)
|
||||
set_service bfstart "$task_id" "服务启动前$task_name"
|
||||
;;
|
||||
6)
|
||||
set_service afstart "$task_id" "服务启动后$task_name"
|
||||
;;
|
||||
7)
|
||||
echo -e "该功能会将相关启动代码注入到/etc/init.d/firewall中"
|
||||
read -p "是否继续?(1/0) > " res
|
||||
[ "$res" = 1 ] && set_service affirewall "$task_id" "防火墙重启后$task_name"
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
task_manager(){ #任务管理列表
|
||||
echo -----------------------------------------------
|
||||
#抽取并生成临时列表
|
||||
croncmd -l | grep -oE "$CRASHDIR/task/task.sh .*" | awk -F ' ' '{print $2" "$3}' > $TMPDIR/task_list
|
||||
cat $CRASHDIR/task/bfstart $CRASHDIR/task/afstart $CRASHDIR/task/affirewall 2>/dev/null | awk -F ' ' '{print $2" "$3}' >> $TMPDIR/task_list
|
||||
#判断为空则返回
|
||||
if [ ! -s $TMPDIR/task_list ];then
|
||||
echo -e "\033[31m当前没有可供管理的任务!\033[36m"
|
||||
sleep 1
|
||||
else
|
||||
echo -e "\033[33m已添加的任务:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
cat $TMPDIR/task_list | awk '{print " " NR " " $2}'
|
||||
echo -----------------------------------------------
|
||||
echo -e " d 清空任务列表"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
;;
|
||||
d)
|
||||
task_del "$CRASHDIR\/task\/task.sh"
|
||||
echo -e "\033[31m全部任务已清空!\033[36m"
|
||||
sleep 1
|
||||
;;
|
||||
[1-9]|[1-9][0-9])
|
||||
|
||||
task_txt=$(sed -n "$num p" $TMPDIR/task_list)
|
||||
task_id=$(echo $task_txt | awk '{print $1}')
|
||||
task_des=$(echo $task_txt | awk '{print $2}')
|
||||
task_name=$(cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $3}')
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前任务为:\033[36m $task_des\033[0m"
|
||||
echo -e " 1 \033[33m修改\033[0m当前任务"
|
||||
echo -e " 2 \033[31m删除\033[0m当前任务"
|
||||
echo -e " 3 \033[32m立即执行\033[0m一次"
|
||||
echo -e " 4 查看\033[33m执行记录\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请选择需要执行的操作 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
;;
|
||||
1)
|
||||
task_type && task_del $task_des
|
||||
;;
|
||||
2)
|
||||
task_del $task_des
|
||||
;;
|
||||
3)
|
||||
task_command=$(cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $2}')
|
||||
eval $task_command && task_res='执行成功!' || task_res='执行失败!'
|
||||
logger "任务:【$task_des】$task_res" 33 off
|
||||
sleep 1
|
||||
;;
|
||||
4)
|
||||
echo -----------------------------------------------
|
||||
if [ -n "$(cat $TMPDIR/ShellCrash.log | grep "$task_name")" ];then
|
||||
cat $TMPDIR/ShellCrash.log | grep "$task_name"
|
||||
else
|
||||
echo -e "\033[31m未找到相关执行记录!\033[0m"
|
||||
fi
|
||||
sleep 1
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
|
||||
task_manager
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
task_recom(){ #任务推荐
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m启用推荐的自动任务配置?这包括:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e "每隔10分钟自动保存面板配置"
|
||||
echo -e "服务启动后自动同步ntp时间"
|
||||
echo -e "在每周3的3点整更新订阅并重启服务"
|
||||
echo -----------------------------------------------
|
||||
read -p "是否启用?(1/0) > " res
|
||||
[ "$res" = 1 ] && {
|
||||
cronset "每隔10分钟自动保存面板配置" "*/10 * * * * $CRASHDIR/task/task.sh 106 每隔10分钟自动保存面板配置"
|
||||
cronset "在每周3的3点整更新订阅并重启服务" "0 3 * * 3 /data/clash/task/task.sh 104 在每周3的3点整更新订阅并重启服务"
|
||||
set_service afstart "107" "服务启动后自动同步ntp时间"
|
||||
}
|
||||
}
|
||||
task_menu(){ #任务菜单
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[30;47m欢迎使用自动任务功能:\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 添加\033[32m自动任务\033[0m"
|
||||
echo -e " 2 管理\033[33m任务列表\033[0m"
|
||||
echo -e " 3 查看\033[36m任务日志\033[0m"
|
||||
echo -e " 4 配置\033[36m日志推送\033[0m"
|
||||
echo -e " 5 添加\033[33m自定义任务\033[0m"
|
||||
echo -e " 6 删除\033[33m自定义任务\033[0m"
|
||||
echo -e " 7 使用\033[32m推荐设置\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case "$num" in
|
||||
0)
|
||||
;;
|
||||
1)
|
||||
task_add
|
||||
task_menu
|
||||
;;
|
||||
2)
|
||||
task_manager
|
||||
rm -rf $TMPDIR/task_list
|
||||
task_menu
|
||||
;;
|
||||
3)
|
||||
echo -----------------------------------------------
|
||||
cat $TMPDIR/ShellCrash.log | grep '任务:'
|
||||
task_menu
|
||||
;;
|
||||
4)
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m请在日志工具中配置相关推送通道及推送开关\033[0m"
|
||||
log_pusher
|
||||
task_menu
|
||||
;;
|
||||
5)
|
||||
task_user_add
|
||||
task_menu
|
||||
;;
|
||||
6)
|
||||
task_user_del
|
||||
task_menu
|
||||
;;
|
||||
7)
|
||||
task_recom
|
||||
task_menu
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
menu)
|
||||
task_menu
|
||||
;;
|
||||
[1-9][0-9][0-9])
|
||||
task_command=$(cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}')
|
||||
task_name=$(cat $CRASHDIR/task/task.list $CRASHDIR/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $3}')
|
||||
#logger "任务:$task_name 开始执行"
|
||||
eval $task_command && task_res=成功 || task_res=失败
|
||||
logger "任务【$2】执行$task_res"
|
||||
;;
|
||||
*)
|
||||
$1
|
||||
;;
|
||||
esac
|
||||
|
Loading…
Reference in New Issue
Block a user