From dea883c011a85def17674a0e05d491109cd42d8a Mon Sep 17 00:00:00 2001 From: juewuy Date: Tue, 6 Oct 2020 17:56:17 +0800 Subject: [PATCH] =?UTF-8?q?v1.0.0beta13=20~=E6=94=AF=E6=8C=81Padavan?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F(=E4=BB=85=E4=BF=9D=E5=AE=88=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F)=20~=E8=BF=9B=E9=98=B6=E5=8A=9F=E8=83=BD=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E5=8A=9F=E8=83=BD=20~=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=A3=80=E6=B5=8B=E6=9C=BA=E5=88=B6=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E6=98=BE=E7=A4=BA=E6=95=88=E6=9E=9C=20~=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E7=94=A8=E7=9A=84bug=20~=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E7=AB=AF=E5=8F=A3=E5=8D=A0=E7=94=A8=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=20~=E4=BC=98=E5=8C=96=E5=AE=89=E8=A3=85=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E5=AE=89=E8=A3=85=E6=B5=81=E7=A8=8B=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=A6=86=E7=9B=96=E5=AE=89=E8=A3=85=20~=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=83=A8=E5=88=86=E8=AE=BE=E5=A4=87=E5=9B=A0=E5=BC=80?= =?UTF-8?q?=E5=90=AFipv6=E5=AF=BC=E8=87=B4=E7=9A=84DNS=E6=B1=A1=E6=9F=93(?= =?UTF-8?q?=E5=BE=85=E6=B5=8B=E8=AF=95)=20~=E4=BF=AE=E5=A4=8D=E5=B0=8F?= =?UTF-8?q?=E7=B1=B3R2D=E7=AD=89=E5=8D=9A=E9=80=9A=E8=8A=AF=E7=89=87?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E4=BD=BF=E7=94=A8ARMv7=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84bug=20~=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=97=A7=E8=AE=BE=E5=A4=87=E6=97=A0=E6=B3=95=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E6=98=BE=E7=A4=BA=E8=BF=90=E8=A1=8C=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E7=9A=84bug=20~=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E5=AF=BC=E5=85=A5=E4=B8=AA=E4=BA=BA=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=BA=90=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/clashfm.tar.gz | Bin 17007 -> 17955 bytes bin/version | 4 +- install.sh | 75 ++++++++++++------- install_cdn.sh | 73 +++++++++++++------ install_test.sh | 73 +++++++++++++------ scripts/clash.sh | 178 +++++++++++++++++++++++++++++++++++++-------- scripts/getdate.sh | 43 ++++------- scripts/start.sh | 124 +++++++++++++++---------------- 8 files changed, 372 insertions(+), 198 deletions(-) diff --git a/bin/clashfm.tar.gz b/bin/clashfm.tar.gz index ab7d4e6c8582954eca23dc6c58ed6ec3004703bc..4ec10a7524321b35ff513f542818cd58c0f759a6 100644 GIT binary patch literal 17955 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 SbLIJ8KK}sK#Gm#6G64Xb`BHKK diff --git a/bin/version b/bin/version index 8e64281..06af3c4 100644 --- a/bin/version +++ b/bin/version @@ -1,2 +1,4 @@ GeoIP_v=20201001 -versionsh=1.0.0pre1 +clash_v=1.1.0 +clashpre_v=2020.09.27 +versionsh=1.0.0beta12 diff --git a/install.sh b/install.sh index 5adb069..89dc211 100644 --- a/install.sh +++ b/install.sh @@ -2,7 +2,7 @@ # Copyright (C) Juewuy echo='echo -e' && [ -n "$(ls -l /bin/sh|grep -o dash)" ] && echo=echo -test=0 +test=1 echo "***********************************************" echo "** 欢迎使用 **" @@ -14,6 +14,7 @@ url="https://cdn.jsdelivr.net/gh/juewuy/ShellClash" if [ $test -ge 1 ];then url="--resolve raw.githubusercontent.com:443:199.232.68.133 https://raw.githubusercontent.com/juewuy/ShellClash/master" [ $test -ge 2 ] && url="http://192.168.31.30:8080/clash-for-Miwifi" + [ $test -ge 3 ] && url="http://192.168.123.90:8080/clash-for-Miwifi" else release_new=$(curl -kfsSL --resolve api.github.com:443:140.82.113.5 "https://api.github.com/repos/juewuy/ShellClash/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g') #检查版本 fi @@ -25,7 +26,7 @@ gettar(){ result=$(curl -w %{http_code} -kLo /tmp/clashfm.tar.gz $tarurl) [ "$result" != "200" ] && echo "文件下载失败!" && exit 1 #解压 - echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo ----------------------------------------------- echo 开始解压文件! mkdir -p $clashdir > /dev/null tar -zxvf '/tmp/clashfm.tar.gz' -C $clashdir/ @@ -68,17 +69,24 @@ gettar(){ rm -rf $clashdir/clashservice rm -rf $clashdir/clash.service } -#输出 -$echo "最新版本:\033[32m$release_new\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$echo "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/clashfm \033[0m" -$echo "\033[37m支持各种基于openwrt的路由器设备" -$echo "\033[33m支持Debian、Centos等标准Linux系统\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#下载及安装 +install(){ +echo ----------------------------------------------- +echo 开始从服务器获取安装文件! +echo ----------------------------------------------- +gettar +echo ----------------------------------------------- +echo ShellClash 已经安装成功! +echo ----------------------------------------------- +$echo "\033[33m输入\033[30;47m clash \033[0;33m命令即可管理!!!\033[0m" +echo ----------------------------------------------- +} +setdir(){ +echo ----------------------------------------------- $echo "\033[32m 1 在默认目录(/etc)安装" $echo "\033[33m 2 手动设置安装目录" $echo "\033[0m 0 退出安装" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +echo ----------------------------------------------- read -p "请输入相应数字 > " num #设置目录 if [ -z $num ];then @@ -87,29 +95,46 @@ if [ -z $num ];then elif [ "$num" = "1" ];then dir=/etc elif [ "$num" = "2" ];then - echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo ----------------------------------------------- echo '可用路径 剩余空间:' df -h | awk '{print $6,$2}'| sed 1d echo '路径是必须带 / 的格式,写入虚拟内存(/tmp,/sys,..)的文件会在重启后消失!!!' read -p "请输入自定义路径 > " dir - if [ -z $dir ];then - echo 路径错误!已取消安装! + if [ -z "$dir" ];then + $echo "\033[31m路径错误!已取消安装!\033[0m" exit; fi else - echo 安装已取消 + echo 安装已取消!!! exit; fi clashdir=$dir/clash -#输出 -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo 开始从服务器获取安装文件! -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -#下载及安装 -gettar -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo ShellClash 已经安装成功! -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$echo "\033[33m输入\033[30;47m clash \033[0;33m命令即可管理!!!\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +install +} +#输出 +$echo "最新版本:\033[32m$release_new\033[0m" +echo ----------------------------------------------- +$echo "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/clashfm \033[0m" +$echo "\033[37m支持各种基于openwrt的路由器设备" +$echo "\033[33m支持Debian、Centos等标准Linux系统\033[0m" + +if [ -n "$clashdir" ];then + echo ----------------------------------------------- + $echo "检测到旧的安装目录\033[36m$clashdir\033[0m,是否覆盖安装?" + $echo "\033[32m覆盖安装时不会移除配置文件!\033[0m" + read -p "覆盖安装/卸载旧版本?(1/0) > " res + if [ "$res" = "1" ];then + install + elif [ "$res" = "0" ];then + rm -rf $clashdir + echo ----------------------------------------------- + $echo "\033[31m 旧版本文件已卸载!\033[0m" + setdir + else + $echo "\033[31m输入错误!已取消安装!\033[0m" + exit; + fi +else + setdir +fi diff --git a/install_cdn.sh b/install_cdn.sh index 5adb069..5d7af9a 100644 --- a/install_cdn.sh +++ b/install_cdn.sh @@ -14,6 +14,7 @@ url="https://cdn.jsdelivr.net/gh/juewuy/ShellClash" if [ $test -ge 1 ];then url="--resolve raw.githubusercontent.com:443:199.232.68.133 https://raw.githubusercontent.com/juewuy/ShellClash/master" [ $test -ge 2 ] && url="http://192.168.31.30:8080/clash-for-Miwifi" + [ $test -ge 3 ] && url="http://192.168.123.90:8080/clash-for-Miwifi" else release_new=$(curl -kfsSL --resolve api.github.com:443:140.82.113.5 "https://api.github.com/repos/juewuy/ShellClash/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g') #检查版本 fi @@ -25,7 +26,7 @@ gettar(){ result=$(curl -w %{http_code} -kLo /tmp/clashfm.tar.gz $tarurl) [ "$result" != "200" ] && echo "文件下载失败!" && exit 1 #解压 - echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo ----------------------------------------------- echo 开始解压文件! mkdir -p $clashdir > /dev/null tar -zxvf '/tmp/clashfm.tar.gz' -C $clashdir/ @@ -68,17 +69,24 @@ gettar(){ rm -rf $clashdir/clashservice rm -rf $clashdir/clash.service } -#输出 -$echo "最新版本:\033[32m$release_new\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$echo "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/clashfm \033[0m" -$echo "\033[37m支持各种基于openwrt的路由器设备" -$echo "\033[33m支持Debian、Centos等标准Linux系统\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#下载及安装 +install(){ +echo ----------------------------------------------- +echo 开始从服务器获取安装文件! +echo ----------------------------------------------- +gettar +echo ----------------------------------------------- +echo ShellClash 已经安装成功! +echo ----------------------------------------------- +$echo "\033[33m输入\033[30;47m clash \033[0;33m命令即可管理!!!\033[0m" +echo ----------------------------------------------- +} +setdir(){ +echo ----------------------------------------------- $echo "\033[32m 1 在默认目录(/etc)安装" $echo "\033[33m 2 手动设置安装目录" $echo "\033[0m 0 退出安装" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +echo ----------------------------------------------- read -p "请输入相应数字 > " num #设置目录 if [ -z $num ];then @@ -87,29 +95,46 @@ if [ -z $num ];then elif [ "$num" = "1" ];then dir=/etc elif [ "$num" = "2" ];then - echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo ----------------------------------------------- echo '可用路径 剩余空间:' df -h | awk '{print $6,$2}'| sed 1d echo '路径是必须带 / 的格式,写入虚拟内存(/tmp,/sys,..)的文件会在重启后消失!!!' read -p "请输入自定义路径 > " dir - if [ -z $dir ];then - echo 路径错误!已取消安装! + if [ -z "$dir" ];then + $echo "\033[31m路径错误!已取消安装!\033[0m" exit; fi else - echo 安装已取消 + echo 安装已取消!!! exit; fi clashdir=$dir/clash -#输出 -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo 开始从服务器获取安装文件! -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -#下载及安装 -gettar -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo ShellClash 已经安装成功! -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$echo "\033[33m输入\033[30;47m clash \033[0;33m命令即可管理!!!\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +install +} +#输出 +$echo "最新版本:\033[32m$release_new\033[0m" +echo ----------------------------------------------- +$echo "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/clashfm \033[0m" +$echo "\033[37m支持各种基于openwrt的路由器设备" +$echo "\033[33m支持Debian、Centos等标准Linux系统\033[0m" + +if [ -n "$clashdir" ];then + echo ----------------------------------------------- + $echo "检测到旧的安装目录\033[36m$clashdir\033[0m,是否覆盖安装?" + $echo "\033[32m覆盖安装时不会移除配置文件!\033[0m" + read -p "覆盖安装/卸载旧版本?(1/0) > " res + if [ "$res" = "1" ];then + install + elif [ "$res" = "0" ];then + rm -rf $clashdir + echo ----------------------------------------------- + $echo "\033[31m 旧版本文件已卸载!\033[0m" + setdir + else + $echo "\033[31m输入错误!已取消安装!\033[0m" + exit; + fi +else + setdir +fi diff --git a/install_test.sh b/install_test.sh index c9a1a15..89dc211 100644 --- a/install_test.sh +++ b/install_test.sh @@ -14,6 +14,7 @@ url="https://cdn.jsdelivr.net/gh/juewuy/ShellClash" if [ $test -ge 1 ];then url="--resolve raw.githubusercontent.com:443:199.232.68.133 https://raw.githubusercontent.com/juewuy/ShellClash/master" [ $test -ge 2 ] && url="http://192.168.31.30:8080/clash-for-Miwifi" + [ $test -ge 3 ] && url="http://192.168.123.90:8080/clash-for-Miwifi" else release_new=$(curl -kfsSL --resolve api.github.com:443:140.82.113.5 "https://api.github.com/repos/juewuy/ShellClash/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g') #检查版本 fi @@ -25,7 +26,7 @@ gettar(){ result=$(curl -w %{http_code} -kLo /tmp/clashfm.tar.gz $tarurl) [ "$result" != "200" ] && echo "文件下载失败!" && exit 1 #解压 - echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo ----------------------------------------------- echo 开始解压文件! mkdir -p $clashdir > /dev/null tar -zxvf '/tmp/clashfm.tar.gz' -C $clashdir/ @@ -68,17 +69,24 @@ gettar(){ rm -rf $clashdir/clashservice rm -rf $clashdir/clash.service } -#输出 -$echo "最新版本:\033[32m$release_new\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$echo "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/clashfm \033[0m" -$echo "\033[37m支持各种基于openwrt的路由器设备" -$echo "\033[33m支持Debian、Centos等标准Linux系统\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#下载及安装 +install(){ +echo ----------------------------------------------- +echo 开始从服务器获取安装文件! +echo ----------------------------------------------- +gettar +echo ----------------------------------------------- +echo ShellClash 已经安装成功! +echo ----------------------------------------------- +$echo "\033[33m输入\033[30;47m clash \033[0;33m命令即可管理!!!\033[0m" +echo ----------------------------------------------- +} +setdir(){ +echo ----------------------------------------------- $echo "\033[32m 1 在默认目录(/etc)安装" $echo "\033[33m 2 手动设置安装目录" $echo "\033[0m 0 退出安装" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +echo ----------------------------------------------- read -p "请输入相应数字 > " num #设置目录 if [ -z $num ];then @@ -87,29 +95,46 @@ if [ -z $num ];then elif [ "$num" = "1" ];then dir=/etc elif [ "$num" = "2" ];then - echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo ----------------------------------------------- echo '可用路径 剩余空间:' df -h | awk '{print $6,$2}'| sed 1d echo '路径是必须带 / 的格式,写入虚拟内存(/tmp,/sys,..)的文件会在重启后消失!!!' read -p "请输入自定义路径 > " dir - if [ -z $dir ];then - echo 路径错误!已取消安装! + if [ -z "$dir" ];then + $echo "\033[31m路径错误!已取消安装!\033[0m" exit; fi else - echo 安装已取消 + echo 安装已取消!!! exit; fi clashdir=$dir/clash -#输出 -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo 开始从服务器获取安装文件! -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -#下载及安装 -gettar -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo ShellClash 已经安装成功! -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$echo "\033[33m输入\033[30;47m clash \033[0;33m命令即可管理!!!\033[0m" -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +install +} +#输出 +$echo "最新版本:\033[32m$release_new\033[0m" +echo ----------------------------------------------- +$echo "\033[44m如遇问题请加TG群反馈:\033[42;30m t.me/clashfm \033[0m" +$echo "\033[37m支持各种基于openwrt的路由器设备" +$echo "\033[33m支持Debian、Centos等标准Linux系统\033[0m" + +if [ -n "$clashdir" ];then + echo ----------------------------------------------- + $echo "检测到旧的安装目录\033[36m$clashdir\033[0m,是否覆盖安装?" + $echo "\033[32m覆盖安装时不会移除配置文件!\033[0m" + read -p "覆盖安装/卸载旧版本?(1/0) > " res + if [ "$res" = "1" ];then + install + elif [ "$res" = "0" ];then + rm -rf $clashdir + echo ----------------------------------------------- + $echo "\033[31m 旧版本文件已卸载!\033[0m" + setdir + else + $echo "\033[31m输入错误!已取消安装!\033[0m" + exit; + fi +else + setdir +fi diff --git a/scripts/clash.sh b/scripts/clash.sh index 793e0c8..357b3cd 100644 --- a/scripts/clash.sh +++ b/scripts/clash.sh @@ -6,8 +6,8 @@ getconfig(){ if [ -f /bin/opkg ];then host=$(ubus call network.interface.lan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}';) else - host=$(ip a|grep -w 'inet'|grep 'global'|grep -E '192.|10.'|sed 's/.*inet.//g'|sed 's/\/[0-9][0-9].*$//g') - [ -z $host ] && host=127.0.0.1 + host=$(ip a|grep -w 'inet'|grep 'global'|grep -E '192.|10.'|sed 's/.*inet.//g'|sed 's/\/[0-9][0-9].*$//g'|head -n 1) + [ -z "$host" ] && host=127.0.0.1 fi #服务器地址 [ -z "$update_url" ] && update_url=https://cdn.jsdelivr.net/gh/juewuy/ShellClash @@ -28,7 +28,7 @@ if [ -f /etc/rc.common ];then autostart=disable_rc fi else - if [ -n "$(systemctl list-unit-files clash.service | grep -o enable)" ];then + if [ -n "$(systemctl list-unit-files clash.service 2>&1 | grep -o enable)" ];then autostart=enable_sys else autostart=disable_sys @@ -44,6 +44,12 @@ else auto="\033[31m未设置开机启动!\033[0m" auto1="\033[36m允许\033[0mclash开机启动" fi +#获取默认端口 +[ -z "$mix_port" ] && mix_port=7890 +[ -z "$redir_port" ] && redir_port=7892 +[ -z "$db_port" ] && db_port=9999 +[ -z "$dns_port" ] && dns_port=1053 +[ -z "$secret" ] && secret=未设置 #获取运行模式 if [ -z "$redir_mod" ];then sed -i "2i\redir_mod=Redir模式" $ccfg @@ -63,15 +69,17 @@ if [ -n "$PID" ];then else day="" fi - time=`date -u -d @${time} +"%-H小时%-M分%-S秒"` + time=`date -u -d @${time} +%H小时%M分%S秒` fi else run="\033[31m没有运行($redir_mod)\033[0m" + #检测系统端口占用 + checkport fi #输出状态 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo -e "\033[30;46m欢迎使用ShellClash!\033[0m 版本:$versionsh_l" +echo -e "\033[30;46m欢迎使用ShellClash!\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" @@ -82,6 +90,7 @@ echo ----------------------------------------------- if [ ! -f $clashdir/clash ];then echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo -e "\033[31m没有找到核心文件,请先下载clash核心!\033[0m" + checkupdate source $clashdir/getdate.sh getcore fi @@ -89,9 +98,17 @@ fi if [ ! -f $clashdir/Country.mmdb ];then echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo -e "\033[31m没有找到GeoIP数据库文件,请先下载数据库!\033[0m" + checkupdate source $clashdir/getdate.sh getgeo - clashstart +fi +#检查定时任务配置文件 +if [ -z "$cronpath" ];then + [ -d /etc/crontabs/ ] && cronpath="/etc/crontabs/root" + [ -d /var/spool/cron/ ] && cronpath="/var/spool/cron/root" + [ -d /var/spool/cron/crontabs/ ] && cronpath="/var/spool/cron/crontabs/root" + [ -d /etc/storage/cron/crontabs ] && cronpath="/etc/storage/cron/crontabs/admin" + [ -n "$cronpath" ] && sed -i "1i\cronpath=\'$cronpath\'" $ccfg fi } start_over(){ @@ -100,14 +117,93 @@ start_over(){ if [ -d /www/clash ];then echo -e "请使用\033[30;47m http://$host/clash \033[0m管理内置规则" elif [ -d $clashdir/ui ];then - echo -e "请使用\033[30;47m http://$host:9999/ui \033[0m管理内置规则" + echo -e "请使用\033[30;47m http://$host:$db_port/ui \033[0m管理内置规则" else echo -e "可使用\033[30;47m http://clash.razord.top \033[0m管理内置规则" - echo -e "Host地址:\033[36m $host \033[0m 端口:\033[36m 9999 \033[0m" + echo -e "Host地址:\033[36m $host \033[0m 端口:\033[36m $db_port \033[0m" echo -e "也可前往更新菜单安装本地Dashboard面板,连接更稳定!\033[0m" echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fi } +setport(){ + inputport(){ + read -p "请输入端口号(1000-65535) > " portx + if [ -z "$portx" ]; then + setport + elif [ $portx -gt 65535 -o $portx -le 999 ]; then + echo -e "\033[31m输入错误!请输入正确的数值(1000-65535)!\033[0m" + inputport + elif [ -n "$(echo $mix_port$redir_port$dns_port$db_port|grep $portx)" ]; then + echo -e "\033[31m输入错误!请不要输入重复的端口!\033[0m" + inputport + elif [ -n "$(netstat -ntul |grep :$portx)" ];then + echo -e "\033[31m当前端口已被其他进程占用,请重新输入!\033[0m" + inputport + else + sed -i "/$xport*/"d $ccfg + sed -i "1i$xport=$portx" $ccfg + echo -e "\033[32m设置成功!!!\033[0m" + setport + fi + } + source $ccfg + if [ -n "$(pidof clash)" ];then + echo ----------------------------------------------- + echo -e "\033[33m检测到clash服务正在运行,需要先停止clash服务!\033[0m" + read -p "是否停止clash服务?(1/0) > " res + if [ "$res" = "1" ];then + $clashdir/start.sh stop + else + clashsh + fi + fi + echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo -e " 1 修改Http/Sock5端口:\033[36m$mix_port\033[0m" + echo -e " 2 修改静态路由端口:\033[36m$redir_port\033[0m" + echo -e " 3 修改DNS监听端口:\033[36m$dns_port\033[0m" + echo -e " 4 修改面板访问端口:\033[36m$db_port\033[0m" + echo -e " 5 修改面板访问密码:\033[36m$secret\033[0m" + echo -e " 0 返回上级菜单" + read -p "请输入对应数字 > " num + if [ -z "$num" ]; then + echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo -e "\033[31m请输入正确的数字!\033[0m" + elif [[ $num == 1 ]]; then + xport=mix_port + inputport + elif [[ $num == 2 ]]; then + xport=redir_port + inputport + elif [[ $num == 3 ]]; then + xport=dns_port + inputport + elif [[ $num == 4 ]]; then + xport=db_port + inputport + elif [[ $num == 5 ]]; then + read -p "请输入面板访问密码 > " secret + if [ -n "$secret" ]; then + sed -i "/secret*/"d $ccfg + sed -i "1i\secret=$secret" $ccfg + echo -e "\033[32m设置成功!!!\033[0m" + fi + setport + fi +} +checkport(){ + for portx in $dns_port $mix_port $redir_port $db_port ;do + if [ -n "$(netstat -ntul |grep :$portx)" ];then + echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + echo -e "检测到端口【$portx】被以下进程占用!clash可能无法正常启动!\033[33m" + echo $(netstat -ntulp | grep :$portx | head -n 1) + echo -e "\033[0m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + echo -e "\033[36m请修改默认端口配置!\033[0m" + setport + source $ccfg + checkport + fi + done +} clashstart(){ if [ ! -f "$yaml" ];then echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -329,7 +425,7 @@ if [[ $num -le 9 ]] > /dev/null 2>&1; then echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo -e "\033[32m已经设置为纯净模式!\033[0m" echo -e "\033[33m当前模式必须手动在设备WiFi或应用中配置HTTP或sock5代理\033[0m" - echo -e "HTTP/SOCK5代理服务器地址:\033[30;47m$host\033[0m;端口均为:\033[30;47m7890\033[0m" + echo -e "HTTP/SOCK5代理服务器地址:\033[30;47m$host\033[0m;端口均为:\033[30;47m$mix_port\033[0m" echo -e "\033[31m也可以使用PAC自动代理文件,具体使用方法请自行搜索\033[0m" echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ read -p "是否配置自动代理PAC文件(1/0) > " res @@ -518,10 +614,11 @@ echo -e "\033[30;47m欢迎使用进阶模式菜单:\033[0m" echo -e "\033[33m如您不是很了解clash的运行机制,请勿更改!\033[0m" echo -e "\033[32m修改配置后请手动重启clash服务!\033[0m" echo ----------------------------------------------- -echo -e " 1 不修饰config.yaml: \033[36m$modify_yaml\033[0m ————用于使用自定义配置" -echo -e " 2 启用ipv6支持: \033[36m$ipv6_support\033[0m ————实验性功能,可能不可用" -echo -e " 3 使用保守方式启动: \033[36m$start_old\033[0m ————切换时会停止clash服务" -echo -e " 4 代理本机流量: \033[36m$local_proxy\033[0m ————配置本机代理环境变量" +echo -e " 1 不修饰config.yaml: \033[36m$modify_yaml\033[0m ————用于使用自定义配置" +echo -e " 2 启用ipv6支持: \033[36m$ipv6_support\033[0m ————实验性功能,可能不可用" +echo -e " 3 使用保守方式启动: \033[36m$start_old\033[0m ————切换时会停止clash服务" +echo -e " 4 代理本机流量: \033[36m$local_proxy\033[0m ————配置本机代理环境变量" +echo -e " 5 手动指定clash运行端口" echo ----------------------------------------------- echo -e " 8 \033[31m重置\033[0m配置文件" echo -e " 9 \033[32m重启\033[0mclash服务" @@ -589,7 +686,7 @@ if [[ $num -le 9 ]] > /dev/null 2>&1; then if [ "$local_proxy" = "未开启" ] > /dev/null 2>&1; then sed -i "1i\local_proxy=已开启" $ccfg local_proxy=已开启 - echo 'export http_proxy=http://127.0.0.1:7890' >> /etc/profile + echo 'export http_proxy=http://127.0.0.1:'"$mix_port" >> /etc/profile echo 'export https_proxy=$http_proxy' >> /etc/profile echo 'export HTTP_PROXY=$http_proxy' >> /etc/profile echo 'export HTTPS_PROXY=$http_proxy' >> /etc/profile @@ -605,6 +702,9 @@ if [[ $num -le 9 ]] > /dev/null 2>&1; then fi source /etc/profile > /dev/null 2>&1 clashadv + elif [[ $num == 5 ]]; then + setport + clashadv elif [[ $num == 8 ]]; then read -p "确认重置配置文件?(1/0) > " res @@ -631,21 +731,27 @@ else fi exit; } -update(){ +checkupdate(){ if [ -z "$release_new" ];then - echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - echo -e "\033[33m正在检查更新!\033[0m" if [ "$update_url" = "https://cdn.jsdelivr.net/gh/juewuy/ShellClash" ];then - release_new=$(curl -kfsSL --resolve api.github.com:443:140.82.113.5 --connect-timeout 3 -m 3 "https://api.github.com/repos/juewuy/ShellClash/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g') + release_new=$(curl -kfsSL --resolve api.github.com:443:140.82.113.5 --connect-timeout 5 -m 5 "https://api.github.com/repos/juewuy/ShellClash/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g') update_url=$update_url@$release_new fi - [ -z "$release_new" ] && release_new=$(curl -kfsSL --connect-timeout 3 -m 3 $update_url/bin/version | grep "versionsh" | awk -F "=" '{print $2}') - [ -z "$release_new" ] && echo "检查更新失败!" + curl -skL --connect-timeout 5 -m 5 $update_url/bin/version > /tmp/clashversion + source /tmp/clashversion + [ -z "$release_new" ] && release_new=$versionsh fi +} +update(){ echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +echo -e "\033[33m正在检查更新!\033[0m" +checkupdate +[ "$clashcore" = "clash" ] && clash_n=$clash_v || clash_n=$clashpre_v echo -e "\033[30;47m欢迎使用更新功能:\033[0m" -[ -n "$release_new" ] && echo -e "当前ShellClash版本:\033[33m $versionsh_l \033[0m" -[ -n "$release_new" ] && echo -e "最新ShellClash版本:\033[32m $release_new \033[0m" +echo ----------------------------------------------- +echo -e "ShellClash 本地版本:\033[33m$versionsh_l \033[0m在线版本:\033[32m$versionsh\033[0m" +echo -e "Geoip数据库 本地版本:\033[33m$Geo_v \033[0m在线版本:\033[32m$GeoIP_v\033[0m" +echo -e "$clashcore核心 本地版本:\033[33m$clashv \033[0m在线版本:\033[32m$clash_n\033[0m" echo ----------------------------------------------- echo -e " 1 更新\033[36m管理脚本\033[0m" echo -e " 2 切换\033[33mclash核心\033[0m" @@ -801,15 +907,23 @@ clashcron(){ clashcron } checkcron(){ - [ -d /etc/crontabs/ ]&&cronpath="/etc/crontabs/root" - [ -d /var/spool/cron/ ]&&cronpath="/var/spool/cron/root" - [ -d /var/spool/cron/crontabs/ ]&&cronpath="/var/spool/cron/crontabs/root" - if [ -z $cronpath ];then + if [ -z "$cronpath" ];then echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - echo "找不到定时任务文件,无法添加定时任务!" - clashsh + echo -e "\033[33m找不到定时任务配置文件,无法添加添加定时任务!" + echo -e "\033[0m请手动指定定时任务配置文件,文件位置可以通过【crontab -e】命令查看\033[0m" + echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + read -p "请输入crontab文件路径(输入回车返回主菜单) > " path + if [ -z "$path" ];then + clashsh + elif [ -f $path ];then + cronpath=$path + sed -i '/cronpath*/'d $ccfg + sed -i "1i\cronpath=\'$cronpath\'" $ccfg + else + echo -e "\033[33m输入的路径不正确,请重新输入!\033[0m" + checkcron + fi fi - } #定时任务菜单 checkcron #检测定时任务文件 @@ -818,7 +932,7 @@ echo -e "\033[30;47m欢迎使用定时任务功能:\033[0m" echo -e "\033[44m 实验性功能,遇问题请加TG群反馈:\033[42;30m t.me/clashfm \033[0m" echo ----------------------------------------------- echo -e "\033[33m已添加的定时任务:\033[36m" -cat $cronpath | egrep -o ' #.*' +cat $cronpath | grep -oE ' #.*' echo -e "\033[0m"----------------------------------------------- echo -e " 1 设置\033[33m定时重启\033[0mclash服务" echo -e " 2 设置\033[31m定时停止\033[0mclash服务" @@ -866,7 +980,7 @@ 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 $auto1" -echo -e " 5 设置\033[33m定时任务\033[0m" +echo -e " 5 设置\033[33m定时任务\033[0m$cronoff" echo -e " 6 导入\033[32m配置文件\033[0m" echo -e " 7 clash\033[31m进阶设置\033[0m" echo -e " 8 \033[35m测试菜单\033[0m" @@ -981,7 +1095,7 @@ if [[ $num -le 9 ]] > /dev/null 2>&1; then exit; elif [[ $num == 6 ]]; then echo 注意:测试结果不保证一定准确! - delay=`curl -kx 127.0.0.1:7890 -o /dev/null -s -w '%{time_starttransfer}' 'https://google.tw' & { sleep 3 ; kill $! & }` > /dev/null 2>&1 + delay=`curl -kx 127.0.0.1:$mix_port -o /dev/null -s -w '%{time_starttransfer}' 'https://google.tw' & { sleep 3 ; kill $! & }` > /dev/null 2>&1 delay=`echo |awk "{print $delay*1000}"` > /dev/null 2>&1 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if [ `echo ${#delay}` -gt 1 ];then diff --git a/scripts/getdate.sh b/scripts/getdate.sh index 6d95801..2964700 100644 --- a/scripts/getdate.sh +++ b/scripts/getdate.sh @@ -307,9 +307,8 @@ clashcore_n=$clashcore #获取设备处理器架构 cputype=$(uname -ms | tr ' ' '_' | tr '[A-Z]' '[a-z]') [ -n "$(echo $cputype | grep -E "linux.*armv.*")" ] && cpucore="armv5" -[ -n "$(echo $cputype | grep -E "linux.*armv7.*")" ] && cpucore="armv7" -[ -n "$(echo $cputype | grep -E "linux.*aarch64.*")" ] && cpucore="armv8" -[ -n "$(echo $cputype | grep -E "linux.*armv8.*")" ] && cpucore="armv8" +[ -n "$(echo $cputype | grep -E "linux.*armv7.*")" ] && [ -n "$(cat /proc/cpuinfo | grep vfp)" ] && cpucore="armv7" +[ -n "$(echo $cputype | grep -E "linux.*aarch64.*|linux.*armv8.*")" ] && cpucore="armv8" [ -n "$(echo $cputype | grep -E "linux.*x86.*")" ] && cpucore="386" [ -n "$(echo $cputype | grep -E "linux.*x86_64.*")" ] && cpucore="amd64" if [ -n "$(echo $cputype | grep -E "linux.*mips.*")" ];then @@ -337,10 +336,13 @@ read -p "请输入对应数字 > " num update elif [[ $num == 1 ]]; then clashcore=clash + version=$claversionsh_l elif [[ $num == 2 ]]; then clashcore=clashpre + version=$clashpre_v elif [[ $num == 3 ]]; then clashcore=clashr + version='1.0(已停止更新)' else echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo -e "\033[31m请输入正确的数字!\033[0m" @@ -348,13 +350,6 @@ read -p "请输入对应数字 > " num fi #生成链接 corelink="$update_url/bin/$clashcore/clash-linux-$cpucore" -versionlink="$update_url/bin/$clashcore/version" -#检测版本 -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo -e "\033[33m正在检查更新!\033[0m" -result=$(curl -w %{http_code} -skLo /tmp/clashversion $versionlink) -[ "$result" != "200" ] && echo "检查更新失败!" && exit 1 -source /tmp/clashversion echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo -e "当前clash核心:\033[0m $clashcore_n \033[33m$clashv\033[0m" echo -e "最新clash核心:\033[32m $clashcore \033[36m$version\033[0m" @@ -395,12 +390,6 @@ getcore fi } getgeo(){ -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -echo -e "\033[33m正在检查更新!\033[0m" -#echo $update_url -result=$(curl -w %{http_code} -skLo /tmp/clashversion $update_url/bin/version) -[ "$result" != "200" ] && echo "检查更新失败!" && exit 1 -source /tmp/clashversion echo ----------------------------------------------- echo -e "当前GeoIP版本为:\033[33m $Geo_v \033[0m" echo -e "最新GeoIP版本为:\033[32m $GeoIP_v \033[0m" @@ -436,8 +425,8 @@ echo ----------------------------------------------- echo -e "\033[32m打开管理面板的速度更快且更稳定" echo -e "\033[33m需要占用约500kb的本地空间\033[0m" echo ----------------------------------------------- -echo " 1 在/www/clash目录安装(http://$host/clash,可能安装失败!)" -echo " 2 在$clashdir/ui目录安装(http://$host:9999/ui,安装后需重启clash)" +echo -e " 1 在$clashdir/ui目录安装(推荐!)\033[33m安装后需重启clash服务!!!\033[0m" +echo " 2 在/www/clash目录安装(依赖路由器自带的Nginx服务,可能安装失败!)" echo ----------------------------------------------- echo " 0 返回上级菜单" read -p "请输入对应数字 > " num @@ -445,11 +434,11 @@ read -p "请输入对应数字 > " num if [ -z "$num" ];then update elif [ "$num" = '1' ]; then + dbdir=$clashdir/ui + hostdir=":$db_port/ui\033[0;36m访问面板(需重启clash服务!)" +elif [ "$num" = '2' ]; then dbdir=/www/clash hostdir='/clash\033[0;36m访问面板' -elif [ "$num" = '2' ]; then - dbdir=$clashdir/ui - hostdir=':9999/ui\033[0;36m访问面板(需重启clash服务!)' else update fi @@ -483,8 +472,8 @@ fi tar -zxvf '/tmp/clashdb.tar.gz' -C $dbdir > /dev/null [ $? -ne 0 ] && echo "文件解压失败!" && exit 1 #修改默认host和端口 - sed -i "s/127.0.0.1/$host/g" $dbdir/js/*.js - sed -i "s/9090/9999/g" $dbdir/js/*.js + sed -i "s/127.0.0.1/${host}/g" $dbdir/js/*.js + sed -i "s/9090/${db_port}/g" $dbdir/js/*.js # echo -e "\033[32m面板安装成功!\033[0m" echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -500,7 +489,7 @@ catpac(){ [ ! -d /www/clash -a ! -d $clashdir/ui ]&&echo 未检测到本地Dashboard面板,请先安装面板!&&sleep 1&&getdb #host=$(ubus call network.interface.lan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}';) [ -d /www/clash ]&&dir="/www/clash"&&pac=http://$host/clash/pac -[ -d $clashdir/ui ]&&dir="$clashdir/ui"&&pac=http://$host:9999/ui/pac +[ -d $clashdir/ui ]&&dir="$clashdir/ui"&&pac=http://$host:$db_port/ui/pac echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo -e "\033[30;47m生成用于设备WIFI或浏览器的自动PAC代理文件\033[0m" echo -e "\033[33m非纯净模式不推荐使用此功能\033[0m" @@ -513,7 +502,7 @@ echo -e " 0 返回上级菜单" read -p "请输入对应数字 > " num if [ "$num" = '1' ]; then echo 'function FindProxyForURL(url, host) {' > $dir/pac - echo " return \"SOCKS $host:7890; PROXY $host:7890; DIRECT;\"" >> $dir/pac + echo " return \"SOCKS $host:$mix_port; PROXY $host:$mix_port; DIRECT;\"" >> $dir/pac echo '}' >> $dir/pac echo -e "\033[33mPAC文件已生成!\033[0m" echo -e "PAC地址:\033[32m$pac\033[0m" @@ -547,11 +536,11 @@ elif [[ $num == 1 ]]; then elif [[ $num == 2 ]]; then update_url='https://cdn.jsdelivr.net/gh/juewuy/ShellClash' elif [[ $num == 3 ]]; then - update_url='-x 127.0.0.1:7890 https://raw.githubusercontent.com/juewuy/ShellClash/master' + update_url='-x 127.0.0.1:'$mix_port' https://raw.githubusercontent.com/juewuy/ShellClash/master' elif [[ $num == 4 ]]; then echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ read -p "请输入个人源路径 > " update_url - if [ -n $update_url ];then + if [ -z "$update_url" ];then echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo -e "\033[31m取消输入,返回上级菜单\033[0m" update diff --git a/scripts/start.sh b/scripts/start.sh index 85801b1..86db39b 100644 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -17,6 +17,10 @@ source $ccfg [ -z "$ipv6_support" ] && ipv6_support=未开启 [ -z "$start_old" ] && start_old=未开启 [ -z "$local_proxy" ] && local_proxy=未开启 +[ -z "$mix_port" ] && mix_port=7890 +[ -z "$redir_port" ] && redir_port=7892 +[ -z "$db_port" ] && db_port=9999 +[ -z "$dns_port" ] && dns_port=1053 #是否代理常用端口 [ "$common_ports" = "已开启" ] && ports='-m multiport --dports 22,53,587,465,995,993,143,80,443 ' } @@ -145,57 +149,47 @@ fi } modify_yaml(){ ##########需要变更的配置########### -mix='mixed-port: 7890' -redir='redir-port: 7892' lan='allow-lan: true' mode='mode: Rule' log='log-level: info' -if [ "$ipv6_support" = "已开启" ];then -ipv6='ipv6: true' -else -ipv6='ipv6: false' -fi -external='external-controller: 0.0.0.0:9999' -if [ -d $clashdir/ui ];then -external_ui='external-ui: ui' -else -external_ui='external-ui:' -fi -if [ "$dns_mod" = "fake-ip" ];then -dns='dns: {enable: true, listen: 0.0.0.0:1053, use-hosts: true, fake-ip-range: 198.18.0.1/16, enhanced-mode: fake-ip, fake-ip-filter: ["*.lan", "time.windows.com", "time.nist.gov", "time.apple.com", "time.asia.apple.com", "*.ntp.org.cn", "*.openwrt.pool.ntp.org", "time1.cloud.tencent.com", "time.ustc.edu.cn", "pool.ntp.org", "ntp.ubuntu.com", "ntp.aliyun.com", "ntp1.aliyun.com", "ntp2.aliyun.com", "ntp3.aliyun.com", "ntp4.aliyun.com", "ntp5.aliyun.com", "ntp6.aliyun.com", "ntp7.aliyun.com", "time1.aliyun.com", "time2.aliyun.com", "time3.aliyun.com", "time4.aliyun.com", "time5.aliyun.com", "time6.aliyun.com", "time7.aliyun.com", "*.time.edu.cn", "time1.apple.com", "time2.apple.com", "time3.apple.com", "time4.apple.com", "time5.apple.com", "time6.apple.com", "time7.apple.com", "time1.google.com", "time2.google.com", "time3.google.com", "time4.google.com", "music.163.com", "*.music.163.com", "*.126.net", "musicapi.taihe.com", "music.taihe.com", "songsearch.kugou.com", "trackercdn.kugou.com", "*.kuwo.cn", "api-jooxtt.sanook.com", "api.joox.com", "joox.com", "y.qq.com", "*.y.qq.com", "streamoc.music.tc.qq.com", "mobileoc.music.tc.qq.com", "isure.stream.qqmusic.qq.com", "dl.stream.qqmusic.qq.com", "aqqmusic.tc.qq.com", "amobile.music.tc.qq.com", "*.xiami.com", "*.music.migu.cn", "music.migu.cn", "*.msftconnecttest.com", "*.msftncsi.com", "localhost.ptlogin2.qq.com", "*.*.*.srv.nintendo.net", "*.*.stun.playstation.net", "xbox.*.*.microsoft.com", "*.*.xboxlive.com", "proxy.golang.org"], nameserver: [114.114.114.114, 127.0.0.1:53], fallback: [tcp://1.0.0.1, 8.8.4.4], fallback-filter: {geoip: true}}' -elif [ "$dns_over" = "已开启" ];then -dns='dns: {enable: true, ipv6: true, listen: 0.0.0.0:1053, use-hosts: true, enhanced-mode: redir-host, nameserver: [114.114.114.114, 223.5.5.5], fallback: [1.0.0.1, 8.8.4.4], fallback-filter: {geoip: true}}' -else -dns='dns: {enable: true, ipv6: true, listen: 0.0.0.0:1053, use-hosts: true, enhanced-mode: redir-host, nameserver: [114.114.114.114, 223.5.5.5, 127.0.0.1:53], fallback: [1.0.0.1, 8.8.4.4], fallback-filter: {geoip: true}}' -fi -if [ "$redir_mod" != "Redir模式" ];then -tun='tun: {enable: true, stack: system}' -else -tun='tun: {enable: false}' -fi +[ "$ipv6_support" = "已开启" ] && ipv6='ipv6: true' || ipv6='ipv6: false' +external="external-controller: 0.0.0.0:$db_port" +[ -d $clashdir/ui ] && db_ui=ui +[ "$redir_mod" != "Redir模式" ] && tun='tun: {enable: true, stack: system}' || tun='tun: {enable: false}' exper='experimental: {ignore-resolve-fail: true, interface-name: en0}' +#dns配置 +if [ "$dns_mod" = "fake-ip" ];then + dns='dns: {enable: true, listen: 0.0.0.0:'$dns_port', use-hosts: true, fake-ip-range: 198.18.0.1/16, enhanced-mode: fake-ip, fake-ip-filter: ["*.lan", "time.windows.com", "time.nist.gov", "time.apple.com", "time.asia.apple.com", "*.ntp.org.cn", "*.openwrt.pool.ntp.org", "time1.cloud.tencent.com", "time.ustc.edu.cn", "pool.ntp.org", "ntp.ubuntu.com", "ntp.aliyun.com", "ntp1.aliyun.com", "ntp2.aliyun.com", "ntp3.aliyun.com", "ntp4.aliyun.com", "ntp5.aliyun.com", "ntp6.aliyun.com", "ntp7.aliyun.com", "time1.aliyun.com", "time2.aliyun.com", "time3.aliyun.com", "time4.aliyun.com", "time5.aliyun.com", "time6.aliyun.com", "time7.aliyun.com", "*.time.edu.cn", "time1.apple.com", "time2.apple.com", "time3.apple.com", "time4.apple.com", "time5.apple.com", "time6.apple.com", "time7.apple.com", "time1.google.com", "time2.google.com", "time3.google.com", "time4.google.com", "music.163.com", "*.music.163.com", "*.126.net", "musicapi.taihe.com", "music.taihe.com", "songsearch.kugou.com", "trackercdn.kugou.com", "*.kuwo.cn", "api-jooxtt.sanook.com", "api.joox.com", "joox.com", "y.qq.com", "*.y.qq.com", "streamoc.music.tc.qq.com", "mobileoc.music.tc.qq.com", "isure.stream.qqmusic.qq.com", "dl.stream.qqmusic.qq.com", "aqqmusic.tc.qq.com", "amobile.music.tc.qq.com", "*.xiami.com", "*.music.migu.cn", "music.migu.cn", "*.msftconnecttest.com", "*.msftncsi.com", "localhost.ptlogin2.qq.com", "*.*.*.srv.nintendo.net", "*.*.stun.playstation.net", "xbox.*.*.microsoft.com", "*.*.xboxlive.com", "proxy.golang.org"], nameserver: [114.114.114.114, 127.0.0.1:53], fallback: [tcp://1.0.0.1, 8.8.4.4], fallback-filter: {geoip: true}}' +elif [ "$dns_over" = "已开启" ];then + dns='dns: {enable: true, ipv6: true, listen: 0.0.0.0:'$dns_port', use-hosts: true, enhanced-mode: redir-host, nameserver: [114.114.114.114, 223.5.5.5], fallback: [1.0.0.1, 8.8.4.4], fallback-filter: {geoip: true}}' +else + dns='dns: {enable: true, ipv6: true, listen: 0.0.0.0:'$dns_port', use-hosts: true, enhanced-mode: redir-host, nameserver: [114.114.114.114, 223.5.5.5, 127.0.0.1:53], fallback: [1.0.0.1, 8.8.4.4], fallback-filter: {geoip: true}}' +fi + ################################### + yaml=$clashdir/config.yaml #预删除需要添加的项目 i=$(grep -n "^proxies:" $clashdir/config.yaml | head -1 | cut -d ":" -f 1) i=$(($i-1)) - sed -i "1,${i}d" $clashdir/config.yaml + sed -i "1,${i}d" $yaml #添加配置 - sed -i "1i$mix" $clashdir/config.yaml - sed -i "1a$redir" $clashdir/config.yaml - sed -i "2a$lan" $clashdir/config.yaml - sed -i "3a$mode" $clashdir/config.yaml - sed -i "4a$log" $clashdir/config.yaml - sed -i "5a$ipv6" $clashdir/config.yaml - sed -i "6a$external" $clashdir/config.yaml - sed -i "7a$external_ui" $clashdir/config.yaml - sed -i "8a$dns" $clashdir/config.yaml - sed -i "9a$tun" $clashdir/config.yaml - sed -i "10a$exper" $clashdir/config.yaml + sed -i "1imixed-port:\ $mix_port" $yaml + sed -i "1aredir-port:\ $redir_port" $yaml + sed -i "2a$lan" $yaml + sed -i "3a$mode" $yaml + sed -i "4a$log" $yaml + sed -i "5a$ipv6" $yaml + sed -i "6aexternal-controller:\ :$db_port" $yaml + sed -i "7aexternal-ui:\ $db_ui" $yaml + sed -i "8asecret:\ $secret" $yaml + sed -i "9a$dns" $yaml + sed -i "10a$tun" $yaml + sed -i "11a$exper" $yaml #跳过本地tls证书验证 if [ "$skip_cert" = "已开启" ];then - sed -i '10,99s/skip-cert-verify: false/skip-cert-verify: true/' $clashdir/config.yaml + sed -i '10,99s/skip-cert-verify: false/skip-cert-verify: true/' $yaml else - sed -i '10,99s/skip-cert-verify: true/skip-cert-verify: false/' $clashdir/config.yaml + sed -i '10,99s/skip-cert-verify: true/skip-cert-verify: false/' $yaml fi } mark_time(){ @@ -218,7 +212,7 @@ start_redir(){ iptables -t nat -A clash -m mac --mac-source $mac -j RETURN done #设置防火墙流量转发 - iptables -t nat -A clash -p tcp $ports-j REDIRECT --to-ports 7892 + iptables -t nat -A clash -p tcp $ports-j REDIRECT --to-ports $redir_port iptables -t nat -A PREROUTING -p tcp -j clash #设置ipv6转发 if [ "$ipv6_support" = "已开启" ];then @@ -226,7 +220,7 @@ start_redir(){ for mac in $(cat $clashdir/mac); do ip6tables -t nat -A clashv6 -m mac --mac-source $mac -j RETURN done - ip6tables -t nat -A clashv6 -p tcp $ports-j REDIRECT --to-ports 7892 + ip6tables -t nat -A clashv6 -p tcp $ports-j REDIRECT --to-ports $redir_port ip6tables -t nat -A PREROUTING -p tcp -j clashv6 fi } @@ -261,30 +255,33 @@ start_dns(){ for mac in $(cat $clashdir/mac); do iptables -t nat -A clash_dns -m mac --mac-source $mac -j RETURN done - iptables -t nat -A clash_dns -p udp --dport 53 -j REDIRECT --to 1053 - iptables -t nat -A clash_dns -p tcp --dport 53 -j REDIRECT --to 1053 + iptables -t nat -A clash_dns -p udp --dport 53 -j REDIRECT --to $dns_port + iptables -t nat -A clash_dns -p tcp --dport 53 -j REDIRECT --to $dns_port iptables -t nat -A PREROUTING -p udp -j clash_dns #Google home DNS特殊处理 iptables -t nat -I PREROUTING -p tcp -d 8.8.8.8 -j clash_dns iptables -t nat -I PREROUTING -p tcp -d 8.8.4.4 -j clash_dns #ipv6DNS - ip6tables -t nat -N clashv6_dns > /dev/null 2>&1 - for mac in $(cat $clashdir/mac); do - ip6tables -t nat -A clashv6_dns -m mac --mac-source $mac -j RETURN > /dev/null 2>&1 - done - ip6tables -t nat -A clashv6_dns -p udp --dport 53 -j REDIRECT --to 1053 > /dev/null 2>&1 - ip6tables -t nat -A PREROUTING -p udp -j clashv6_dns > /dev/null 2>&1 -} -checkcron(){ - [ -d /etc/crontabs/ ]&&cronpath="/etc/crontabs/root" - [ -d /var/spool/cron/ ]&&cronpath="/var/spool/cron/root" - [ -d /var/spool/cron/crontabs/ ]&&cronpath="/var/spool/cron/crontabs/root" - [ -z $cronpath ]&&echo "找不到定时任务文件,无法添加定时任务!" + ip6_nat=$(ip6tables -t nat -L 2>&1|grep -o 'not exist') + if [ -z "ip6_nat" ];then + ip6tables -t nat -N clashv6_dns > /dev/null 2>&1 + for mac in $(cat $clashdir/mac); do + ip6tables -t nat -A clashv6_dns -m mac --mac-source $mac -j RETURN > /dev/null 2>&1 + done + ip6tables -t nat -A clashv6_dns -p udp --dport 53 -j REDIRECT --to $dns_port > /dev/null 2>&1 + ip6tables -t nat -A PREROUTING -p udp -j clashv6_dns > /dev/null 2>&1 + else + ip6tables -I INPUT -p tcp --dport 53 -j DROP + fi } daemon(){ - checkcron - echo '*/1 * * * * test -z "$(pidof clash)" && /etc/init.d/clash restart #clash守护进程' >> $cronpath - chmod 600 $cronpath + if [ -n "$cronpath" ];then + echo '*/1 * * * * test -z "$(pidof clash)" && /etc/init.d/clash restart #clash保守模式守护进程' >> $cronpath + chmod 600 $cronpath + else + echo 找不到定时任务配置文件,无法添加守护进程! + echo 请进入定时任务菜单手动指定系统定时任务文件路径!!! + fi } afstart(){ #读取配置文件 @@ -305,10 +302,6 @@ afstart) start) #读取配置文件 getconfig - #检测系统端口占用 - for portx in 1053 7890 7892 9999 ;do - [ -n "$(netstat -ntul |grep :$portx)" ] && echo "检测到端口【$portx】被以下进程占用!clash无法启动!" && echo $(netstat -ntulp |grep :$portx) && exit 1 - done #使用内置规则强行覆盖config配置文件 [ "$modify_yaml" != "已开启" ] && modify_yaml #使用不同方式启动clash服务 @@ -323,9 +316,10 @@ start) fi ;; stop) - #删除守护 - checkcron - sed -i /clash守护进程/d $cronpath >/dev/null 2>&1 + #读取配置文件 + getconfig + #删除守护进程 + sed -i /clash保守模式守护进程/d $cronpath >/dev/null 2>&1 #多种方式结束进程 if [ -f /etc/rc.common ];then /etc/init.d/clash stop >/dev/null 2>&1