命令行查公网 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 地址或按服务端实际看到的连接来源返回。