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

273

Necesito encontrar mi dirección IP externa de un script de shell. En este momento uso esta función:

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

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

Eugene Yarmash
fuente
8
¿Qué quieres decir con IP externa? Las dos respuestas hasta ahora usan HTTP. La respuesta puede terminar siendo la IP del servidor proxy de su ISP. (Que puede ser lo que quieras.)
billpg
@billpg: me refiero a la IP del enrutador NAT
Eugene Yarmash
Entonces necesitará un servicio web what-is-my-IP que use HTTPS. Por desgracia, no sé de ninguno.
billpg
1
@billpg ipcheckit.com
Gilles
checkip.amazonaws.com usa esto de un proveedor bien conocido
arulraj.net el

Respuestas:

443

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 requirieron el análisis de la salida, o se basaron en el encabezado User-Agent para que el servidor respondiera en texto plano. Esos cambian con bastante frecuencia (baja, cambia su nombre, publica anuncios, puede cambiar el formato de salida, etc.).

  1. El protocolo de respuesta DNS está estandarizado (el formato seguirá siendo compatible).
  2. Históricamente, los servicios de DNS ( OpenDNS , Google Public DNS , ...) 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.com.
  3. Este método es inherentemente más rápido (¡solo unos pocos milisegundos!).

Utilizando digcon OpenDNS como solucionador:

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

Quizás lo alias en tu, bashrcasí que es fácil de recordar

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

Responde con una dirección IP simple:

$ wanip
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 ANYtipo de consulta devuelve un registro AAAA o A. Para preferir específicamente la conexión IPv4 o IPv6, use las opciones -4o en -6consecuencia.

Para requerir que la respuesta sea una dirección IPv4, reemplace CUALQUIERA con A; para IPv6, reemplácelo con. AAAATenga 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 y ejemplos

Además de OpenDNS, hay servicios DNS similares proporcionados por Akamai y 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"

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

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

$ wanip4
80.100.192.168

Y para IPv6:

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

$ wanip6
2606:4700:4700::1111

Solución de problemas

Si el comando no funciona por alguna razón, puede haber un problema con el proveedor ascendente, la herramienta de línea de comando u otra cosa. Para ayudar a comprender por qué no funciona, ejecute el comando sin la +shortopción de revelar los detalles de la consulta DNS. Por ejemplo:

$ 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
Timo Tijhof
fuente
18
tienes razón es demasiado rápido ..
Rahul Patil
44
@Krinkle es una excelente respuesta. ¿Hay un equivalente para myip.opendns.comen Google Public DNS?
Kannan Mohan
12
Encontré que esto es ~ 19 veces más rápido que curl http://canhazip.com. Ver askubuntu.com/a/427092/2273
Adam Monsen
3
Me encanta este enfoque limpio / sin dependencias mucho mejor que todas las demás propuestas, a menos que esté obligado al puerto 80
binaryanomaly
55
Tenga en cuenta que, en algunos casos, los enrutadores que proporcionan NAT también traducirán las respuestas de DNS (puede consultar wiki.nil.com/Network_address_translation_of_DNS_responses ); en este caso, debe recurrir a alguna respuesta que recomiende otro enfoque que no sea DNS.
Razvan Stefanescu
146

NOTA: Se trata de una dirección IP externa (la que ven los servidores en Internet cuando se conecta a ellos). Si desea una dirección IP interna (la que su computadora está utilizando para las conexiones, que puede ser diferente), vea esto contestar .

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

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

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

o usando externalip :

externalip dns

El más rápido usando HTTP:

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

o usando externalip:

externalip http

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

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

o usando externalip:

externalip https

Usando 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

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 punto de referencia para ver si alguno de ellos es mejor que los demás y los resultados me sorprendieron. Por ejemplo, uno de los ifconfig.me más recomendados fue casi siempre el más lento para mí, a veces me llevó muchos segundos 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 de referencia externa que utilicé:

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: se han cambiado las direcciones 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 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 03/04/2015 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 pings 999999 significan una pérdida de paquetes del 100%).

DNS

A modo de comparación, aquí hay momentos que otros métodos toman, probados el 16/06/2015 en Varsovia y Amsterdam.

Utilizando:

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

generalmente toma (tiempo real del reloj de pared) aproximadamente:

  • 0.035s desde Varsovia
  • 0.015s desde Amsterdam

