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


273

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 perl-libwww, perl-html-format, perl-html-treeinstallato. In quali altri modi posso ottenere il mio IP esterno?


8
Cosa intendi con IP esterno? Le due risposte finora utilizzano HTTP. La risposta potrebbe finire per essere l'IP del server proxy del tuo ISP. (Che potrebbe essere quello che vuoi.)
billpg

@billpg: intendo l'IP del router NAT
Eugene Yarmash,

Quindi avrai bisogno di un servizio web what-is-my-IP che utilizza HTTPS. Ahimè, non ne conosco nessuno.
billpg,

1
@billpg ipcheckit.com
Gilles

checkip.amazonaws.com lo usa dal noto provider
arulraj.net

Risposte:


442

Consiglierei di ottenerlo direttamente da un server DNS.

La maggior parte delle altre risposte sottostanti riguarda il passaggio da HTTP a un server remoto. Alcuni di essi richiedevano l'analisi dell'output o si basavano sull'intestazione User-Agent per far rispondere il server in testo semplice. Quelli cambiano abbastanza frequentemente (vai giù, cambiano nome, pubblicano annunci, potrebbero cambiare il formato di output ecc.).

  1. Il protocollo di risposta DNS è standardizzato (il formato rimarrà compatibile).
  2. Storicamente, i servizi DNS ( OpenDNS , Google Public DNS , ..) tendono a sopravvivere molto più a lungo e sono più stabili, più scalabili e generalmente più curati rispetto a qualsiasi nuovo servizio hip whatismyip.com alla moda oggi fa caldo.
  3. Questo metodo è intrinsecamente più veloce (sia solo di pochi millisecondi!).

Utilizzando digcon OpenDNS come resolver:

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

Forse alias nel tuo, bashrcquindi è facile da ricordare

alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'

Risponde con un semplice indirizzo IP:

$ wanip
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 ANYtipo di query restituisce un AAAA o un record A. Per preferire specificamente la connessione IPv4 o IPv6, utilizzare le opzioni -4o di -6conseguenza.

Per richiedere che la risposta sia un indirizzo IPv4, sostituire ANY con A; per IPv6, sostituirlo con. AAAANota che può restituire solo l'indirizzo utilizzato per la connessione. Ad esempio, durante la connessione su IPv6, non può restituire l'indirizzo A.

Server ed esempi alternativi

Oltre a OpenDNS, esistono servizi DNS simili forniti da Akamai e Google:

$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

Alias ​​di esempio che richiede specificamente un indirizzo IPv4:

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

E per IPv6:

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

Risoluzione dei problemi

Se il comando non funziona per qualche motivo, potrebbe esserci un problema con il provider upstream, lo strumento da riga di comando o qualcos'altro. Per capire perché non funziona, eseguire il comando senza l' +shortopzione per rivelare i dettagli della query DNS. Per esempio:

$ dig @resolver1.opendns.com ANY myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  ANY

;; ANSWER SECTION:
myip.opendns.com.   0   IN  AAAA    2606:4700:4700::1111

;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011

18
hai ragione è troppo veloce ..
Rahul Patil

4
@Krinkle è un'ottima risposta. Esiste un equivalente myip.opendns.comnel DNS pubblico di Google?
Kannan Mohan,

12
Ho trovato che questo è ~ 19 volte più veloce di curl http://canhazip.com. Vedi askubuntu.com/a/427092/2273
Adam Monsen

3
Adoro questo approccio pulito / senza dipendenze molto meglio di tutte le altre proposte, a meno che tu non sia vincolato alla porta 80
binaryanomaly

