logo NodeSeekbeta

一键脚本获取本机 IP 遇到问题及处理方案探讨

经常在各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的命令)
原来的一键脚本

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有15846位seeker

🎉欢迎新用户🎉