Linux

如何在 shell 腳本中獲取我的外部 IP 地址?

  • February 5, 2021

我需要從 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 標頭使伺服器以純文字形式響應。這些變化非常頻繁(下架,更改名稱,發布廣告,可能會更改輸出格式等)。

  1. DNS 響應協議是標準化的(格式將保持兼容)。
  2. 從歷史上看,DNS 服務(Akamai、Google公共 DNS、OpenDNS、..)往往比今天流行的任何新的時髦 whatismyip dot-com HTTP 服務的生存時間更長、更穩定、更具可擴展性並且通常更受關注。
  3. 這種方法本質上更快(只有幾毫秒!)。

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 提供商都提供此服務,包括OpenDNSAkamaiGoogle 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

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