我的IP地址
终端与系统环境用法
只讲终端怎么用:每个“常用变体”都给出命令 + 解释它解决什么问题(协议栈、输出格式、超时、重试、路径含义)。
macOS / Linux / Raspberry Pi / BSD
终端里最常见的需求是:输出必须干净(一行可复制/可写入/可对比),并且脚本不能卡住。 所以这里的推荐写法默认包含:静默(不污染输出)+ HTTPS(避免走错协议)+ 视情况加超时(避免挂死)。
基础用法(最推荐)
curl -4 my.ipin.io
C:\Users\admin>curl -4 my.ipin.io
171.83.40.149
-s:关掉进度条/提示,让输出更纯(脚本里避免混入噪音)。https://:强烈建议写完整协议,避免某些环境默认 http 引发跳转/拦截/端口策略问题。- 根路径
/:严格输出 IPv4;拿不到 IPv4 会失败(避免把 IPv6 误当 IPv4 用)。
常用变体(真实工程里最常用的一组)
# A1) 只要 IPv6(用于验证/排查 IPv6)
curl -s https://my.ipin.io/v6
# A2) 位置简报(终端更好读的文本输出)
curl -s https://my.ipin.io/info
# A3) 终端强制拿 JSON(把 UA 改成非 curl)
curl -s -A "Mozilla/5.0" https://my.ipin.io/info
# A4) 强制走 IPv4 / 强制走 IPv6(排查系统到底用哪个协议栈去连)
curl -s -4 https://my.ipin.io
curl -s -6 https://my.ipin.io/v6
# A5) 加超时(脚本必备:避免网络抖动卡住)
curl -s --connect-timeout 3 --max-time 8 https://my.ipin.io
# A6) 加重试(弱网/偶发抖动:建议 1~2 次)
curl -s --retry 2 --connect-timeout 3 --max-time 8 https://my.ipin.io/info
变体解释(你真正需要知道的点)
/v6:接口层面只返回 IPv6;用于“明确验证 IPv6 是否可用”。/info:接口层面返回 IP + 位置字段;终端下更偏可读输出,适合“肉眼确认出口”。-A "Mozilla/5.0":输出格式控制。默认 curl 的 UA 含 curl → 服务返回文本;改 UA → 服务返回 JSON。-4/-6:连接层面强制协议栈(让你的客户端只用 v4/v6 去连),常用于定位“为什么我总走 v6”。--connect-timeout:只管“建立连接”阶段;握手/连接慢会在这里中断。--max-time:整次请求总时长上限;自动化里最重要(防挂死)。--retry:提高成功率,但只建议少量重试(1~2)。重试太多会拖慢任务并放大故障。
Android(Termux)
Termux 常见问题:移动网络抖动更大、链路更复杂、协议栈选择更不稳定。 所以建议默认就使用:固定协议栈 + 超时 + 需要时重试。
基础用法(推荐)
curl -s -4 --connect-timeout 5 --max-time 10 https://my.ipin.io
常用变体
# B1) 位置简报(快速确认出口位置)
curl -s https://my.ipin.io/info
# B2) IPv6 验证(只在你明确要测 IPv6 时)
curl -s -6 https://my.ipin.io/v6
# B3) 弱网:少量重试
curl -s --retry 2 --connect-timeout 5 --max-time 10 https://my.ipin.io
变体解释
-4:你明确要 IPv4 时就固定它,避免环境优先 IPv6 导致结果漂移。/info:移动网络切换出口很常见,用它确认位置是否符合预期最直观。- 重试策略:移动网络偶发超时常见,少量重试能显著提高成功率。
Windows(CMD / PowerShell)
Windows 建议把用途分清: CMD/批处理偏向“拿一行文本”;PowerShell偏向“拿 JSON 并直接解析字段”。
基础用法(文本一行 IP)
curl.exe -s https://my.ipin.io
常用变体
# C1) 位置简报(终端可读)
curl.exe -s https://my.ipin.io/info
# C2) PowerShell 拿 JSON(适合脚本解析字段)
Invoke-RestMethod -Uri "https://my.ipin.io/info"
# C3) IPv6 验证
curl.exe -s https://my.ipin.io/v6
# C4) 排查连接(看 DNS、握手、超时原因,输出长)
curl.exe -v https://my.ipin.io/info
变体解释
Invoke-RestMethod:适合 JSON 场景,省掉你手动解析的步骤。-v:只用于排查。它会输出很多调试信息,脚本里不要默认开启。- 常见问题来源:系统代理、企业网关、DNS 改写、hosts 规则导致“同命令不同地点表现不同”。
iOS(iSH / 轻量终端)
轻量终端经常只有 wget。注意:wget 默认 UA 往往不含 curl,因此很多时候会拿到 JSON。
你如果要“一行文本”,需要显式设置 UA 触发终端文本输出。
基础用法
wget -qO- https://my.ipin.io
常用变体
# D1) 位置简报
wget -qO- https://my.ipin.io/info
# D2) 强制纯文本(一行 IP)
wget -qO- -U "curl/8" https://my.ipin.io
# D3) 强制 JSON(稳定集成)
wget -qO- -U "Mozilla/5.0" https://my.ipin.io/info
变体解释
-qO-:安静 + 输出到 stdout,方便脚本处理。-U:输出格式控制核心开关(UA 含 curl → 文本;UA 非 curl → JSON)。
OpenWRT / 嵌入式设备
嵌入式设备核心目标是:不挂死。所以一定要设置超时。 做“公网 IP 变更检测”时也要避免误判:请求失败不等于 IP 变了。
基础用法(带超时)
wget -qO- --timeout=10 https://my.ipin.io
常用变体
# E1) 位置简报(出口自检)
wget -qO- --timeout=10 https://my.ipin.io/info
# E2) 强制纯文本(一行 IP)
wget -qO- --timeout=10 -U "curl/8" https://my.ipin.io
变体解释
--timeout:嵌入式强烈建议默认就带上,避免定时任务卡死。- 输出模式稳定:wget 默认可能拿 JSON;若你脚本只想要一行 IP,用 UA 触发文本输出更稳。
Docker / CI / 自动化任务
自动化环境不确定性更大:DNS 波动、短暂超时、出口策略变化都更常见。 推荐默认:超时 + 少量重试 + 固定输出格式(避免解析在不同 runner 上翻车)。
基础用法(加超时)
curl -s --connect-timeout 3 --max-time 8 https://my.ipin.io
常用变体(CI 最实用)
# F1) 稳定拉取位置(带重试)
curl -s --retry 2 --connect-timeout 3 --max-time 8 https://my.ipin.io/info
# F2) CI 想稳定 JSON:固定 UA 为非 curl
curl -s -A "Mozilla/5.0" --connect-timeout 3 --max-time 8 https://my.ipin.io/info
# F3) 排查:强制协议栈
curl -s -4 https://my.ipin.io
curl -s -6 https://my.ipin.io/v6
变体解释
- 固定 UA:CI 里不同镜像/不同工具 UA 可能不同,固定后输出格式才不会漂移。
- 少量重试:提高成功率,但也要保证失败能快速暴露(便于定位)。
常见问答(FAQ)
Q1:我用 curl -s https://my.ipin.io,为什么有时失败或返回错误?
根路径是“严格 IPv4”:如果当前链路无法获得 IPv4,就会明确失败(而不是给你一个 IPv6 假装成功)。 这通常发生在:IPv6-only 网络、某些代理/网关环境、或你的客户端被强制走 IPv6 且链路没有可用 IPv4。
排查方式:用 curl -s -4 强制走 IPv4;或者改用 /info 看当前出口 IP 是什么,再决定下一步。
Q2:我用 curl 请求 /info,为什么不是 JSON?
因为终端工具默认走“终端输出模式”,/info 在该模式下会输出更易读的文本框。
如果你要 JSON(方便 jq/程序解析),把 UA 改成非 curl 即可。
curl -s -A "Mozilla/5.0" https://my.ipin.io/info
Q3:为什么同一条命令在不同机器上输出格式不一样?
输出格式取决于请求的 User-Agent。不同工具(curl / wget / 某些发行版自带工具)默认 UA 可能不同,
就会导致返回文本或 JSON 的差异。
解决方式:固定 UA。想要文本就让 UA 包含 curl;想要 JSON 就让 UA 不包含 curl。 对自动化/CI 来说,固定 UA 是“稳定解析”的关键。
Q4:为什么我明明只想拿 IPv4,却感觉自己“走了 IPv6”?
这里要区分两件事:
你连接时用的协议栈(客户端选择 v4/v6 去连),
和 接口返回的 IP 类型(由路径 / 或 /v6 决定)。
排查建议:用 -4/-6 强制连接协议栈,确认你的网络环境实际偏好哪条链路。
如果你只要 IPv4,使用根路径并必要时强制 -4。
Q5:脚本里应该怎么写才不容易误判、不卡死?
推荐组合是:静默(避免噪音)、超时(避免卡死)、少量重试(抗抖动)、 以及失败不覆盖旧值(避免把失败当变化)。
curl -s --retry 2 --connect-timeout 3 --max-time 8 https://my.ipin.io
Q6:我该优先用 curl 还是 wget?
能用 curl 就用 curl:参数更丰富,排查也更强。 但在轻量/嵌入式环境只有 wget 很常见,用 wget 完全没问题,关键是: 设置超时、输出到 stdout、必要时固定 UA 来锁定输出格式。