GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere l'indirizzo IP esterno in uno script di shell?

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

  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 qualunque nuovo servizio HTTP whatismyip dot-com alla moda sia caldo oggi.
  3. 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

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

  2. Come impostare l'indirizzo proxy a livello di sistema utilizzando lo script della shell?

  3. Come ottenere PYTHONPATH nella shell?

  4. Come ottenere il PID dal processo figlio biforcuto nello 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 ottenere il tuo indirizzo IP su Linux

Come eseguire un comando in uno script della shell?

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

Ottieni l'indirizzo MAC usando lo script della shell

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