Devo trovare il mio indirizzo IP esterno da uno script di shell. Al momento utilizzo questa funzione:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
Ma dipende da perl-libwww
, perl-html-format
, perl-html-tree
installato. In quali altri modi posso ottenere il mio IP esterno?
Risposta accettata:
Consiglierei di ottenerlo direttamente da un server DNS.
La maggior parte delle altre risposte di seguito implicano tutte il passaggio da HTTP a un server remoto. Alcuni di essi richiedevano l'analisi dell'output o facevano affidamento sull'intestazione User-Agent per fare in modo che il server rispondesse in testo normale. Quelli cambiano abbastanza frequentemente (scendi, cambia il loro nome, pubblica annunci, potrebbero cambiare il formato di output ecc.).
- Il protocollo di risposta DNS è standardizzato (il formato rimarrà compatibile).
- Storicamente, i servizi DNS (Akamai, Google Public DNS, OpenDNS, ..) tendono a sopravvivere molto più a lungo e sono più stabili, più scalabili e generalmente più curati di qualunque nuovo servizio HTTP whatismyip dot-com alla moda sia caldo oggi.
- Questo metodo è intrinsecamente più veloce (anche solo di pochi millisecondi!).
Usando dig
con un risolutore OpenDNS:
$ dig @resolver4.opendns.com myip.opendns.com +short
Forse alias nel tuo bashrc
quindi è facile da ricordare
# 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'
Risponde con un semplice indirizzo IP:
$ wanip # wanip4, or wanip6
80.100.192.168 # or, 2606:4700:4700::1111
Sintassi
(Abbreviato da 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)
...
Il ANY
tipo di query restituisce un record AAAA o A. Per preferire la connessione IPv4 o IPv6 in particolare, usa il -4
o -6
opzioni di conseguenza.
Per richiedere che la risposta sia un indirizzo IPv4, sostituisci ANY con A
; per IPv6, sostituiscilo con AAAA
. Si noti che può restituire solo l'indirizzo utilizzato per la connessione. Ad esempio, quando si connette tramite IPv6, non può restituire l'indirizzo A.
Server alternativi
Vari provider DNS offrono questo servizio, inclusi OpenDNS, Akamai e 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"
Esempio di alias che richiede specificamente un indirizzo IPv4:
# https://unix.stackexchange.com/a/81699/37512
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
$ wanip4
80.100.192.168
E per il tuo indirizzo 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"
Risoluzione dei problemi
Se il comando non funziona per qualche motivo, potrebbe esserci un problema di rete. Prova prima una delle alternative sopra.
Correlati:Stai cercando di recuperare i dati da un'unità RAID esterna?
Se sospetti un problema diverso (con il provider upstream, lo strumento da riga di comando o qualcos'altro), esegui il comando senza +short
opzione per rivelare i dettagli della query DNS. Ad esempio:
$ 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