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:
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
|
||||
|
||||
Reference in New Issue
Block a user