GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener la dirección IP externa en un script de Shell?

Necesito encontrar mi dirección IP externa desde un script de shell. Por el momento uso esta función:

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

Pero depende de perl-libwww , perl-html-format , perl-html-tree instalado. ¿De qué otras formas puedo obtener mi IP externa?

Respuesta aceptada:

Recomiendo obtenerlo directamente de un servidor DNS.

La mayoría de las otras respuestas a continuación implican pasar por HTTP a un servidor remoto. Algunos de ellos requerían el análisis de la salida o se basaban en el encabezado User-Agent para hacer que el servidor respondiera en texto sin formato. Estos cambian con bastante frecuencia (bajan, cambian su nombre, publican anuncios, pueden cambiar el formato de salida, etc.).

  1. El protocolo de respuesta DNS está estandarizado (el formato seguirá siendo compatible).
  2. Históricamente, los servicios DNS (Akamai, Google Public DNS, OpenDNS, ..) tienden a sobrevivir mucho más tiempo y son más estables, más escalables y, en general, más cuidados que cualquier nuevo servicio HTTP de whatismyip dot-com que esté de moda. hoy.
  3. Este método es intrínsecamente más rápido (¡aunque solo sea por unos pocos milisegundos!).

Usando dig con una resolución de OpenDNS:

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

Tal vez alias en su bashrc para que sea fácil de recordar

# 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'

Responde con una dirección IP simple:

$ wanip # wanip4, or wanip6
80.100.192.168 # or, 2606:4700:4700::1111

Sintaxis

(Abreviado de 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)
             ...

El ANY el tipo de consulta devuelve un registro AAAA o A. Para preferir la conexión IPv4 o IPv6 específicamente, use el -4 o -6 opciones en consecuencia.

Para solicitar que la respuesta sea una dirección IPv4, reemplace ANY con A; para IPv6, reemplácelo con AAAA . Tenga en cuenta que solo puede devolver la dirección utilizada para la conexión. Por ejemplo, cuando se conecta a través de IPv6, no puede devolver la dirección A.

Servidores alternativos

Varios proveedores de DNS ofrecen este servicio, incluidos OpenDNS, Akamai y 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"

Ejemplo de alias que solicita específicamente una dirección IPv4:

# https://unix.stackexchange.com/a/81699/37512
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'

$ wanip4
80.100.192.168

Y para su dirección 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"

Resolución de problemas

Si el comando no funciona por alguna razón, puede haber un problema de red. Prueba una de las alternativas anteriores primero.

Relacionado:¿Intenta recuperar datos de una unidad RAID externa?

Si sospecha un problema diferente (con el proveedor ascendente, la herramienta de línea de comandos o algo más), ejecute el comando sin +short opción para revelar los detalles de la consulta DNS. Por ejemplo:

$ 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. ¿Cómo obtener la dirección IP propia y guardarla en una variable en un script de Shell?

  2. ¿Cómo leer todo el script de Shell antes de ejecutarlo?

  3. ¿Cómo configurar la dirección de proxy en todo el sistema mediante el script de Shell?

  4. ¿Cómo obtener el nombre de la rama git actual en una variable en un script de Shell?

  5. ¿Cómo ejecutar código en el shell de Django mediante un script de python externo?

Cómo usar variables en secuencias de comandos de Shell

Cómo obtener su dirección IP en Linux

¿Cómo ejecutar un comando en un script de Shell?

Obtenga la dirección MAC usando un script de shell

¿Cómo puedo obtener mi dirección IP externa en un script de shell?

¿Cómo obtengo mi dirección IP desde la línea de comandos?