En realidad, hay cuatro resolvers 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 este puede no ser el caso en otros lugares.

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

  • 0.023s de Varsovia
  • 0.009s desde Amsterdam

pero puede no funcionar en el futuro si la IP cambia alguna vez (aunque puede ser poco probable para un resolutor DNS bien conocido; tal vez debería usar la IP en mi script de externalip , por favor comente).

Telnet

Telnet con nco telnetcomando (ver arriba) generalmente toma:

  • 0.103s de Varsovia
  • 0.035s desde Amsterdam

(No hay una diferencia notable entre los comandos ncy telnet).

FTP

  • 0.104s de Varsovia
  • 0.036s de Amsterdam

Nombres de dominio

Todos los métodos serán más rápidos (especialmente cuando se ejecutan por primera vez) cuando se usarán direcciones IP en lugar de los nombres de dominio de los servicios prestados (excepto con HTTP que puede usar servidores virtuales basados ​​en host y no funcionar con IP desnuda) 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 a prueba de futuro.

Comentarios

Si ve algunos resultados interesantes de su ubicación, o si cree que se deberían recomendar algunos 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.

rsp
fuente
2
¿Ha comparado el myip.opendns.commétodo DNS como en la respuesta de Krinkle ? Actualmente parece que es ganador por defecto debido a que no conoce a ningún otro proveedor para este método, pero aún sería útil compararlo con los otros métodos.
James Haigh
@JamesHaigh Gracias por la sugerencia. Agregué DNS y otros métodos (telnet, ftp) a la respuesta. El método más rápido parece ser DNS usando directamente la dirección IP (en lugar del nombre de dominio) del solucionador.
rsp
También debe agregar / probar canhazip.com / canhazip.com (HTTP y HTTPS).
xxdesmus
Puede agregar myip.addr.space a su lista. Lo construí yo mismo, ya que no estaba particularmente satisfecho con ninguno de los otros que había visto en ese momento.
Michael Hampton
A veces obtengo resultados diferentes 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) y curl http://canhazip.com(36.71.64.71). ¿Cómo puedo decidir cuál es el correcto?
Sutandiono
80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Sitio reemplazado por uno holandés en funcionamiento.

Maciek Sawicki
fuente
3
+1 Sabía sobre whatismyip.com, pero no whatismyip.org, eso es increíble.
Julian
¡Nunca supe de eso! Gran sitio!
bbosak
2
@MaciekSawicki ¿Es la -sopción realmente necesaria en este caso? Intenté con / sin él en mi fedora 15 - bash 4.2.10 (1) y funcionó en ambos sentidos.
ztank1013 15/10/11
44
Parece que ya no funciona a través de la CLI, pero funciona ir a la página web desde un navegador web. Estoy usando openSUSE 12.1 x64.
SaultDon
55
whatismyip.comha eliminado el servicio gratuito para verificar la IP externa. Entonces, me temo que esto ya no es correcto. icanhazip.comtodavía funciona.
daSong
54

Desde whatsmyip.org e ifconfig.me ya se han mencionado:

curl -s icanhazip.com
joschi
fuente
44
Otro: ip.appspot.com o ip.appspot.com
Lekensteyn
1
Estos dos admiten IPv6.
Josh Lee
1
@JoshLee, tenga en cuenta que icanhazip también es compatible con ipv6. Además, una nota para el OP, todas estas curlsoluciones (aunque válidas) aún dependen de una biblioteca externa ( libcurl).
HalosGhost
Otro: ifcfg.me
Eun
18

Puede usar ifconfig.me como alternativa a whatismyip.org.

curl -s http://ifconfig.me

También ifconfig.me tiene algunas funciones adicionales. Para saber qué otra información puede recibir, visite el sitio web.

Señor inmortal
fuente
55
Es extremadamente lento . A menudo obtengo tiempos de respuesta de más de 30 segundos, ¡a veces incluso más de un minuto! A veces es medio segundo (que todavía es mucho), y luego son 15 segundos más o menos. Esto se prueba desde diferentes lugares. Vea mi respuesta para más información y puntos de referencia.
rsp
15
wget -O - -q http://whatismyip.org/
ztank1013
fuente
3
No pude obtener mi IP de esta manera, solo lo da como:<img src='ipimg.php'/>
Yuugian
Lo hice funcionar con una buena cantidad de magia regex, pero no fue fácil. Si insiste en usar este servicio, asegúrese de incluir esa línea en un script:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
syntaxerror
13

