2016年不用挖就在shell中获取外部IP地址?

7 shell ip dns dnsmasq

这个问题:“如何在 bash 中获取我的外部 IP 地址?

通过调用 dig 解决问题:

dig +short myip.opendns.com @resolver1.opendns.com;
Run Code Online (Sandbox Code Playgroud)

这是最快的解决方案,因为它涉及单个 udp 数据包。

但是,这只是一个站点:OpenDNS,还有其他选择吗?

并且,使用默认情况下不可用的 dig。再次,有替代方案吗?


注意:我需要解决这个问题,因为 OpenDNS 服务由于端口 53 的(也是本地)重定向而无法在本地工作。我终于找到了原因(我忘记了重定向)。首先,通过使用此命令来查找 dnssec 是否正在工作(本地缺少ad标志):

dig pir.org +dnssec +multi
Run Code Online (Sandbox Code Playgroud)

还可以使用此命令来确定您的 ISP 是否正在重定向 OpenDNS 解析:

host -t txt which.opendns.com 208.67.220.220
Run Code Online (Sandbox Code Playgroud)

如果被重定向,您将得到以下答案: "I am not an OpenDNS resolver."

小智 10

另一种选择是 Google DNS:

myip(){   dig @8.8.8.8 -t txt o-o.myaddr.l.google.com |
          grep "client-subnet" |
          grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)" ;   }
Run Code Online (Sandbox Code Playgroud)

如果您的系统没有 dig,那么 host 将完全等效:

myip(){   host -t txt o-o.myaddr.l.google.com 8.8.8.8 |
          grep -oP "client-subnet \K(\d{1,3}\.){3}\d{1,3}";   }
Run Code Online (Sandbox Code Playgroud)

显示了 GNU grep(类 Perl -P)和基本 (BRE) 正则表达式。

而且,当然,原始站点也可以使用。
随着挖掘:

myip(){   dig myip.opendns.com @208.67.220.222  |
          grep "^myip\.opendns\.com\."             |
          grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)"  ; }
Run Code Online (Sandbox Code Playgroud)

并与主机:

myip(){   host myip.opendns.com 208.67.220.222  |
          grep -oP "^myip\.opendns\.com.* \K(\d{1,3}\.){3}(\d{1,3})" ; }
Run Code Online (Sandbox Code Playgroud)

上面的两个片段将适用于这四个 OpenDNS 解析器地址中的任何一个:

echo 208.67.22{0,2}.22{0,2}
Run Code Online (Sandbox Code Playgroud)

如果将来直接 DNS 解决方案失败,请使用 curl 到以下站点之一(网址):

IFS=$'\n' read -d '' -a urls <<-'_end_of_text_'
api.ipify.org
bot.whatismyipaddress.com/
canhazip.com/
checkip.dyndns.com/
corz.org/ip
curlmyip.com/
eth0.me/
icanhazip.com/
ident.me/
ifcfg.me/
ifconfig.me/
ip.appspot.com/
ipecho.net/plain
ipof.in/txt
ip.tyk.nu/
l2.io/ip
tnx.nl/ip
wgetip.com/
whatismyip.akamai.com/
_end_of_text_
Run Code Online (Sandbox Code Playgroud)

像这样调用数组地址:

$ i=5; curl -m10 -L "http://${urls[i]}"
116.132.27.203
Run Code Online (Sandbox Code Playgroud)

在某些站点中,https 也可能有效。

  • FWIW,我看到来自 8.8.8.8 的大约 20% 的响应包含一个 *不是*我的地址的`edns0-client-subnet` 值。谷歌可能正在做一些模糊测试或 CDN-geared 优化,但这似乎并没有产生准确的结果。 (2认同)