最推荐用 curl -s -f -m 3 配合 ifconfig.me、api.ipify.org 或 icanhazip.com 查询公网 IP,响应为纯文本 IP,需用 tr -d '[:space:]' 清洗空白字符,多地址 fallback 更可靠。

curl 命令调用公网 IP 查询服务最直接
Linux 终端里查公网 IP,本质是向一个能返回你出口 IP 的 HTTP 服务发请求。最常用、最轻量的方式就是 curl 配合可信的第三方接口。
推荐这几个稳定可用的地址(响应快、无广告、纯文本):
curl ifconfig.mecurl api.ipify.orgcurl icanhazip.com
它们都只返回一行纯 IP 地址,比如 203.123.45.67,适合脚本解析。注意:别用带 HTML 页面的网站(如 ip.cn),curl 默认不渲染页面,会返回大量无关内容。
避免被墙或超时:加 -s -f 参数更健壮
公网查询服务偶尔不可达,或者 DNS 解析慢,裸用 curl ifconfig.me 可能卡住或报错。加几个参数能让命令更稳:
-
-s:静默模式,不显示进度条和错误提示(避免干扰脚本输出) -
-f:失败时不输出 body(比如 HTTP 4xx/5xx 时返回空,而不是错误页 HTML) -
-m 3:最多等待 3 秒,超时自动退出(防卡死)
组合起来就是:curl -s -f -m 3 ifconfig.me。如果返回为空,说明这次请求失败,可配合 shell 判断重试。
脚本中提取 IP 要过滤空白字符和换行
有些服务(比如 curl ipinfo.io/ip)可能返回带换行或空格的响应,直接赋值给变量会导致后续命令出错。安全做法是用 tr 或 sed 清洗:
myip=$(curl -s -f -m 3 ifconfig.me | tr -d '[:space:]')
或者更通用一点:
myip=$(curl -s -f -m 3 ifconfig.me | sed 's/[^0-9.]//g')
后者能剔除非 IP 字符(比如某些接口加了前缀文字),但前提是确认返回格式始终含 IP 段。实际用 tr -d '[:space:]' 已覆盖绝大多数情况。
不用 curl?wget 和 dig 都不是好选择
wget -qO- 功能上等价于 curl,但默认输出包含服务器头信息(除非加 --server-response 过滤),不如 curl 干净;dig +short myip.opendns.com @resolver1.opendns.com 看似“纯 DNS”,其实依赖 OpenDNS 递归解析,国内常被污染或超时,实测不稳定。
真正要绕过 HTTP,又想可靠,不如直接用 curl 加备用 URL 列表写个简单 fallback:
for url in ifconfig.me api.ipify.org icanhazip.com; do
ip=$(curl -s -f -m 2 "$url" | tr -d '[:space:]')
[ -n "$ip" ] && { echo "$ip"; break; }
done
公网 IP 查询看着简单,但关键在「一次成功」——网络波动、DNS 异常、服务临时不可用都很常见。别省那几行健壮性代码。










