├── kill-cf-auto-passwall.sh ├── README.md └── cf-auto-passwall.sh /kill-cf-auto-passwall.sh: -------------------------------------------------------------------------------- 1 | #杀路由cf脚本进程,防止网络差死循环,也设定时任务,在启动cf脚本后自定义时间启动删除如8点半退行CF脚本。9点杀进程,0 9 * * * bash /usr/dns/kill-cf-openwrt.sh(路径自己改) 2 | ps -ef | grep cf-auto-passwall.sh | grep -v grep | xargs kill -9 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 自动替换 PassWall 里面的 WS 节点地址 为 CF 优选的IP 2 | ## 新增微信推送 杀脚本命令 更新脚本20210106 3 | 4 | 5 | 用途:用于自动筛选 CF IP,并自动替换优选 IP 为 PassWall 的节点地址,并将结果推送到微信 6 | 7 | 本脚本源于 GitHub:Lbingyi Paniy badafans 8 | 9 | ## 使用说明 10 | 11 | 在使用passwall的基础上,太老版本不支持,看节点是否有 option tcp_node id字段,懂点基础的也可以根据id,参数等节点自行修改脚本(思路无非是通过id找节点) 12 | 13 | * 输入命令 vi /etc/config/passwall 信息里面的 config global —— option tcp_node 后面的字符串,为你正在使用的自定义节点的绑定字符串 14 | 15 | > 关于 vi 的相关操作: 16 | 按键盘上面的 PgUp 和 PgDn 进行翻页,按 i 键进行编辑,按 esc 退出编辑,按 :wq 保存并退出 vi 命令 17 | 18 | * 在软路由里面下载 cf-auto-passwall 脚本 19 | 20 | > ``wget https://raw.githubusercontent.com/ddong1031/openwrt_cf/main/cf-auto-passwall.sh`` 21 | >> 已经下载用过之前脚本的请使用命令``ls``查看是否存在重名脚本,并使用``rm cf-auto-passwall.sh``删除当前重名文件后重新运行``wget https://raw.githubusercontent.com/ddong1031/openwrt_cf/main/cf-auto-passwall.sh`` 22 | 23 | > 下载后,脚本的绝对地址为 /root/cf-auto-passwall.sh 24 | 25 | * 添加微信推送 26 | 27 | >> pushplus API接口申请地址:[点击进入](https://pushplus.hxtrip.com) 微信扫码登录获取token 28 | 29 | >> ![示例](https://wxf2088.xyz/wp-content/uploads/2021/02/1612271787-3f6482561574dfa.jpg) 30 | 31 | >> 选择一对一推,记录你的微信token,稍后会在脚本中用到 32 | 33 | * 编辑该脚本 34 | 35 | >> vi cf-auto-passwall.sh 36 | >> 更改相关的参数(默认优选带宽大小 字段 ``bandwidth``、节点相对应的字符串),并保存 37 | >>> passwall 节点id替换 ``xxxxxxxxxx`` 微信的token 替换最后curl开头的``你的id`` 38 | 39 | 40 | * 软路由运行下,看看出没出错。 41 | 42 | > ``chmod +x cf-auto-passwall.sh && bash cf-auto-passwall.sh`` 43 | > 运行完会在优选完ip之后 及时推送到微信中 此时查看passwall中的节点地址已经替换 44 | 45 | * 加在 openwrt 上系统 计划任务里 添加定时运行 46 | 47 | > 如 0 4 * * 2,4,6 bash /root/cf-auto-passwall.sh > /dev/null 48 | > 0 4 * * 2,4,6 的意思是在每周二、周四、周六的凌晨4点会自动运行一次。/root/cf-auto-passwall.sh 是你脚本的绝对地址 49 | 50 | * 如果存在死循环问题 可以下载杀脚本命令 并添加到计划任务中 51 | 52 | > 脚本 地址 ``wget https://raw.githubusercontent.com/ddong1031/openwrt_cf/main/kill-cf-auto-passwall.sh`` 53 | 54 | > 计划任务 在 设定完优选IP后 建议在5-10分钟左右 执行``5 4 * * * bash /root/kill-cf-auto-passwall.sh > /dev/null`` 如果怕没权限 可以下运行一下``chmod +x kill-cf-auto-passwall.sh``赋予权限 55 | 56 | > 时程表的格式如下: 57 | > 58 | > f1 f2 f3 f4 f5 program 59 | > 60 | > 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。 61 | > 62 | > 0 03 * * * 表示每天的凌晨三点 63 | 64 | 65 | # 喜欢点个Star,自用 定期更新 66 | 67 | ## 注意事项 68 | 69 | 1、请在脚本中修改你期望优选 IP 的带宽大小(默认50M) 70 | 71 | 2、请替换 51行``passwall.xxxxxxxxxx.address=$anycast``中xxxxxxxxxx 字符串为你自己 PassWall 的节点值 72 | 73 | 3、微信推送 替换 53行``curl -s -o /dev/null --data "token=你的id&`` 中你的id 替换为你自己的微信token 74 | 75 | 4、修改 359 行的 menu 数值来控制操作,menu默认=1 不清除缓存,需要清除缓存请修改 menu=0,需要ipv6等请修改脚本的menu指向及相关参数 76 | 77 | 5、杀脚本命令 通常没有必要 如果 出现一直 等待icmp进程结束 剩余进程数 说明固件缺少命令包 请换固件或者尝试下载完整命令包 例如brew等自行google 78 | 79 | ## 网址借鉴 80 | 81 | * 脚本源 badafans https://github.com/badafans/better-cloudflare-ip 82 | 83 | -------------------------------------------------------------------------------- /cf-auto-passwall.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # better-cloudflare-ip 3 | version=20220208 4 | 5 | function bettercloudflareip (){ 6 | declare -i bandwidth 7 | declare -i speed 8 | #read -p "请设置期望的带宽大小(默认0,单位 Mbps):" bandwidth 9 | #read -p "请设置RTT测试进程数(默认25,最大50):" tasknum 10 | bandwidth=48 11 | tasknum=35 12 | if [ -z "$tasknum" ] 13 | then 14 | tasknum=25 15 | fi 16 | if [ $tasknum -eq 0 ] 17 | then 18 | echo 进程数不能为0,自动设置为默认值 19 | tasknum=25 20 | fi 21 | if [ $tasknum -gt 50 ] 22 | then 23 | echo 超过最大进程限制,自动设置为最大值 24 | tasknum=50 25 | fi 26 | speed=bandwidth*128*1024 27 | starttime=$(date +'%Y-%m-%d %H:%M:%S') 28 | cloudflaretest 29 | declare -i realbandwidth 30 | realbandwidth=max/128 31 | endtime=$(date +'%Y-%m-%d %H:%M:%S') 32 | start_seconds=$(date --date="$starttime" +%s) 33 | end_seconds=$(date --date="$endtime" +%s) 34 | clear 35 | curl --$ips --resolve service.anycast.eu.org:443:$anycast --retry 3 -s -X POST https://service.anycast.eu.org -o temp.txt 36 | publicip=$(grep publicip= temp.txt | cut -f 2- -d'=') 37 | colo=$(grep colo= temp.txt | cut -f 2- -d'=') 38 | rm -rf temp.txt 39 | echo $anycast>$ips.txt 40 | echo 优选IP $anycast 41 | echo 公网IP $publicip 42 | echo 自治域 AS$asn 43 | echo 经纬度 $longitude,$latitude 44 | echo META城市 $city 45 | echo 设置带宽 $bandwidth Mbps 46 | echo 实测带宽 $realbandwidth Mbps 47 | echo 峰值速度 $max kB/s 48 | echo 往返延迟 $avgms 毫秒 49 | echo 数据中心 $colo 50 | echo 总计用时 $((end_seconds-start_seconds)) 秒 51 | uci set passwall.xxxxxxxxxx.address=$anycast 52 | uci commit passwall 53 | curl -s -o /dev/null --data "token=你的id&title=$anycast更新成功!&content= 优选IP $anycast 满足 $bandwidth Mbps带宽需求
峰值速度 $max kB/s
实测带宽 $realbandwidth Mbps
数据中心 $colo
当前程序版本 $app
总计用时 $((end_seconds-start_seconds)) 秒
&template=html" http://pushplus.hxtrip.com/send 54 | sleep 1 55 | /etc/init.d/haproxy start 56 | /etc/init.d/passwall start 57 | } 58 | 59 | function rtt (){ 60 | declare -i avgms 61 | declare -i getrtt 62 | t=1 63 | n=1 64 | for ip in `cat rtt/$1.txt` 65 | do 66 | while true 67 | do 68 | if [ $t -le 5 ] 69 | then 70 | curl --resolve www.cloudflare.com:443:$ip https://www.cloudflare.com/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 -w "$ip"_%{time_connect}_"HTTP"%{http_code}"\n">>rtt/$1-$n.log 71 | t=$[$t+1] 72 | else 73 | ipaddr=$(cat rtt/$1-$n.log | awk 'NR==1' | awk -F_ '{print $1}') 74 | getrtt=$(grep HTTP200 rtt/$1-$n.log | wc -l) 75 | if [ $getrtt == 0 ] 76 | then 77 | rm -rf rtt/$1-$n.log 78 | n=$[$n+1] 79 | t=1 80 | break 81 | fi 82 | avgms=0 83 | for i in `grep HTTP200 rtt/$1-$n.log | awk -F_ '{printf ("%d\n",$2*1000000)}'` 84 | do 85 | avgms=$i+avgms 86 | done 87 | avgms=(avgms/getrtt)/1000 88 | getrtt=5-getrtt 89 | if [ $avgms -lt 10 ] 90 | then 91 | echo $getrtt 00$avgms $ipaddr>rtt/$1-$n.log 92 | elif [ $avgms -ge 10 ] && [ $avgms -lt 100 ] 93 | then 94 | echo $getrtt 0$avgms $ipaddr>rtt/$1-$n.log 95 | else 96 | echo $getrtt $avgms $ipaddr>rtt/$1-$n.log 97 | fi 98 | n=$[$n+1] 99 | t=1 100 | break 101 | fi 102 | done 103 | done 104 | rm -rf rtt/$1.txt 105 | } 106 | 107 | function speedtest (){ 108 | curl --resolve $domain:443:$1 https://$domain/$file -o /dev/null --connect-timeout 5 --max-time 10 > log.txt 2>&1 109 | cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep -v 'k\|M' >> speed.txt 110 | for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep k | sed 's/k//g'` 111 | do 112 | declare -i k 113 | k=$i 114 | k=k*1024 115 | echo $k >> speed.txt 116 | done 117 | for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep M | sed 's/M//g'` 118 | do 119 | i=$(echo | awk '{print '$i'*10 }') 120 | declare -i M 121 | M=$i 122 | M=M*1024*1024/10 123 | echo $M >> speed.txt 124 | done 125 | declare -i max 126 | max=0 127 | for i in `cat speed.txt` 128 | do 129 | if [ $i -ge $max ] 130 | then 131 | max=$i 132 | fi 133 | done 134 | rm -rf log.txt speed.txt 135 | echo $max 136 | } 137 | 138 | function cloudflaretest (){ 139 | while true 140 | do 141 | while true 142 | do 143 | declare -i ipnum 144 | declare -i iplist 145 | declare -i n 146 | rm -rf rtt data.txt meta.txt log.txt anycast.txt temp.txt speed.txt 147 | mkdir rtt 148 | while true 149 | do 150 | if [ ! -f "$ips.txt" ] 151 | then 152 | echo DNS解析获取CF $ips 节点 153 | echo 如果域名被污染,请手动创建 $ips.txt 做解析 154 | while true 155 | do 156 | if [ ! -f "meta.txt" ] 157 | then 158 | curl --$ips --retry 3 -s https://speed.cloudflare.com/meta | sed -e 's/{//g' -e 's/}//g' -e 's/"//g' -e 's/,/\n/g'>meta.txt 159 | else 160 | asn=$(grep asn: meta.txt | awk -F: '{print $2}') 161 | city=$(grep city: meta.txt | awk -F: '{print $2}') 162 | latitude=$(grep latitude: meta.txt | awk -F: '{print $2}') 163 | longitude=$(grep longitude: meta.txt | awk -F: '{print $2}') 164 | curl --$ips --retry 3 https://service.anycast.eu.org -o data.txt -# 165 | break 166 | fi 167 | done 168 | else 169 | echo 指向解析获取CF $ips 节点 170 | echo 如果长时间无法获取CF $ips 节点,重新运行程序并选择清空缓存 171 | resolveip=$(cat $ips.txt) 172 | while true 173 | do 174 | if [ ! -f "meta.txt" ] 175 | then 176 | curl --$ips --resolve speed.cloudflare.com:443:$resolveip --retry 3 -s https://speed.cloudflare.com/meta | sed -e 's/{//g' -e 's/}//g' -e 's/"//g' -e 's/,/\n/g'>meta.txt 177 | else 178 | asn=$(grep asn: meta.txt | awk -F: '{print $2}') 179 | city=$(grep city: meta.txt | awk -F: '{print $2}') 180 | latitude=$(grep latitude: meta.txt | awk -F: '{print $2}') 181 | longitude=$(grep longitude: meta.txt | awk -F: '{print $2}') 182 | curl --$ips --resolve service.anycast.eu.org:443:$resolveip --retry 3 https://service.anycast.eu.org -o data.txt -# 183 | break 184 | fi 185 | done 186 | fi 187 | if [ -f "data.txt" ] 188 | then 189 | break 190 | fi 191 | done 192 | domain=$(grep domain= data.txt | cut -f 2- -d'=') 193 | file=$(grep file= data.txt | cut -f 2- -d'=') 194 | url=$(grep url= data.txt | cut -f 2- -d'=') 195 | app=$(grep app= data.txt | cut -f 2- -d'=') 196 | if [ "$app" != "$version" ] 197 | then 198 | echo 发现新版本程序: $app 199 | echo 更新地址: $url 200 | echo 更新后才可以使用 201 | echo 尝试替换新版本 202 | #exit 203 | fi 204 | if [ $selfmode == 1 ] 205 | then 206 | rm -rf data.txt 207 | n=0 208 | while true 209 | do 210 | if [ $n == 256 ] 211 | then 212 | break 213 | else 214 | echo $selfip.$n>>anycast.txt 215 | n=n+1 216 | fi 217 | done 218 | else 219 | for i in `cat data.txt | sed '1,4d'` 220 | do 221 | echo $i>>anycast.txt 222 | done 223 | fi 224 | rm -rf meta.txt data.txt 225 | ipnum=$(cat anycast.txt | wc -l) 226 | if [ $ipnum -lt $tasknum ] 227 | then 228 | tasknum=ipnum 229 | fi 230 | iplist=ipnum/tasknum 231 | declare -i a=1 232 | declare -i b=1 233 | for i in `cat anycast.txt` 234 | do 235 | echo $i>>rtt/$b.txt 236 | if [ $a == $iplist ] 237 | then 238 | a=1 239 | b=b+1 240 | else 241 | a=a+1 242 | fi 243 | done 244 | rm -rf anycast.txt 245 | if [ $a != 1 ] 246 | then 247 | a=1 248 | b=b+1 249 | fi 250 | while true 251 | do 252 | if [ $a == $b ] 253 | then 254 | break 255 | else 256 | rtt $a & 257 | fi 258 | a=a+1 259 | done 260 | while true 261 | do 262 | sleep 2 263 | n=$(ls rtt | grep txt | grep -v "grep" | wc -l) 264 | if [ $n -ne 0 ] 265 | then 266 | echo 等待RTT测试结束,剩余进程数 $n 267 | else 268 | echo RTT测试完成 269 | break 270 | fi 271 | done 272 | n=$(ls rtt | wc -l) 273 | if [ $n -ge 5 ] 274 | then 275 | cat rtt/*.log | sort | awk '{print $2"_"$3}'>ip.txt 276 | echo 待测速的IP地址 277 | echo $(sed -n '1p' ip.txt | awk -F_ '{print "第1个IP "$2" 往返延迟 "$1" 毫秒"}') 278 | echo $(sed -n '2p' ip.txt | awk -F_ '{print "第2个IP "$2" 往返延迟 "$1" 毫秒"}') 279 | echo $(sed -n '3p' ip.txt | awk -F_ '{print "第3个IP "$2" 往返延迟 "$1" 毫秒"}') 280 | echo $(sed -n '4p' ip.txt | awk -F_ '{print "第4个IP "$2" 往返延迟 "$1" 毫秒"}') 281 | echo $(sed -n '5p' ip.txt | awk -F_ '{print "第5个IP "$2" 往返延迟 "$1" 毫秒"}') 282 | n=0 283 | for ip in `cat ip.txt` 284 | do 285 | if [ $n == 5 ] 286 | then 287 | echo 没有满足速度要求的IP 288 | break 289 | else 290 | n=n+1 291 | fi 292 | avgms=$(echo $ip | awk -F_ '{print $1}') 293 | ip=$(echo $ip | awk -F_ '{print $2}') 294 | echo 正在测试 $ip 295 | max=$(speedtest $ip) 296 | if [ $max -ge $speed ] 297 | then 298 | anycast=$ip 299 | max=$[$max/1024] 300 | echo $ip 峰值速度 $max kB/s 301 | break 302 | else 303 | max=$[$max/1024] 304 | echo $ip 峰值速度 $max kB/s 305 | fi 306 | done 307 | rm -rf rtt ip.txt 308 | if [ $n != 5 ] 309 | then 310 | break 311 | fi 312 | else 313 | echo 当前所有IP都存在RTT丢包 314 | tasknum=10 315 | fi 316 | done 317 | break 318 | done 319 | } 320 | 321 | function singletest (){ 322 | read -p "请输入需要测速的IP: " testip 323 | curl --resolve service.anycast.eu.org:443:$testip https://service.anycast.eu.org -o temp.txt -# 324 | domain=$(grep domain= temp.txt | cut -f 2- -d'=') 325 | file=$(grep file= temp.txt | cut -f 2- -d'=') 326 | rm -rf temp.txt 327 | curl --resolve $domain:443:$testip https://$domain/$file -o /dev/null --connect-timeout 5 --max-time 15 328 | } 329 | 330 | function clearCache (){ 331 | rm -rf ipv4.txt ipv6.txt rtt data.txt meta.txt log.txt anycast.txt temp.txt speed.txt 332 | #clear 333 | echo 缓存已经清空 334 | } 335 | 336 | green(){ 337 | echo -e "\033[32m\033[01m$1\033[0m" 338 | } 339 | 340 | red(){ 341 | echo -e "\033[31m\033[01m$1\033[0m" 342 | } 343 | 344 | while true 345 | do 346 | clear 347 | red "脚本源 badafans 地址 https://github.com/badafans/better-cloudflare-ip" 348 | echo 需要先清空缓存然后进行IPV4优选,请修改menu=0,ipv6请自行修改menu等参数 349 | green "=================脚本正在运行中.....=======================" 350 | #echo 2. IPV6优选 351 | #echo 3. 自定义IPV4段 352 | #echo 4. 单IP测速 353 | #echo 5. 清空缓存 354 | #echo 0. 退出 355 | #read -p "请选择菜单: " menu 356 | /etc/init.d/haproxy stop 357 | /etc/init.d/passwall stop 358 | sleep 8 359 | menu=1 360 | if [ $menu == 0 ] 361 | then 362 | clearCache 363 | ips=ipv4 364 | selfmode=0 365 | bettercloudflareip 366 | break 367 | fi 368 | if [ $menu == 1 ] 369 | then 370 | ips=ipv4 371 | selfmode=0 372 | bettercloudflareip 373 | break 374 | fi 375 | if [ $menu == 2 ] 376 | then 377 | ips=ipv6 378 | selfmode=0 379 | bettercloudflareip 380 | break 381 | fi 382 | if [ $menu == 3 ] 383 | then 384 | ips=ipv4 385 | selfmode=1 386 | read -p "请输入C类自定义IPV4(格式 1.1.1):" selfip 387 | bettercloudflareip 388 | break 389 | fi 390 | if [ $menu == 4 ] 391 | then 392 | singletest 393 | clear 394 | echo 测速完毕 395 | fi 396 | if [ $menu == 5 ] 397 | then 398 | clearCache 399 | fi 400 | done 401 | --------------------------------------------------------------------------------