美文网首页Shell网络
【cur】shell调用curl实现ip归属地查询

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

作者: Bogon | 来源:发表于2024-07-15 23:03 被阅读0次
    #  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"
    }
    
    • status: 表示查询状态,这里为 "success",说明查询成功。
    • country: 国家名称,这里是 "美国",表示IP地址所在国家是美国。
    • countryCode: 国家代码,这里是 "US",表示美国的ISO 3166-1 alpha-2代码。
    • region: 省或州的缩写,这里是 "VA",表示弗吉尼亚州。
    • regionName: 省或州的全名,这里是 "弗吉尼亚州"。
    • city: 城市名称,这里是 "Ashburn",表示城市是Ashburn。
    • zip: 邮政编码,这里是 "20149"。
    • latlon: 纬度和经度,这里分别是 39.03 和 -77.5。
    • timezone: 时区,这里是 "America/New_York",表示美国东部时间。
    • isp: 网络服务提供商,这里是 "Google LLC",表示提供该IP地址的服务商是Google。
    • org: 组织名称,这里是 "Google Public DNS",表示Google公共DNS。
    • as: 自治系统号码(AS号码)和提供者,这里是 "AS15169 Google LLC",表示使用的自治系统号和服务提供者是Google。
    • query: 查询的IP地址,这里是 "8.8.8.8",即查询的IP地址本身。

    这些信息可以帮助确定给定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归属地
    

    相关文章

      网友评论

        本文标题:【cur】shell调用curl实现ip归属地查询

        本文链接:https://www.haomeiwen.com/subject/eaahhjtx.html