5
Si noti che in alcuni casi i router che forniscono NAT tradurranno anche le risposte DNS (è possibile dare un'occhiata a wiki.nil.com/Network_address_translation_of_DNS_responses ); in questo caso dovresti ricorrere ad alcune risposte che raccomandano un approccio diverso dal DNS.
Razvan Stefanescu,

146

NOTA: si tratta dell'indirizzo IP esterno (quello che i server su Internet vedono quando ci si collega a loro) - se si desidera l' indirizzo IP interno (quello che il proprio computer sta usando per le connessioni, che può essere diverso) vedere questo rispondere .

TL; DR - Metodi più veloci nel 2015

Il metodo più veloce utilizzando DNS:

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

o usando externalip :

externalip dns

Il più veloce usando HTTP:

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

o usando externalip:

externalip http

Il più veloce con HTTPS con un certificato valido:

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

o usando externalip:

externalip https

Utilizzando telnet:

Con nccomando:

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

o usando externalip:

externalip telnet

Con telnetcomando:

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

Usando 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 ...

Esistono molte opzioni di diversi server che forniscono l'IP esterno, specialmente via HTTP, pubblicato qui o altrove.

Ho fatto un punto di riferimento per vedere se qualcuno di loro è migliore degli altri e sono rimasto sorpreso dai risultati. Ad esempio, uno dei ifconfig.me più ampiamente raccomandato è 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 di benchmark esterno che ho usato:

Puoi eseguirlo tu stesso per vedere quali servizi menzionati qui valgono la pena utilizzare:

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

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

I 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).

Migliori tempi medi di ping:

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:

I 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=''

Migliori tempi medi di ping:

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 ping 999999 significano una perdita di pacchetti del 100%.)

DNS

Per un confronto qui ci sono volte che prendono altri metodi - testati il ​​16-06-2015 da Varsavia e Amsterdam.

usando:

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

