如何在Bash中用兼容POSIX的方式无API密钥查询IP对应的ASN?
无API密钥的IP到ASN查询方案(POSIX兼容)
针对VPS初始化场景,以下是无需API密钥、兼容POSIX Shell的ASN查询方法,覆盖IPv4和IPv6:
方法1:使用官方RDAP服务(推荐,无第三方依赖风险)
RDAP是WHOIS的替代标准,官方服务无需密钥。多数地区的RDAP服务会在IP查询结果中关联ASN信息,可通过POSIX工具提取:
IPv4查询命令
# 查询IPv4并提取ASN IP="8.8.8.8" curl -s "https://rdap.arin.net/registry/ip/$IP" | grep -o '"handle": "AS[0-9]*"' | sed 's/"handle": "AS\([0-9]*\)"/\1/'
IPv6查询命令
# 查询IPv6并提取ASN IP="2001:4860:4860::8888" curl -s "https://rdap.arin.net/registry/ip/$IP" | grep -o '"handle": "AS[0-9]*"' | sed 's/"handle": "AS\([0-9]*\)"/\1/'
说明:如果ARIN的RDAP未返回目标IP的ASN(比如IP归属非北美地区),可替换为对应地区的RDAP服务:
- 欧洲:
https://rdap.db.ripe.net/ip/$IP - 亚太:
https://rdap.apnic.net/ip/$IP
若要自动适配地区,可先查询IP的注册机构,再跳转对应RDAP服务:
IP="8.8.8.8" REGISTRY=$(curl -s "https://rdap.arin.net/registry/ip/$IP" | grep -o '"registrant": {"handle": "[A-Z]*"' | sed 's/"registrant": {"handle": "\([A-Z]*\)"/\1/') case $REGISTRY in RIPE) RDAP_URL="https://rdap.db.ripe.net/ip/$IP" ;; APNIC) RDAP_URL="https://rdap.apnic.net/ip/$IP" ;; *) RDAP_URL="https://rdap.arin.net/registry/ip/$IP" ;; esac curl -s "$RDAP_URL" | grep -o '"handle": "AS[0-9]*"' | sed 's/"handle": "AS\([0-9]*\)"/\1/'
方法2:使用免费无密钥的第三方API(适合快速验证)
部分第三方服务提供无API密钥的IP查询接口,请求量限制足够覆盖VPS初始化场景:
通用IPv4/IPv6查询命令
IP="8.8.8.8" curl -s "http://ip-api.com/json/$IP?fields=as" | grep -o '"as":"AS[0-9]*"' | sed 's/"as":"AS\([0-9]*\)"/\1/'
注意:该服务有请求频率限制(每分钟45次),VPS初始化单次调用完全满足需求。
方法3:纯POSIX工具提取RDAP中的ASN(无需jq)
如果系统没有jq,可通过grep和sed组合提取RDAP返回的ASN,避免依赖额外工具:
IP="8.8.8.8" curl -s "https://rdap.arin.net/registry/ip/$IP" | awk '/"handle": "AS[0-9]+"/ {sub(/"handle": "AS/, "", $0); sub(/"/, "", $0); print $0}'
内容的提问来源于stack exchange,提问作者Pete Cooper
相关产品推荐
相关产品推荐

