GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso ottenere il mio indirizzo IP esterno in uno script di shell?

Consiglierei di ottenerlo direttamente da un server DNS.

La maggior parte delle altre risposte di seguito implicano tutte il passaggio tramite HTTP a un server remoto. Alcuni di essi richiedevano l'analisi dell'output o facevano affidamento sull'intestazione User-Agent per far rispondere il server in testo normale. Quelli cambiano abbastanza frequentemente (scendi, cambia il loro nome, pubblica annunci, potrebbe cambiare il formato di output, ecc.).

  1. Il protocollo di risposta DNS è standardizzato (il formato rimarrà compatibile).
  2. 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 qualsiasi nuovo servizio HTTP alla moda whatismyip dot-com sia popolare oggi.
  3. Questo metodo è intrinsecamente più veloce (anche se solo di pochi millisecondi!).

Utilizzando dig con un resolver 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 il tipo di query restituisce un record AAAA o A. Per preferire specificamente la connessione IPv4 o IPv6, utilizzare -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 ci si connette tramite IPv6, non può restituire l'indirizzo A.

Server alternativi

Vari provider DNS offrono questo servizio, tra cui 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.

Se sospetti un problema diverso (con il provider upstream, lo strumento della 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

NOTA:si tratta di informazioni esterne Indirizzo IP (quello che i server su Internet vedono quando ti connetti a loro) - se vuoi interno Indirizzo IP (quello utilizzato dal tuo computer per le connessioni, che potrebbe essere diverso) vedi questa risposta .

TL;DR - I metodi più veloci nel 2015

Il metodo più veloce utilizzando DNS:

dig +short myip.opendns.com @resolver4.opendns.com

o usando externalip:

externalip dns

Il più veloce con HTTP:

curl -s http://whatismyip.akamai.com/

o usando externalip:

externalip http

Il più veloce utilizzando HTTPS con un certificato valido:

curl -s https://4.ifcfg.me/

o usando externalip:

externalip https

Utilizzando telnet:

Con nc comando:

nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

o usando externalip:

externalip telnet

Con telnet comando:

telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

Utilizzando FTP:

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

o usando externalip:

externalip ftp

Tutto quanto sopra può essere eseguito usando il mio script externalip come:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Ora una lunga storia...

Ci sono molte opzioni di diversi server che forniscono l'IP esterno specialmente tramite HTTP postato qui o altrove.

Ho fatto un benchmark per vedere se qualcuno di loro è migliore degli altri e sono rimasto sorpreso dai risultati. Per esempio. uno dei più consigliati ifconfig.me è stato quasi sempre il più lento per me, a volte impiegando molti secondi per rispondere. Molti non funzionano su HTTPS o funzionano ma hanno certificati non validi. Alcuni hanno tempi di risposta molto incoerenti.

Benchmark

HTTP e HTTPS

Questa è la fonte del mio script externalip-benchmark che ho usato:

  • https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark

Puoi eseguirlo tu stesso per vedere quali servizi menzionati qui vale la pena usare:

wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

I miei risultati che ho ricevuto il 03-04-2015 da Varsavia - gli indirizzi sono stati cambiati per proteggere gli innocenti:

Migliori tempi di risposta http:

0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'

Migliori tempi di risposta https:

0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''

(Nota:ci sono alcune risposte rapide con contenuto vuoto - quelle non sono valide.)

Tempi di ping medi migliori:

10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

Ecco i risultati che ho ottenuto il 03-04-2015 da Amsterdam:

Migliori tempi di risposta http:

0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'

Migliori tempi di risposta https:

0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''

Tempi di ping medi migliori:

1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

(I 999999 ping indicano il 100% di perdita di pacchetti.)

DNS

Per un confronto, ecco i tempi di utilizzo di altri metodi:testati il ​​16-06-2015 da Varsavia e Amsterdam.

Usando:

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

di solito impiega (tempo reale dell'orologio da parete) circa:

  • 0,035 da Varsavia
  • 0,015 da Amsterdam

In realtà ce ne sono quattro resolver che possono essere utilizzati in questo modo:

  • resolver1.opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

Forniscono tutti gli stessi tempi di risposta a Varsavia e ad Amsterdam, ma potrebbe non essere così in altre località.

Usando 208.67.222.222 - l'IP di resolver1.opendns.com invece del suo nome di dominio è più veloce:

  • 0,023 da Varsavia
  • 0,009 da Amsterdam

ma potrebbe non funzionare in futuro se l'IP dovesse cambiare (anche se potrebbe essere improbabile per un noto resolver DNS - forse dovrei usare l'IP nel mio script externalip - per favore commenta).

Telnet

Telnet con nc o telnet comando (vedi sopra) di solito richiede:

  • 0,103 da Varsavia
  • 0,035 da Amsterdam

(Non c'è alcuna differenza evidente tra nc e telnet comandi.)

FTP

  • 0,104 da Varsavia
  • 0,036 da Amsterdam

Nomi di dominio

Tutti i metodi saranno più veloci (soprattutto se eseguiti per la prima volta) quando verranno utilizzati gli indirizzi IP invece dei nomi di dominio dei servizi forniti (eccetto con HTTP che può utilizzare server virtuali basati su host e non funzionare con IP nudo - non testato) ma smetterà di funzionare quando i servizi cambiano l'indirizzo IP, quindi potrebbe essere più veloce ma meno a prova di futuro.

Commenti

Se vedi dei risultati interessanti dalla tua posizione, o se pensi che alcuni altri host dovrebbero essere consigliati invece di quelli che ho scelto, per favore pubblica un commento. Se manca un servizio importante, commenta o pubblica un problema su GitHub. Vorrei mantenere questo post aggiornato con una scelta attuale dei servizi con le migliori prestazioni.


 curl -s http://whatismijnip.nl |cut -d " " -f 5

Sito sostituito con uno funzionante in olandese.


Linux
  1. Come ottenere il proprio indirizzo IP e salvarlo in una variabile in uno script di shell?

  2. Come gestire gli interruttori in uno script di shell?

  3. Come ottenere il codice di uscita del processo generato nello script di shell atteso?

  4. Ottieni l'indirizzo MAC usando lo script della shell

  5. Come eseguire il codice nella shell Django da uno script Python esterno?

Come utilizzare le variabili negli script della shell

Come trovare/ottenere il tuo indirizzo IP in Linux

Come creare script di shell

Come ottenere il tuo indirizzo IP su Linux

Come eseguire un comando in uno script della shell?

Come posso risolvere un nome host in un indirizzo IP in uno script Bash?