CloudflareSpeedTest
CloudflareSpeedTest copied to clipboard
OpenWrt 路由器定时测速获得优质 IP 并替换指定 PassWall 节点 IP 的脚本
#!/bin/bash
# 进入 CloudflareST 目录(脚本示例中的 CloudflareST 位于 /root/CloudflareST 目录下,不一样的话自己改这里)
# 之所以要进入文件夹去执行,是为了以相对路径运行,对于新手使用来说能避免很多路径方面问题的出现
cd /root/CloudflareST
# 运行 CloudflareST 测速(自行根据需求修改参数)
./CloudflareST -tll 90
# 获取最快 IP(从 result.csv 结果文件中获取第一个 IP)
IP=$(sed -n "2,1p" result.csv | awk -F, '{print $1}')
# 判断一下是否成功获取到了最快 IP(如果没有就退出脚本):
[[ -z "${IP}" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
# 修改 passwall 里对应节点的 IP(XXXXXX 就是节点 ID)
uci set passwall.XXXXXX.address="${IP}"
# 最后再重启一下 passwall
uci commit passwall
/etc/init.d/haproxy restart
/etc/init.d/passwall restart
将这个脚本添加到 crontab 中定时运行即可。
至于 CloudflareST 文件如何下载解压使用可以参考项目说明中写的 Linux 使用示例。
# 如何获取 PassWall 节点 ID?
查看 PassWall 配置文件:
cat /etc/config/passwall
每个节点配置顶部都有一行 config nodes 'XXXXXX' ,其中 XXXXXX 就是节点 ID。
上面是我自己鼓捣的,我本人小小白没学过 linux 各种命令,~~我知道我写的 shell 不对,需要检测上一个 shell 是否完成才能赋值,赋值我也不会~~(已经帮忙修改)。求助路过的大佬指点迷津。我就是想实现利用脚本定时筛选 IP 替换翻墙用的 IP 节点! 我之前用的是 https://github.com/badafans/better-cloudflare-ip
你这是现成的脚本?还是命令步骤?给我看蒙了都。。。颠三倒四的感觉。。。
我以前给一个 openwrt 上用 passwall 的也折腾过,不过我对 openwrt 不熟悉,只是帮写了个脚本,并远程协助配置了下。。。
你想要表达的意思是不是这个:
运行 CloudflareST 测速(注意 -tp 默认值就是 443 因此可以省略),
/root/CloudflareST/CloudflareST -tll 90
获取最快 IP,
IP=$(sed -n "2,1p" /root/CloudflareST/result.csv | awk -F, '{print $1}')
然后判断一下是否获取到了最快 IP(如果没有就退出脚本):
[[ -z "${IP}" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
然后这样修改 passwall 里的 IP?
uci set passwall.xxxxxxxxxxxxx.address=IP
最后再重启一下?
uci commit passwall
/etc/init.d/haproxy restart
/etc/init.d/passwall restart
感谢大佬,openwrt也是linux系统吧。怎么感觉好像没有测速吧,我试了可以很快就完成替换。还是很感谢你抽时间帮助
有需要,我可以提供远程协助帮忙解决一些问题,虽然我对 openwrt 不熟,但是对 Linux、Shell 脚本什么的比较熟。
顺便可以帮你完善一下脚本,这样这个 Issues 也能帮到后来者~
远程协助软件(这个是只有被控功能的单文件版),告诉我你的设备代码、临时密码(我看到后会删除)。 https://dl.todesk.com/windows/ToDesk_Lite.exe
你发的是 better-cloudflare-ip 项目的脚本文件呀。。。
可是你发的这个脚本我和项目也没啥关系呀。。。 里面压根都没有 CloudflareST。
就是用的那位大佬的,直接筛选后借用获取的赋值直接替换 passwall节点ip 用trojan-go 搭配cf的优选节点可以实现本地加速。我是看到你的脚本,想到能不能同样的实现替换ip。没别的意思。
只用我的 CloudflareST 的话,脚本不需要这么长,几行代码最多十几行就写完了。
我前面(3L)就已经把需要的脚本核心代码都写出来了,组合起来就差不多能用了。
另外,如果以绝对路径运行 CloudflareST,那么就需要手动指定绝对路径的 -f、-o 参数,否则软件会因为找不到 ip.txt 而报错
那位大佬的脚本,每次只能测试100个ip。是的我也只是想试试,能不能实现。可是发现我没基础,鼓捣半天也没成功
我看到你的项目,确实能更少的代码就能实现,还是多谢您的帮助
如果你完全没有 Shell 基础的话,那就别折腾了,我直接远程协助帮你写脚本 + 配置好,节省双方时间(相比直接教你而言)。
再次感谢大佬热情执着的帮助,用大佬的脚本,简短的命令就能实现 在openwrt 定时筛选cf本地最优ip 并替换passwall的trojan-go vless ws协议的ip地址,加速。让垃圾,晚高峰获得更优速度!大佬很耐心细心!!!!再次感谢。大佬已经把脚本完善,太贴心了!!!!!
非常感谢,已用上
likefu40,分享一下脚本?
@bluewyj 脚本就是 1L 的内容,我已经帮它改好了,并且已经远程协助在他的路由器上运行验证过了。
@XIU2 谢谢也用上了
#!/bin/bash
sleep 8s
/etc/init.d/haproxy stop
/etc/init.d/passwall stop
# 进入 CloudflareST 目录
cd /root/CloudflareST
# 运行 CloudflareST 测速(脚本示例中的 CloudflareST 位于 /root/CloudflareST 目录下)
./CloudflareST -tll 90
# 获取最快 IP
IP=$(sed -n "2,1p" result.csv | awk -F, '{print $1}')
# 判断一下是否成功获取到了最快 IP(如果没有就退出脚本):
[[ -z "${IP}" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
# 修改 passwall 里对应节点的 IP(XXX 就是节点 ID)
uci set passwall.xxxxxxx.address="${IP}"
uci commit passwall
/etc/init.d/haproxy restart
/etc/init.d/passwall restart
exit
#!/bin/bash sleep 8s /etc/init.d/haproxy stop /etc/init.d/passwall stop # 进入 CloudflareST 目录 cd /root/CloudflareST # 运行 CloudflareST 测速(脚本示例中的 CloudflareST 位于 /root/CloudflareST 目录下) ./CloudflareST -tll 90 # 获取最快 IP IP=$(sed -n "2,1p" result.csv | awk -F, '{print $1}') # 判断一下是否成功获取到了最快 IP(如果没有就退出脚本): [[ -z "${IP}" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0 # 修改 passwall 里对应节点的 IP(XXX 就是节点 ID) uci set passwall.xxxxxxx.address="${IP}" uci commit passwall /etc/init.d/haproxy restart /etc/init.d/passwall restart exit
passwall支持路由器自身代理为gfw模式,这样就不用筛选ip时停止passwall了!
@RealKiro 估计是没什么人看 discussions 吧。。。大家都习惯用 Issues 了,虽然我也在 Releases 中提到了这个项目链接。
这个很有用,谢谢了
SSR-PLUS要怎么弄呢?
./CloudflareST -tll 90 -p 30 输出结果没有显示30条测试结果?
@peter2022 你的最终测速结果数量 >= 30 条,才能显示出来 30 条。
#!/bin/bash
# sleep 8s
bash /etc/init.d/haproxy stop
bash /etc/init.d/passwall stop
# 进入 CloudflareST 目录
# cd /root/CloudflareST
# 运行 CloudflareST 测速(脚本示例中的 CloudflareST 位于 /root/CloudflareST 目录下)
/root/CloudflareST/CloudflareST -f ip.txt -o result.csv -tll 90 -p 30 -url https://***.workers.dev/200mb.test
# 获取最快 IP
IP=$(sed -n "2,1p" /root/CloudflareST/result.csv | awk -F, '{print $1}')
# 判断一下是否成功获取到了最快 IP(如果没有就退出脚本):
[[ -z "${IP}" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
# 修改 passwall 里对应节点的 IP(XXX 就是节点 ID)
uci set passwall.***.address="${IP}"
uci commit passwall
bash /etc/init.d/haproxy restart
bash /etc/init.d/passwall restart
exit
麻烦帮我看看我改的代码,放入n1的openwrt 提示 open ip.txt: no such file or directory uci: Parse error 需要加什么参数才能测试30个以上的Ip 啊?
@peter2022 你的最终测速结果数量 >= 30 条,才能显示出来 30 条。
@peter2022 这就是我说过的绝对路径、相对路径的问题,你没明白它们的区别就去修改 1L 的脚本就是这结果。。。
你用的是绝对路径,而默认的 -f ip.txt -o result.csv 参数都是相对路径(相对于执行脚本的目录,而不是程序所在目录),改回相对路径就行了(或者把 -f -o 参数中的文件名改为绝对路径)。
# 进入 CloudflareST 目录
cd /root/CloudflareST
# 运行 CloudflareST 测速(脚本示例中的 CloudflareST 位于 /root/CloudflareST 目录下)
./CloudflareST -f ip.txt -o result.csv -tll 90 -p 30 -url https://***.workers.dev/200mb.test
我写的脚本,每一行都是有其意义的,如果不清楚不要乱改。。。
#!/bin/bash
# sleep 8s
bash /etc/init.d/haproxy stop
bash /etc/init.d/passwall stop
# 进入 CloudflareST 目录
cd /root/CloudflareST
# 运行 CloudflareST 测速(脚本示例中的 CloudflareST 位于 /root/CloudflareST 目录下)
./CloudflareST -f ip.txt -o result.csv -tll 90 -p 30 -url https://***.workers.dev/200mb.test
# 获取最快 IP
IP=$(sed -n "2,1p" /root/CloudflareST/result.csv | awk -F, '{print $1}')
# 判断一下是否成功获取到了最快 IP(如果没有就退出脚本):
[[ -z "${IP}" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
# 修改 passwall 里对应节点的 IP(XXX 就是节点 ID)
uci set passwall.***.address="${IP}"
uci commit passwall
bash /etc/init.d/haproxy restart
bash /etc/init.d/passwall restart
exit
我一开始时按照1L的代码执行的,但是出现如下提示。不知道问题出在什么地方。。。。我看第6 8行没问题啊 你解释的很清楚,我没有注意看,也有一种方法就是把 ip.txt 和 result.csv 放到root下一份,也就是执行脚本下一份。 请问你的这个执行脚本CloudflareST 必须通过另一个脚本来调用吗?可以将上面的代码写入到你的脚本里吗?也就是一个脚本来运行。
root@n1:~# chmod +x cf-auto-passwall.sh && bash cf-auto-passwall.sh
cf-auto-passwall.sh: line 6: cd: $'/root/CloudflareST\r': No such file or directory
cf-auto-passwall.sh: line 8: ./CloudflareST: Is a directory
uci: Parse error
@peter2022 看起来像是行尾序列的问题(看到了 \r 字符)。 Windows 和 Linux 的行尾序列不一样(也可以叫做换行符)。
Windows 是 \r\n 而 Linux 则是 \n,这些字符默认是不可见的,是用来表示该行到头了要换行了。
# 比如在 Windows 下,你看到的
cd /root/CloudflareST
# 实际上是这样(Windows 会自动忽略 \r\n 换行符):
cd /root/CloudflareST\r\n
# 但是如果将这个直接写入到 Linux 系统的脚本中,你看起来是这样的:
cd /root/CloudflareST
# 但实际上在 Linux 看来是这样的:
cd /root/CloudflareST\r\n
# 在运行该命令时,Linux 会照例自动忽略 \n 换行符,因此最终会被当成这样去执行:
cd /root/CloudflareST\r
你这种情况,可能是编辑脚本时用的是 Windows 编辑器,或者直接在复制粘贴的,都默认用的是 Windows 的 \r\n。 解决方法有很多,比如:
- 使用支持修改行尾序列(换行符格式)的 Windows 编辑器。
- 直接用 SSH 在 Linux 系统下用命令行编辑操作(建议先删除文件,再去新建并写入脚本)。
另外,Windows 自带的记事本虽然不能修改,但能显示文件当前的行尾序列(右下角状态条 CRLF、LF 对应 \r\n、\n)。
你说的这个脚本调用什么,我无法理解你要表达什么意思。
另外,对于多行代码,要用 3 个 ` 符号(即 ``` )包裹代码才行。
/etc/init.d/haproxy stop /etc/init.d/passwall stop 请问这两个命令,停止pw 和ha后,跑CloudflareST,延迟测速跑得非常快,下载测速测出的速度也就在10-20M之间,pw基本设置-模式-tcp udp的模式选择中国列表以外。 当选择pw的tcp udp的模式(或者路由器自身 TCP UDP代理模式 gfw) 选择gfw列表时,延迟和下载都正常。 请问passwall stop 无效吗? 问题出在哪里?
@peter2022 你的意思是:
当代理模式为:中国列表以外 时(白名单),无论是否关闭代理插件都会导致 CloudflareST 测速异常?(请贴出测速结果内容
当代理模式为:GFW 列表 时(黑名单),无论是否关闭代理插件都测速正常?(请贴出测速正常时的结果内容