2016年在shell中无需挖掘即可获取外部IP地址?

2016年在shell中无需挖掘即可获取外部IP地址?

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

通过调用 dig 解决问题:

dig +short myip.opendns.com @resolver1.opendns.com;

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

然而,这只是一个网站:OpenDNS,还有其他选择吗?

并且,使用默认情况下不可用的 dig。再说一遍,还有其他选择吗?


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

dig pir.org +dnssec +multi

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

host -t txt which.opendns.com 208.67.220.220

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

答案1

另一种选择是 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\}\)" ;   }

如果您的系统没有 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}";   }

-P显示了 GNU grep(类似 Perl )和基本(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\}\)"  ; }

并与主机:

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

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

echo 208.67.22{0,2}.22{0,2}

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

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_

像这样调用数组地址:

$ i=5; curl -m10 -L "http://${urls[i]}"
116.132.27.203

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

答案2

我得出的结论是,其中许多项目都是信标,可以向嗅探您的网络流量和/或您请求此信息的服务的人识别您的身份。

我建议对保护您隐私的服务进行 HTTPS 查询:

wget -qqO- 'https://duckduckgo.com/?q=what+is+my+ip' \
  | grep -Pow 'Your IP address is \K[0-9.]+'

(如果您使用的是嵌入式或其他受限系统并且没有grep -P(libpcre),请改用
… | grep -ow 'Your IP address is [0-9.]*[0-9]' | grep -ow '[0-9][0-9.]*'  )。

如果您(和/或您的 IP 上的其他人)不使用注重隐私的鸭鸭Go搜索引擎,那么也许这就是一个信标(尽管您的查询本身对于第三方来说是无法解读的,也许存在任何查询的事实太多了?)。你可以对 Google 做同样的事情,尽管 Google 明确拒绝访问 wget 和类似的实用程序,所以你必须伪造你的用户代理:

wget -U Mozilla/5.0 -qqO- 'https://www.google.com/search?q=what+is+my+ip' \
  | grep -Po '>\K[0-9.]{7,}(?=<.{0,99}>Your public IP)'

这可能违反 Google 的使用条款。

据推测,您必须更改正则表达式班级对于 IPv6,从[0-9.]到。[0-9a-f:]我不知道如果你是的话会是什么样子双栈

答案3

我使用以下内容:

dig @1.1.1.1 TXT whoami.cloudflare.com +short | tr -d \"

或者,与host

$ host=whoami.cloudflare.com
$ host -t TXT "$host" 1.1.1.1 | sed -En "s/^$host.+"'"([^"]*)"/\1/p'

相关内容