Linux
如何在 shell 腳本中獲取我的外部 IP 地址?
我需要從 shell 腳本中找到我的外部 IP 地址。目前我使用這個功能:
myip () { lwp-request -o text checkip.dyndns.org | awk '{ print $NF }' }
但這取決於
perl-libwww
,perl-html-format
,perl-html-tree
安裝。我可以通過哪些其他方式獲得我的外部 IP?
我建議直接從 DNS 伺服器獲取它。
下面的大多數其他答案都涉及通過 HTTP 到遠端伺服器。其中一些需要解析輸出,或者依靠 User-Agent 標頭使伺服器以純文字形式響應。這些變化非常頻繁(下架,更改名稱,發布廣告,可能會更改輸出格式等)。
- DNS 響應協議是標準化的(格式將保持兼容)。
- 從歷史上看,DNS 服務(Akamai、Google公共 DNS、OpenDNS、..)往往比今天流行的任何新的時髦 whatismyip dot-com HTTP 服務的生存時間更長、更穩定、更具可擴展性並且通常更受關注。
- 這種方法本質上更快(只有幾毫秒!)。
dig
與 OpenDNS 解析器一起使用:$ dig @resolver4.opendns.com myip.opendns.com +short
也許在你的別名中
bashrc
這樣很容易記住# https://unix.stackexchange.com/a/81699/37512 alias wanip='dig @resolver4.opendns.com myip.opendns.com +short' alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4' alias wanip6='dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6'
使用純 IP 地址響應:
$ wanip # wanip4, or wanip6 80.100.192.168 # or, 2606:4700:4700::1111
句法
(縮寫自https://ss64.com/bash/dig.html):
usage: dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt] q-type one of (A, ANY, AAAA, TXT, MX, ...). Default: A. d-opt ... +[no]short (Display nothing except short form of answer) ... q-opt one of: -4 (use IPv4 query transport only) -6 (use IPv6 query transport only) ...
ANY
查詢類型返回 AAAA 或 A 記錄。要特別喜歡 IPv4 或 IPv6 連接,請相應地使用-4
或-6
選項。要要求響應是 IPv4 地址,請將 ANY 替換為
A
; 對於 IPv6,將其替換為AAAA
. 請注意,它只能返回用於連接的地址。例如,通過 IPv6 連接時,無法返回 A 地址。替代伺服器
各種 DNS 提供商都提供此服務,包括OpenDNS、Akamai和Google Public DNS:
# OpenDNS (since 2009) $ dig @resolver3.opendns.com myip.opendns.com +short $ dig @resolver4.opendns.com myip.opendns.com +short 80.100.192.168 # OpenDNS IPv6 $ dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6 2606:4700:4700::1111 # Akamai (since 2009) $ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short 80.100.192.168 # Akamai approximate # NOTE: This returns only an approximate IP from your block, # but has the benefit of working with private DNS proxies. $ dig +short TXT whoami.ds.akahelp.net "ip" "80.100.192.160" # Google (since 2010) # Supports IPv6 + IPv4, use -4 or -6 to force one. $ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short "80.100.192.168"
專門請求 IPv4 地址的範例別名:
# https://unix.stackexchange.com/a/81699/37512 alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4' $ wanip4 80.100.192.168
對於您的 IPv6 地址:
# https://unix.stackexchange.com/a/81699/37512 alias wanip6='dig @ns1.google.com TXT o-o.myaddr.l.google.com +short -6' $ wanip6 "2606:4700:4700::1111"
故障排除
如果該命令由於某種原因不起作用,則可能存在網路問題。首先嘗試上述替代方案之一。
如果您懷疑存在不同的問題(與上游提供商、命令行工具或其他問題有關),則執行該命令而不
+short
選擇顯示 DNS 查詢的詳細資訊。例如:$ dig @resolver4.opendns.com myip.opendns.com ;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR ;; QUESTION SECTION: ;myip.opendns.com. IN A ;; ANSWER SECTION: myip.opendns.com. 0 IN A 80.100.192.168 ;; Query time: 4 msec