Shell

2016年不用dig就能在shell中獲取外部IP地址?

  • September 5, 2020

這個問題:“如何在 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."

另一種選擇是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}";   }

顯示了 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\}\)"  ; }

並與主機:

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 也可能有效。

引用自:https://unix.stackexchange.com/questions/254328