Shell网络

【cur】shell调用curl实现ip归属地查询

2024-07-15  本文已影响0人  Bogon
#  yum -y install  jq 
# curl -s "http://ip-api.com/json/114.114.114.114?lang=zh-CN"| jq
{
  "status": "success",
  "country": "中国",
  "countryCode": "CN",
  "region": "SD",
  "regionName": "山东省",
  "city": "潍坊市",
  "zip": "261000",
  "lat": 36.7069,
  "lon": 119.162,
  "timezone": "Asia/Shanghai",
  "isp": "China Unicom Shandong Province network",
  "org": "NanJing XinFeng Information Technologies, Inc.",
  "as": "AS4837 CHINA UNICOM China169 Backbone",
  "query": "114.114.114.114"
}

# curl  -s  --connect-timeout 30  "http://ip-api.com/json/10.23.65.44?lang=zh-CN" |  jq
{
  "status": "fail",
  "message": "private range",
  "query": "10.23.65.44"
}

# curl -s "http://ip-api.com/json/8.8.8.8?lang=zh-CN"| jq

{
  "status": "success",
  "country": "美国",
  "countryCode": "US",
  "region": "VA",
  "regionName": "弗吉尼亚州",
  "city": "Ashburn",
  "zip": "20149",
  "lat": 39.03,
  "lon": -77.5,
  "timezone": "America/New_York",
  "isp": "Google LLC",
  "org": "Google Public DNS",
  "as": "AS15169 Google LLC",
  "query": "8.8.8.8"
}

这段JSON数据是从 http://ip-api.com/json/8.8.8.8?lang=zh-CN 获取的,它提供了关于IP地址 8.8.8.8 归属地的详细信息。

下面是对每个字段的详细解读:

{
  "status": "success",
  "country": "美国",
  "countryCode": "US",
  "region": "VA",
  "regionName": "弗吉尼亚州",
  "city": "Ashburn",
  "zip": "20149",
  "lat": 39.03,
  "lon": -77.5,
  "timezone": "America/New_York",
  "isp": "Google LLC",
  "org": "Google Public DNS",
  "as": "AS15169 Google LLC",
  "query": "8.8.8.8"
}

这些信息可以帮助确定给定IP地址的大致地理位置、网络提供商和其他相关信息。
这类服务通常用于网络分析、地理定位和网络管理等应用。

# cat  ip.txt
#---------------------------#
88.152.122.72
39.144.57.211
39.144.57.211
220.120.149.36
39.144.57.176
152.59.11.123
112.224.164.82
1.47.92.27
88.152.122.72
222.173.11.202
14.213.57.225
112.224.160.20
#---------------------------#

cat get_ip_location.sh

#!/bin/bash

# IP地址列表
# 循环处理每个IP地址
for ip in `cat ip.txt`;
do
    # 使用curl获取IP地址的国家和城市信息,指定语言为简体中文
    result=$(curl -s --connect-timeout 15  "http://ip-api.com/json/$ip?lang=zh-CN")

    # 解析JSON数据,提取国家和城市信息
    country=$(echo "$result" | jq -r '.country')
    regionName=$(echo "$result" | jq -r '.regionName')
    city=$(echo "$result" | jq -r '.city')

    # 输出格式为 IP地址  国家/地区/城市
    printf "%-25s %-s/%-s/%-s\n" "$ip" "$country" "$regionName" "$city"
done
#!/bin/bash

# IP地址列表文件路径
IP_FILE="ip.txt"

# 循环处理每个IP地址
while IFS= read -r ip || [[ -n "$ip" ]]; do
    success=false
    attempt=1
    max_attempts=3  # 最大重试次数

    # 循环直到成功获取到有效数据或达到最大重试次数
    while [ $attempt -le $max_attempts ] && [ "$success" = false ]; do
        # 使用curl获取IP地址的国家和城市信息,指定语言为简体中文
        result=$(curl -s --connect-timeout 30 "http://ip-api.com/json/$ip?lang=zh-CN")

        # 解析JSON数据,提取状态信息
        status=$(echo "$result" | jq -r '.status')

        # 检查状态是否为success,如果成功则获取其他信息并设置success为true
        if [ "$status" = "success" ]; then
            country=$(echo "$result" | jq -r '.country')
            regionName=$(echo "$result" | jq -r '.regionName')
            city=$(echo "$result" | jq -r '.city')

            # 输出格式为 IP地址 国家/地区/城市
            printf "%-25s %-s/%-s/%-s\n" "$ip" "$country" "$regionName" "$city"
            success=true
        elif [[ $(echo "$result" | jq -r '.message') = "private range" ]]; then
            # 如果返回内容中有"message": "private range",则输出局域网IP信息
            printf "%-25s %-s\n" "$ip" "局域网ip,请根据网段划分确认归属地"
            success=true
        else
            # 如果status不为success,则增加尝试次数,并等待一段时间后重试
            ((attempt++))
            sleep 2
        fi
    done

    # 如果重试次数超过了设定的最大尝试次数,输出错误信息
    if [ "$success" = false ]; then
        printf "%-25s %-s\n" "$ip" "多次重试,无法获取ip归属地"
    fi
done < "$IP_FILE"

88.152.122.72             德国/黑森州/法兰克福
39.144.57.211             中国/辽宁/沈阳市
39.144.57.211             中国/辽宁/沈阳市
220.120.149.36            韩国/京畿道/Anyang-si
39.144.57.176             中国/辽宁/沈阳市
152.59.11.123             印度/马哈拉施特拉邦/浦那
112.224.164.82            中国/山东省/青岛市
1.47.92.27                泰国/曼谷/曼谷
88.152.122.72             德国/黑森州/法兰克福
222.173.11.202            中国/山东省/新泰市
14.213.57.225             中国/广东/广州市
112.224.160.20            中国/山东省/潍坊市

8.8.8.8                   美国/弗吉尼亚州/Ashburn
2.2.2.2                   法国/法兰西岛/巴黎
10.23.65.44               局域网ip,请根据网段划分确认归属地
xx.xx.xx.xx               多次重试,无法获取ip归属地
上一篇下一篇

猜你喜欢

热点阅读