Amazon AWS

curl https://checkip.amazonaws.com

Salida de muestra:

123.123.123.123

Me gusta porque:

  • devuelve solo la IP de texto sin formato, nada más
  • es de un proveedor conocido que es poco probable que se desconecte pronto
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
9

Prefiero usar curlmyip.com Es tan simple como:

curl curlmyip.com

Es corto y simple de recordar.

Garrett Fogerlie
fuente
Para su uso en bash—la intención del OP—, no puede prescindir de la -sopción mencionada en otras respuestas.
Serge Stroobandt
3
@SergeStroobandt Sí, puedes. Todo lo que hace el -sswitch es ejecutarlo en modo silencioso, es decir. No se mostrarán mensajes de error. Entonces se trata de cómo quiere que su guión maneje los errores. El comando en sí devolverá una dirección IP de manera tan confiable como usar el -s.
Garrett Fogerlie
1
Hasta ahora, este sitio era el más confiable en múltiples pruebas.
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

Referencia

Mandar Shinde
fuente
6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
Eugene Yarmash
fuente
Salida en blanco aquí, aunque el sitio funciona. ¿Alguna idea de por qué? Estoy detrás de un proxy, si es relevante, pero wget icanhazip.comfunciona.
l0b0
@ l0b0 Intenta omitir la | tail -n1parte y ver qué obtienes del proxy
Eugene Yarmash
Nada, solo salga del código 1. Lo mismo para netcat icanhazip.com 80. Parece que ignora $http_proxyy amigos, porque especificar el proxy y el puerto con -xsolo resultó en un proceso de bloqueo.
l0b0
@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1para un proxy HTTP básico (suponiendo que se esté ejecutando en el puerto 3128). Sin embargo, obviamente obtendrá la dirección IP del proxy.
tripleee
1
HTTP 1.0 no tiene el Host:encabezado de solicitud: el alojamiento virtual basado en nombres fue una de las principales mejoras en HTTP 1.1. Cambie la solicitud para especificar HTTP / 1.1 o elimine el encabezado Host (recomiendo el primero).
un CVn
4

Si después de leer todas estas sugerencias desea leer aún más, aquí hay una secuencia de comandos Bash posiblemente sobredimensionada.

Contiene una lista de servidores DNS y HTTP que parecen funcionar bien a partir de febrero de 2017.

Si lo ha hecho dig, primero prueba DNS, que es casi un orden de magnitud más rápido que los diversos servicios HTTP.

Sale en la primera respuesta que recibe.

Si no tiene digo si todos los servidores DNS fallaron, entonces prueba los servicios HTTP hasta que recibe una respuesta.

Los servidores se enumeran alfabéticamente, pero se barajan antes de usarlos para evitar usar siempre el mismo.

#!/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

Ejemplo de uso (llamé al 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'

Comente la verbosevariable en la parte superior del script para evitar imprimir el servidor utilizado.

Actualización: este script ahora también está en Github, donde podría actualizarlo cuando sea necesario:
https://github.com/mivk/myip

mivk
fuente
3

Si desea utilizar HTTPS para evitar posibles dificultades:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
Chris Down
fuente
2
¿Quizás podría explicar cuáles son las posibles trampas que está evitando aquí?
Caleb
El dominio ipcheckit.com aparentemente está a la venta y ya no aloja el servicio de visualización de la dirección IP.
manatwork
ah, las trampas de los guiones de escritura única :)
Ррослав Рахматуллин
@Chris Down la técnica sigue siendo válida, solo necesitas otro sitio con SSL para usarla.
Caleb
3

Aquí hay otra alternativa que depende de los hosts que el negocio resuelve en torno a la administración de IP dinámica en lugar de los sitios de "servicio público" que pueden desaparecer o cambiar de formato.

  1. Registre su servidor en uno de los muchos servicios dns dinámicos gratuitos (por ejemplo, no-ip.com). Esto le dará una entrada DNS como xxx.no-ip.org.
  2. Instale la herramienta de actualización dinámica del servicio (informa los cambios de IP al servicio).

Para obtener la dirección IP en un script, simplemente haga:

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

