公网 IP 查询 打开工具

命令行查公网 IP:curl 一条命令与脚本里的用法

浏览器能看,脚本里要的是机器可读的字符串。最简单的一条是 curl ip.sisenote.com:它按请求的 Accept 分流,脚本客户端拿到单行 JSON,浏览器访问才返回页面——同一个地址,两种形态。

基本用法

直接执行:

curl ip.sisenote.com

返回类似:

{"ip":"203.0.113.5","country_code":"CN","country":"China"}

只要 IP 本身,用 jq 取字段:

curl -s ip.sisenote.com | jq -r .ip

没有 jq 时可以 grep -o,但那是脆弱的做法——字段顺序一变就失效,能用 jq 就用 jq。

为什么不能抓网页再用正则解析

抓 HTML 再正则抠 IP,问题有三个:页面改版就失效;HTML 里可能同时出现多个 IP(示例、日志、注释);无法区分「你的 IP」和「示例 IP」。

接口返回的是结构化字段,且 ip 字段只有一个含义。给脚本用就调接口,别解析页面。

在脚本与 CI 里用

Shell:

IP=$(curl -s ip.sisenote.com | jq -r .ip)
    echo "出口 IP 是 $IP"

Python:

import json, urllib.request
    d = json.load(urllib.request.urlopen("https://ip.sisenote.com"))
    print(d["ip"], d["country_code"])

Go:

resp, _ := http.Get("https://ip.sisenote.com")
    defer resp.Body.Close()
    var v struct{ IP string `json:"ip"` }
    json.NewDecoder(resp.Body).Decode(&v)

CI 里注意:走代理的 runner 拿到的是代理出口 IP,不是 runner 本机地址。

接口的边界

这个接口只返回命令发起方自己的出口 IP,不能指定查询别人的地址——要查任意 IP 的归属,用页面上的「查询任意 IP」,它在浏览器里查本地库。

返回字段固定为 ip / country_code / country,不提供城市、运营商、经纬度。需要更细的定位请用商业 IP 库,并接受它的误差。

上面这些都不用装软件,也不用注册:打开页面就能用。

打开公网 IP 查询 →

常见问题

接口需要 key 或限流吗?

不需要 key。站点有基础的请求频率限制(防止被当免费代理池刷),正常脚本调用远低于阈值;高频批量调用请自建服务,不要拿公共接口当基础设施。

curl 返回的是 JSON,浏览器打开却是页面?

站点按 Accept 请求头分流:浏览器发 text/html 得到页面,脚本客户端(curl、wget)默认接受任意类型,得到 JSON。这是有意的设计,并声明了 Vary 头让缓存正确区分。

能返回 IPv6 地址吗?

目前只处理 IPv4 出口。如果你的网络优先走 IPv6,接口返回的仍可能是 IPv4 地址或按服务端实际看到的连接来源返回。