├── 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 | >> 
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 |
--------------------------------------------------------------------------------