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