GitHub Proxy 更新 支持在一行内 wget 下载再执行的形式
现象
一直以来, 在各种地方不断地看到在不同的环境下跑Github脚本不成功的网友.
有些一键脚本的作者为了美观(装B)会带上不显示错误信息的参数, 比如 wget -q 和 curl -s
这样, 如果出错就一点显示都没有. 对不懂的小白来说, 连用微信扫一扫翻译错误信息的机会都没有.
比如, 这位仁兄
出错的原因
可能是Github访问不通 (在有些NAT鸡或IPv6鸡的环境下出现),
可能是Github的API接口访问次数过多 (一般在脚本查询最新版本的地方容易出现. 原因常常是, 为了解决上一个问题, 装了WARP, 然后从WARP的这条路去访问Github的人太多了)
解决方案
我思考的解决方案就是换一条路去访问Github.
比如, Cloudflare理应是一个在全世界很多地方都可以顺利访问的网络资源, 那么我们在Cloudflare的worker上面搭建这样的Github Proxy.
考虑到国内网络的情况, 我发现 Replit 的域名没被墙, 我又写了一篇在Replit上面搭建这样的Github Proxy.
Feedback
以前我还考虑到会有Github脚本调用Github脚本的嵌套调用的情况, 所以我只考虑了处理类似 bash <( curl xxxx.sh) 的形式. 而且我觉得每次都从服务器获取最新的脚本, 这样不会遗留BUG.
我也在一些TG群里解答问题时顺带表达过这样的思考. 不过, 看上去大家不怎么接受.
有些一键脚本的作者考虑到 wget 的形式会保存一份脚本文件在VPS上, 这样下次就不需要又下载一次了, 直接跑保存好的脚本就行了. 就会使用先 wget 下载, 然后执行脚本的形式.
比如:
wget -O tcpx.sh "https://git.io/JYxKU" && chmod +x tcpx.sh && ./tcpx.sh
wget -N --no-check-certificate https://raw.githubusercontent.com/Misaka-blog/hysteria-install/main/hy2/hysteria.sh && bash hysteria.sh
那么我想, 好吧, 如果不考虑嵌套调用的情况; 不考虑 wget 再执行写成多行的情况; 就还是可以处理的.
具体实践
对于 bash <( curl xxx.sh) 或 bash <( wget -O- xxx.sh) 的情况
// 正则表达式
regex1 = /(bash.*?)(https?:\/\/.*?)(\).*)/s;
// 只处理一层Github脚本
// 替换表达式
replacement2 = '$1' + ghproxy + '$2' + ' | perl -pe "s#(http.*?git[^/]*?/)#' + ghproxy + '\\1#g"' + '$3';
// 处理后的结果
resultStr2 = inputStr.replace(regex1, replacement2);
对于 wget xxx.sh && bash xxx.sh 或 wget xxx.sh && chmod +x xxx.sh && ./xxx.sh 的情况
// 正则表达式regex2 = /(wget.*?)(https?:\/\/.*)(&&[^&]*[ /])(.*?sh)/s;// 只处理一层Github脚本// 替换表达式replacement3 = '$1' + ghproxy + '$2' + '&& perl -i -pe "s#(http.*?git[^/]*?/)#' + ghproxy + '\\1#g" ' + '$4 $3$4';// 处理后的结果resultStr2 = inputStr.replace(regex2, replacement3);
========
完
更新到Github: https://github.com/crazypeace/gh-proxy
欢迎试用:
https://ghproxy.crazypeace.workers.dev/
https://ghproxy.agrayman.gay/ (这个是cloudflare worker套的域名)
https://ghproxy.crazypeace.repl.co/
https://ghproxy--crazypeace.repl.co/
========
update
如果在 Replit 上跑, 然后又用wget, 会出现错误乱码的现象. 解决办法是带 --compression=auto 参数
评论
发表评论