Excelente para usar en el trabajo cron para verificar si la IP dinámica ha cambiado y algunas entradas de configuración deben cambiarse.

cgmonroe
fuente
3

Esto siempre funciona para mí, lo uso en mi conky para obtener mi dirección IP.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
Dai_Probar
fuente
+1 Aunque parezca tan torpe, este enfoque también me ha salvado la vida varias veces. Porque Internet no es WWW . Puede tener acceso a Internet, pero puede (comúnmente en salas de servidores) estar condenado a una consola que no sea GUI, y en este caso es importante recordar de memoria una de las URL del servicio checkIP. Y como este es bastante común, aparentemente solo está compilado, ya que es más probable que recuerdes el DynDNS que el de amazonaws. Es decir, si NO tiene forma de buscarlo en Google. (ni siquiera lynx)
syntaxerror
3

Como no confío en la conexión o en el servicio, utilizo el siguiente código, que intenta obtener la IP utilizando diferentes servicios (siéntase libre de agregar más):

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

Para agregar más solidez (por ejemplo, si uno de los servicios cambia su formato), puede verificar que $IPsea ​​una IP válida utilizando la siguiente función :

# 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;
}
Franck Dernoncourt
fuente
3

ifcfg.me admite:

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

IPv4 e IPv6, incluso más cosas con curl: ifcfg.me/?

Eun
fuente
¿Cómo nslookupse relaciona el método con el digmétodo en la respuesta de Krinkle ? Ambos usan DNS, ¿verdad? Entonces, ¿puedo pasar alguna opción para digque recupere el mismo registro DNS que nslookupestá haciendo aquí?
James Haigh
Sí, puedes usarlo dig +short . @ifcfg.mesi lo deseas
Eun
2

Ejecuté un servicio en la nube para mi familia e hice este script rápido que ejecuto crontodas las mañanas a las 5 porque soy barato y no compraré una IP estática.

Toma la IP pública y la envía por correo electrónico a mis usuarios. Lo hice por correo electrónico en formato de hipervínculo para que mi mamá no tenga que escribir los puertos ni nada. Quizás alguien más pueda usarlo.

#!/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
Será
fuente
1

Esto mostrará la dirección IP actual en una ventana emergente:

zenity --info --text "$(curl -s icanhazip.com)"
básico6
fuente
1

He configurado un servicio que devuelve la dirección IP como JSON / XML o texto sin formato. Usted puede encontrarlos aquí

http://ipof.in/txt

La misma URL con / json y / xml también le dará otros formatos

Si desea HTTPS, puede usar las mismas URL con el prefijo https. La ventaja es que incluso si está conectado a una red wifi obtendrá la dirección pública.

Entonces un simple alias myip = "curl https://ipof.in/txt " obtendrá su IP

vivekv
fuente
1

Alternativamente, puede usar STUN, que se inventó para responder esta pregunta de manera automatizada y se usa ampliamente en las comunicaciones de Internet, por ejemplo, SIP y WebRTC .

Usando un cliente aturdidor (en debian / ubuntu do apt-get install stuntman-client) simplemente haga:

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

dónde A.B.C.Destá la dirección IP de su máquina en la red local y dónde se encuentran los W.X.Y.Zservidores de direcciones IP como los sitios web desde el exterior (y el que está buscando). Si lo usa sed, puede reducir la salida anterior a solo una dirección IP:

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

Para una búsqueda alternativa de STUN utilizando nada más que herramientas básicas de línea de comandos, vea mi respuesta en AskUbuntu (pensado como un ejercicio divertido, no para uso en producción).

Victor Klos
fuente
0

El w3m Plaintext-Browser es ideal para la fiesta. Puede usar grepy tailacortar la respuesta de la siguiente manera:

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

Usa curl para acceder al servicio ip de shtuff.it

curl -s https://shtuff.it/myip/short
Chris Montanaro
fuente
301 movido permanentemente
McPeppr
el enlace está muerto ahora
Eugene Bujak
0

Usando una solicitud DNS incluso detrás de un enrutador NAT que traduce direcciones DNS, esto puede funcionar:

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

o, puede usar el método de solicitud HTTP en su lugar:

$ curl -s ipinfo.io/ip
x.y.z.t
SebMa
fuente
1
¿Por qué recomendarías uno sobre el otro?
roaima
@roaima Tienes razón, depende de cada usuario decidir.
SebMa