GNU/Linux >> Tutoriales Linux >  >> Linux

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

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 dependían del 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

Quizás alias en tu 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.

Si sospecha de un problema diferente (con el proveedor ascendente, la herramienta de línea de comandos o algo más), ejecute el comando sin el +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

NOTA:Esto es sobre externo Dirección IP (la que ven los servidores en Internet cuando te conectas a ellos) - si quieres interna Dirección IP (la que usa su propio ordenador para las conexiones, que puede ser diferente) consulte esta respuesta .

TL;DR:métodos más rápidos en 2015

El método más rápido usando DNS:

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

o usando IP externa:

externalip dns

El más rápido usando HTTP:

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

o usando IP externa:

externalip http

El más rápido usando HTTPS con un certificado válido:

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

o usando IP externa:

externalip https

Usando telnet:

Con nc comando:

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

o usando IP externa:

externalip telnet

Con telnet comando:

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 IP externa:

externalip ftp

Todo lo anterior se puede ejecutar usando mi script externalip como:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Ahora una larga historia...

Hay muchas opciones de diferentes servidores que proporcionan la IP externa, especialmente a través de HTTP publicado aquí o en otro lugar.

Hice un benchmark para ver si alguno de ellos es mejor que los demás y me sorprendieron los resultados. P.ej. uno de los ifconfig.me más recomendados era casi siempre el más lento para mí, a veces tardaba muchos segundos en responder. Muchos no funcionan a través de HTTPS, o funcionan pero tienen certificados no válidos. Algunos tienen tiempos de respuesta muy inconsistentes.

Puntos de referencia

HTTP y HTTPS

Esta es la fuente de mi script externalip-benchmark que utilicé:

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

Puede ejecutarlo usted mismo para ver qué servicios mencionados aquí vale la pena usar:

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

Mis resultados que obtuve el 2015-04-03 de Varsovia:las direcciones se cambiaron para proteger a los inocentes:

Mejores tiempos de respuesta 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'

Mejores tiempos de respuesta 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:hay algunas respuestas rápidas con contenido vacío; no son válidas).

Mejores tiempos promedio de 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/

Aquí están los resultados que obtuve el 2015-04-03 de Amsterdam:

Mejores tiempos de respuesta 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'

Mejores tiempos de respuesta 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=''

Mejores tiempos promedio de 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/

(Los 999999 pings significan una pérdida de paquetes del 100 %).

DNS

A modo de comparación, estos son los tiempos que toman otros métodos:probados el 16 de junio de 2015 en Varsovia y Ámsterdam.

Usando:

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

por lo general toma (tiempo de reloj de pared real) alrededor de:

  • 0,035 s desde Varsovia
  • 0,015 s desde Ámsterdam

En realidad hay cuatro resolutores que se pueden usar de esta manera:

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

Todos dan los mismos tiempos de respuesta en Varsovia y Ámsterdam, pero puede que no sea el caso en otros lugares.

Usando 208.67.222.222 - la IP de resolver1.opendns.com en lugar de su nombre de dominio es más rápida:

  • 0.023s desde Varsovia
  • 0.009s desde Ámsterdam

pero es posible que no funcione en el futuro si la IP cambia alguna vez (aunque puede ser poco probable para un sistema de resolución de DNS bien conocido, tal vez debería usar la IP en mi secuencia de comandos externalip, por favor comente).

Telnet

Telnet con nc o telnet el comando (ver arriba) usualmente toma:

  • 0.103s desde Varsovia
  • 0,035 s desde Ámsterdam

(No hay una diferencia notable entre nc y telnet comandos.)

FTP

  • 0,104 s desde Varsovia
  • 0,036 s desde Ámsterdam

Nombres de dominio

Todos los métodos serán más rápidos (especialmente cuando se ejecuten por primera vez) cuando se usen direcciones IP en lugar de los nombres de dominio de los servicios proporcionados (excepto con HTTP que puede usar servidores virtuales basados ​​en host y no funciona con IP simple - no probado), pero dejará de funcionar cuando los servicios cambien la dirección IP, por lo que puede ser más rápido pero menos preparado para el futuro.

Comentarios

Si ve algunos resultados interesantes de su ubicación, o si cree que se deberían recomendar otros hosts en lugar de los que he elegido, publique un comentario. Si falta algún servicio importante, comente o publique un problema en GitHub. Me gustaría mantener esta publicación actualizada con una selección actual de los mejores servicios.


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

Sitio reemplazado con uno de trabajo holandés.


Linux
  1. ¿Cómo obtener el nombre de distribución y el número de versión en un script de Shell simple?

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

  3. ¿Cómo crear un archivo temporal en Shell Script?

  4. ¿Cómo obtener el código de salida del proceso generado en el script de shell esperado?

  5. Obtenga la dirección MAC usando un script de shell

Cómo usar variables en secuencias de comandos de Shell

Cómo encontrar/obtener su dirección IP en Linux

Cómo crear scripts de shell

Cómo obtener su dirección IP en Linux

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

¿Cómo obtener el pid de un proceso e invocar kill -9 en el script de shell?