richiede solitamente (tempo reale dell'orologio a muro) circa:

  • 0.035s da Varsavia
  • 0,015 da Amsterdam

In realtà ci sono quattro resolver che possono essere usati in questo modo:

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

Offrono tutti gli stessi tempi di risposta a Varsavia e Amsterdam, ma questo potrebbe non essere il caso in altre località.

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

  • 0.023s da Varsavia
  • 0.009s da Amsterdam

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

Telnet

Telnet con nco telnetcomando (vedi sopra) di solito prende:

  • 0.103s da Varsavia
  • 0.035s da Amsterdam

(Non vi è alcuna differenza evidente tra nce telnetcomandi.)

FTP

  • 0.104s da Varsavia
  • 0.036s da Amsterdam

Nomi di dominio

Tutti i metodi saranno più veloci (soprattutto quando eseguiti per la prima volta) quando verranno utilizzati gli indirizzi IP anziché i nomi di dominio dei servizi forniti (tranne 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 alcuni risultati interessanti dalla tua posizione o se ritieni che alcuni altri host dovrebbero essere raccomandati al posto di quelli che ho scelto, ti preghiamo di pubblicare un commento. Se manca qualche servizio importante, si prega di commentare o pubblicare un problema su GitHub. Vorrei mantenere questo post aggiornato con una scelta attuale di servizi con le migliori prestazioni.


2
Hai confrontato il myip.opendns.commetodo DNS come nella risposta di Krinkle ? Attualmente sembra che sia vincitore per impostazione predefinita perché ignaro di altri provider per questo metodo, ma sarebbe comunque utile confrontarlo con gli altri metodi.
James Haigh,

@JamesHaigh Grazie per il suggerimento. Ho aggiunto DNS e altri metodi (telnet, ftp) alla risposta. Il metodo più veloce sembra essere il DNS che utilizza direttamente l'indirizzo IP (anziché il nome di dominio) del resolver.
rsp

È necessario aggiungere / testare canhazip.com / canhazip.com (HTTP e HTTPS).
xxdesmus,

Puoi aggiungere myip.addr.space al tuo elenco. L'ho costruito da solo perché non ero particolarmente soddisfatto di nessuno degli altri che avevo visto in quel momento.
Michael Hampton,

A volte ottengo risultati diversi usando dig +short myip.opendns.com @resolver1.opendns.com(36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34) e curl http://canhazip.com(36.71.64.71). Come posso decidere quale è corretta?
Sutandiono,

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

Sostituito il sito con quello olandese funzionante.


3
+1 Conoscevo whatismyip.com, ma non whatismyip.org, è fantastico.
Giuliano,

Non l'ho mai saputo! Ottimo sito!
bbosak,

2
@MaciekSawicki L' -sopzione è davvero necessaria in questo caso? Ho provato con / senza il mio fedora 15 - bash 4.2.10 (1) e ha funzionato in entrambi i modi.
ztank1013,

4
Sembra non funzionare più tramite l'interfaccia della riga di comando, ma andare alla pagina Web da un browser Web funziona. Sto usando openSUSE 12.1 x64.
Sault,

5
whatismyip.comha rimosso il servizio gratuito per verificare l'IP esterno. Quindi, temo che questo non sia più corretto. icanhazip.comfunziona ancora.
daSong,


18

Puoi usare ifconfig.me come alternativa a whatismyip.org.

curl -s http://ifconfig.me

Inoltre ifconfig.me ha alcune funzionalità aggiuntive. Per scoprire quali altre informazioni è possibile ricevere, visitare il sito Web.


5
È estremamente lento . Ricevo spesso tempi di risposta superiori a 30 secondi, a volte anche oltre un minuto! A volte è mezzo secondo (che è ancora molto), quindi circa 15 secondi. Questo è testato da diverse posizioni. Vedi la mia risposta per maggiori informazioni e benchmark.
rsp

15
wget -O - -q http://whatismyip.org/

3
Non sono riuscito a ottenere il mio IP in questo modo, lo <img src='ipimg.php'/>
dico

Ha funzionato con un bel po 'di magia regex, ma non è stato facile. Se insisti nell'utilizzare questo servizio, assicurati di avvolgere quella riga in uno script:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
syntaxerror


9

Preferisco usare curlmyip.com È semplice come:

curl curlmyip.com

È breve e semplice da ricordare.


Per l'uso in bash— l'intento del PO—, non puoi fare a meno -sdell'opzione menzionata in altre risposte.
Serge Stroobandt,

3
@SergeStroobandt Sì, puoi. Tutto lo -sswitch fa è eseguirlo in modalità silenziosa, cioè. i messaggi di errore non verranno visualizzati. Quindi dipende da come vuole che la sua sceneggiatura gestisca gli errori. Il comando stesso restituirà un indirizzo IP in modo affidabile come l'utilizzo di -s.
Garrett Fogerlie,

1
Finora, questo sito è stato il più affidabile in più test.
Amos Shapira,

9
curl ident.me

O

curl ifconfig.me

O

curl tnx.nl/ip

O

curl ipecho.net/plain

O

curl ip.appspot.com

O

curl whatismyip.akamai.com

O

curl icanhazip.com

O

curl wgetip.com

O

curl ip.tyk.nu

O

curl curlmyip.com

O

curl corz.org/ip

O

curl bot.whatismyipaddress.com

Riferimento


6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1

Uscita vuota qui, sebbene il sito funzioni. Qualche idea sul perché? Sono dietro un proxy, se è rilevante, ma wget icanhazip.comfunziona.
l0b0

@ l0b0 Prova a omettere la | tail -n1parte e vedi cosa ottieni dal proxy
Eugene Yarmash

Niente, basta uscire dal codice 1. Idem per netcat icanhazip.com 80. Sembra che ignori $http_proxye amici, perché specificare il proxy e la porta con -xappena portato a un processo sospeso.
l0b0

@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1per un proxy HTTP di base (supponendo che sia in esecuzione sulla porta 3128). Ovviamente avrai comunque l'indirizzo IP del proxy.
Tripleee

1
HTTP 1.0 non ha l' Host:intestazione della richiesta: l'hosting virtuale basato sul nome è stato uno dei maggiori miglioramenti di HTTP 1.1. O modifica la richiesta per specificare HTTP / 1.1 o rimuovi l'intestazione Host (ti consiglio il primo).
un CVn

4

Se dopo aver letto tutti questi suggerimenti vuoi leggere ancora di più, ecco uno script Bash probabilmente ingegnerizzato.

Contiene un elenco di server DNS e HTTP che sembrano funzionare bene a febbraio 2017.

Se lo hai dig, prova prima DNS che è quasi un ordine di grandezza più veloce dei vari servizi HTTP.

Esce alla prima risposta che ottiene.

Se non hai digo se tutti i server DNS non sono riusciti, prova i servizi HTTP fino a quando non ottiene una risposta.

I server sono elencati in ordine alfabetico, ma vengono mescolati prima dell'uso per evitare di utilizzare sempre lo stesso.

#!/bin/bash

## Get my external IP

timeout=2   # seconds to wait for a reply before trying next server
verbose=1   # prints which server was used to STDERR

dnslist=(
    "dig +short            myip.opendns.com        @resolver1.opendns.com"
    "dig +short            myip.opendns.com        @resolver2.opendns.com"
    "dig +short            myip.opendns.com        @resolver3.opendns.com"
    "dig +short            myip.opendns.com        @resolver4.opendns.com"
    "dig +short    -t txt  o-o.myaddr.l.google.com @ns1.google.com"
    "dig +short -4 -t a    whoami.akamai.net       @ns1-1.akamaitech.net"
    "dig +short            whoami.akamai.net       @ns1-1.akamaitech.net"
)

httplist=(
    4.ifcfg.me
    alma.ch/myip.cgi
    api.infoip.io/ip
    api.ipify.org
    bot.whatismyipaddress.com
    canhazip.com
    checkip.amazonaws.com
    eth0.me
    icanhazip.com
    ident.me
    ipecho.net/plain
    ipinfo.io/ip
    ipof.in/txt
    ip.tyk.nu
    l2.io/ip
    smart-ip.net/myip
    tnx.nl/ip
    wgetip.com
    whatismyip.akamai.com
)



# function to shuffle the global array "array"
shuffle() {
   local i tmp size max rand
   size=${#array[*]}
   max=$(( 32768 / size * size ))
   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}


## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
    eval array=( \"\${dnslist[@]}\" )
    shuffle

    for cmd in "${array[@]}"; do
        [ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
        ip=$(timeout $timeout $cmd)
        if [ -n "$ip" ]; then
            echo $ip
            exit
        fi
    done
fi


# if we haven't succeeded with DNS, try HTTP

if [ ${#httplist[*]} == 0 ]; then
    echo "No hosts in httplist array!" >&2
    exit 1
fi

# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);

if [ -z "$curl_or_wget" ]; then
    echo "Neither curl nor wget found. Cannot use http method." >&2
    exit 1
fi

eval array=( \"\${httplist[@]}\" )
shuffle

for url in "${array[@]}"; do
    [ "$verbose" == 1 ] && echo Trying: $curl_or_wget  "$url" 1>&2
    ip=$(timeout $timeout $curl_or_wget "$url")
    if [ -n "$ip" ]; then
        echo $ip
        exit
    fi
done

Esempio di utilizzo (ho chiamato lo script myip):

$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"

$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'

Commenta la verbosevariabile nella parte superiore dello script per evitare di stampare il server utilizzato.

Aggiornamento: questo script ora è anche su Github dove potrei aggiornarlo quando necessario:
https://github.com/mivk/myip


3

Se si desidera utilizzare HTTPS per evitare alcune potenziali insidie:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"

2
Forse potresti approfondire quali sono le potenziali insidie ​​che stai evitando?
Caleb,

Apparentemente il dominio ipcheckit.com è in vendita e non ospita più il servizio di visualizzazione dell'indirizzo IP.
arte

ah, le insidie ​​degli script di sola scrittura :)
Ярослав Рахматуллин

@Chris Down la tecnica è ancora valida, hai solo bisogno di un altro sito abilitato SSL per usarlo.
Caleb,

3

Ecco un'altra alternativa che dipende dagli host la cui attività aziendale risolve la gestione dell'IP dinamico piuttosto che i siti di "servizio pubblico" che potrebbero andare via o cambiare formato.

  1. Registra il tuo server su uno dei tanti servizi DNS dinamici gratuiti (ad es. No-ip.com). Questo ti darà una voce DNS come xxx.no-ip.org.
  2. Installa lo strumento di aggiornamento dinamico del servizio (riporta le modifiche IP al servizio).

Per ottenere l'indirizzo IP in uno script, basta fare:

external_ip=`dig +short xxx.no-ip.org`

Ottimo per l'uso in cron job per verificare se l'IP dinamico è stato modificato e alcune voci di configurazione devono essere modificate.


3

Questo funziona sempre per me, lo uso nel mio conky per ottenere il mio indirizzo IP.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'

+1 Anche se sembra così goffo, questo approccio mi ha salvato la vita anche un paio di volte. Perché Internet non è il WWW . Puoi avere accesso a Internet, ma potresti (comunemente nelle sale server) essere condannato a una console non GUI, e in questo caso è importante ricordare a memoria uno degli URL del servizio checkIP. E poiché questo è piuttosto comune, è solo apparentemente compilato, poiché avrai più probabilità di ricordare quello DynDNS che quello di amazonaws. Cioè, se non hai modo di farlo per Google. (nemmeno lynx).
syntaxerror,

3

Dal momento che non faccio affidamento sulla connessione o sul servizio, utilizzo il seguente codice, che tenta di ottenere l'IP utilizzando diversi servizi (sentiti libero di aggiungere altro):

# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)

while [ -z "$IP" ] # If no IP found yet, keep trying!
do
    sleep 30
    IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$((  RANDOM % ${#arr[@]}  ))]})  
done

echo -n "$IP" >  /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP" 

Per aggiungere più robustezza (ad esempio se uno dei servizi cambia il loro formato), è possibile verificare che $IPsia un IP valido utilizzando la seguente funzione :

# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo $1 | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}

3

ifcfg.me supporta:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

IPv4 e IPv6, ancora più cose con il ricciolo: ifcfg.me/?


In che modo il nslookupmetodo si collega al digmetodo nella risposta di Krinkle ? Entrambi usano DNS, giusto? Quindi posso passare qualche opzione per digfar sì che recuperi lo stesso record DNS che nslookupsta facendo qui?
James Haigh,

Sì, puoi usarlo dig +short . @ifcfg.mese lo desideri
Eun

2

Gestisco un servizio cloud per la mia famiglia e ho realizzato questo script veloce che eseguo cronogni mattina alle 5 perché sono economico e non comprerò un IP statico.

Cattura l'IP pubblico e lo invia per e-mail ai miei utenti. L'ho reso e-mail in formato hyperlink in modo che mia mamma non debba digitare le porte o altro. Forse qualcun altro può usarlo per.

#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);

echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s   "From your friendly cloud service provider" user1@someemail.com, user2@ect.com

1

Questo mostrerà l'attuale indirizzo IP in una finestra popup:

zenity --info --text "$(curl -s icanhazip.com)"

1

Ho installato un servizio che restituisce l'indirizzo IP come JSON / XML o testo normale. Puoi trovarli qui

http://ipof.in/txt

Lo stesso URL con / json e / xml ti darà anche altri formati

Se si desidera HTTPS, è possibile utilizzare gli stessi URL con prefisso https. Il vantaggio è che anche se sei su un Wifi otterrai l'indirizzo pubblico.

Quindi un semplice alias myip = "curl https://ipof.in/txt " otterrà il tuo IP


1

In alternativa, è possibile utilizzare STUN che è stato inventato per rispondere a questa domanda in modo automatizzato ed è ampiamente utilizzato nelle comunicazioni su Internet, ad esempio SIP e WebRTC .

Usando uno stunclient (su debian / ubuntu do apt-get install stuntman-client) semplicemente:

$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

dove si A.B.C.Dtrova l'indirizzo IP della tua macchina sulla rete locale e dove si W.X.Y.Ztrovano i server di indirizzi IP come i siti Web dall'esterno (e quello che stai cercando). Utilizzando sedè possibile ridurre l'output sopra solo a un indirizzo IP:

stunclient stun.services.mozilla.com |
    sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"

Per una ricerca STUN alternativa utilizzando nient'altro che strumenti di base della riga di comando, vedere la mia risposta su AskUbuntu (intesa come esercizio divertente, non per uso in produzione).


0

Il browser in testo semplice w3m è ottimo per la bash. È possibile utilizzare grepe tailabbreviare la risposta come segue:

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1


0

Utilizzando una richiesta DNS anche dietro un router NAT che traduce gli indirizzi DNS, questo può funzionare:

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t

oppure puoi invece utilizzare il metodo di richiesta HTTP:

$ curl -s ipinfo.io/ip
x.y.z.t

1
Perché consiglieresti uno sopra l'altro?
roaima

@roaima Hai ragione, sta a ciascun utente decidere.
SebMa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.