一键脚本获取本机 IP 以及用gh-proxy访问 Github 的通道

经常在各TG群里看到各种一键脚本用户有检测IP与域名解析不匹配的反馈


这样的原因 常常是因为 脚本中检测IP的方法失效了.


在 233boy 的群中受到启发.

我有一个想法. 对各脚本的作者发起一个倡议, 使用统一的 本机IP 的变量名.

_FQ_IP_

使用统一的IP栈变量名. 值为4表示使用IPv4, 值为6表示使用IPv6.

_FQ_NET_STACK_ 

在脚本中, 检测本机IP之前, 先判断这个环境变量是否为空. 环境变量非空, 则不检测本机IP. 示例,

get_ip() {
  if [[ -z $_FQ_IP_ ]]; then 
    if [[ $_FQ_NET_STACK_ == "4" ]]; then
      _FQ_IP_=$(curl -4s https://www.cloudflare.com/cdn-cgi/trace | grep -oP "ip=\K\S+")
      [[ -z $_FQ_IP_ ]] && echo -e "\n 检测本机IP失败\n" && exit
    elif [[ $_FQ_NET_STACK_ == "6" ]]; then 
      _FQ_IP_=$(curl -6s https://www.cloudflare.com/cdn-cgi/trace | grep -oP "ip=\K\S+")
      [[ -z $_FQ_IP_ ]] && echo -e "\n 检测本机IP失败\n" && exit
    else
      _FQ_IP_=$(curl -s https://www.cloudflare.com/cdn-cgi/trace | grep -oP "ip=\K\S+")
      [[ -z $_FQ_IP_ ]] && echo -e "\n 检测本机IP失败\n" && exit
    fi
  fi
}

检测IP的具体方法, 欢迎大家在评论区交流.


关于IP栈使用IPv4 还是 IPv6. 我推荐, 检测用户输入的域名解析到了IPv4 还是 IPv6. 示例:

get_domain_resolve() {
  _FQ_NET_STACK_=""
  domain_resolve=$(curl -sH 'accept: application/dns-json' "https://cloudflare-dns.com/dns-query?name=$domain&type=A" | jq -r '.Answer[0].data')
  if [[ "$domain_resolve" != "null" ]]; then
    _FQ_NET_STACK_="4"
  else
    domain_resolve=$(curl -sH 'accept: application/dns-json' "https://cloudflare-dns.com/dns-query?name=$domain&type=AAAA" | jq -r '.Answer[0].data')            
    if [[ "$domain_resolve" != "null" ]]; then
      _FQ_NET_STACK_="6"
    fi
  fi
}

这个方案也欢迎大家在评论区交流意见.


这样的话, 即使这个脚本没有人维护了, 脚本中的检测IP的功能失效了. 使用者也只要简单地在使用前指定一下本机IP的变量即可让脚本顺利执行.

export _FQ_IP_=VPS的本机IP
原来的一键脚本

如果面对一个不知道查看本机IP的超级小白, 也可以告诉TA这样. TA只管复制粘贴就行了.

export _FQ_IP_=$(检测本机IP的命令)
原来的一键脚本


========

在一些奇怪的纯IPv6的VPS上, 以及墙内的VPS上, 访问不通Github. 不管是拉Github的脚本, 还是在脚本中拉Github的资源, 都会有麻烦.

推荐使用gh-proxy, 并同时对脚本内容进行处理, 在脚本中访问Github资源, 也加上gh-proxy来调用.

墙内的话, 可以使用自定义域名的Cloudflare worker. 示例:

bash <(wget -qO- -o- https://ghproxy.agrayman.gay/https://git.io/v2ray.sh | perl -pe "s#(http.*?git[^/]*?/)#https://ghproxy.agrayman.gay/\1#g")

如果在Github脚本中, 还嵌套调用了Github脚本, 而在下一层的Github脚本中, 有可能还会访问Github资源. 那么请使用如下递归处理的方式:

bash <(wget -qO- -o- https://ghproxy.agrayman.gay/https://git.io/v2ray.sh | perl -pe "$(curl -L https://ghproxy.agrayman.gay/perl-pe-para)")

当然第二种方案, 对嵌套调用Github脚本的方式有要求, 只能处理类似如下方式的调用

bash <(curl .... sh)  或  bash <(wget .... sh)

演示站: https://ghproxy.agrayman.gay/

第二种方案的原理, 请见 

https://zelikk.blogspot.com/2023/02/freevpsvc-github-githubproxy-sed.html

https://zelikk.blogspot.com/2023/03/sed-perl-no-greedily.html

https://zelikk.blogspot.com/2023/07/github-proxy-gitio.html


自己在worker搭建gh-proxy的教程:

https://zelikk.blogspot.com/2023/06/gh-proxy-worker.html


========

不方便在 blogspot 留言的朋友, 也可以在这个论坛留言. https://www.nodeseek.com/post-57601-1

评论

The Hot3 in Last 30 Days

RackNerd VPS搭Hysteria2 HY2梯子 年付 $10.98 1G端口 3T流量 17G存储 1GB内存

强行重装 233boy的sing-box脚本 取消脚本报错退出的逻辑