Extrae tu IP externa usando herramientas de línea de comando

Para decir la conclusión primero,
(y gracias@alfredormz para eso!)
La forma más elegante y rápida es esta:

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

Esto le pide la dirección IP del myip.opendns.comservidor de nombres resolver1.opendns.com(algo en lo que confía),
que devolverá su dirección IP externa.

Si no lo tiene dig,
puede utilizar estas alternativas:

curl ipecho.net/plain
curl icanhazip
.com
curl curlmyip
.com
curl l2
.io/ip
curl ip
.appspot.com
curl ifconfig
.me/ip
curl eth0
.me

O si alguna vez lo necesita en formato JSON:

curl httpbin.org/ip
curl wtfismyip
.com/json

Estos funcionan a través de HTTP
y , por lo tanto, son menos eficientes que la consulta DNS directa con dig.

Cuando utilice cualquiera de estas soluciones,
tenga en cuenta que depende de servicios externos.
Es posible que no estén disponibles temporalmente o incluso permanentemente en algún momento.
Entonces ninguno de estos es perfecto.

En realidad, este artículo trata sobre otra cosa.
Se trata del desafío de extraer los bits relevantes de un texto breve.
Recientemente, necesitaba extraer mi dirección IP externa de http://monip.org/ usando herramientas de línea de comandos.
Este artículo trata de explicar el proceso de pensamiento,
en caso de que alguna vez necesite algo similar.

Veamos qué obtenemos con un simple curl:

$ curl monip.org
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>MonIP.org v1.0</title>
<META http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
</head>
<P ALIGN="center"><FONT size=8><BR>IP : 67.205.36.164<br></font><font size=3><i>genovese.dreamhost.com</i><br></font><font size=1><br><br>Pas de proxy d�tect� - No Proxy detected</font></html>

Una forma de extraer la dirección IP de esto es usando sed:

$ curl -s monip.org | sed -n 's/.*IP : ([0-9.]*).*/1/p'
67.205.36.164�tect� - No Proxy detected</font></html>

Ugh. Casi funciona, pero casi:
queda algo de basura al final.
Realmente no sé por qué .*al final no borró todo después de la dirección IP.
Parece que sedtiene problemas con algunos caracteres que no son ascii.
Al observar la salida original,
parece que el sitio usa codificación ISO-8859-1,
por lo que si colocamos una iconven la tubería, podría solucionar el problema:

$ curl -s monip.org | iconv -f iso-8859-1 | sed -n 's/.*IP : ([0-9.]*).*/1/p'
67.205.36.164

¡Mucho mejor! Repasemos cómo sedfunciona esto :

  • Por defecto se sedhace eco de las líneas que procesa.
    La bandera lo desactiva: solo imprimirá cualquier cosa con comandos de impresión explícitos.-n

  • Una técnica para la extracción de un patrón de un cuerpo de texto está usando el lenguaje: . El en el reemplazo es una referencia posterior al patrón que se emparejó dentro de la primera expresión. El antes y el después del patrón de interés son para hacer que el patrón de búsqueda coincida con la línea completa, de modo que el resultado del reemplazo sea la línea completa reemplazada con el patrón de interés.s/.*(pattern).*/1/
    1(...)
    .*

  • Usamos como patrón. Este es un enfoque impreciso, vago, y que podría haber sido mucho más precisa, por ejemplo: . Depende de usted y de la tarea asignada dónde trazar la línea..*IP : ([0-9.]*).*


    .*IP : ([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})>.*

  • La pbandera en el idioma hace que se imprima la línea solo si hubo una sustitución. Esto es perfecto para nuestro propósito: de esta manera solo se imprimirá la línea con la dirección IP, después de la sustitución, por lo que la salida será simplemente la dirección IP en sí.s///psed



Por cierto,
cuando lo hice por primera vez, el problema de codificación con sedmi primera reacción estaba usando en su perllugar:

curl -s monip.org | perl -ne '/IP : ([0-9.]+)/ && print $1'

Esto usa la lógica de extracción equivalente como en el anterior sed,
con algunas diferencias debido a la naturaleza de estas herramientas:

  • La bandera es ejecutar una expresión de Perl dada en la línea de comando, a diferencia de un archivo especificado.-e

  • La bandera envuelve la expresión dentro de un bloque, lo que la hace adecuada para procesar la entrada estándar línea por línea.-nwhile (<>) { ... }

  • La coincidencia de patrones es un poco más simple en comparación con sed,
    porque sedusa expresiones regulares básicas (BRE),
    y Perl usa PCRE, que es mucho más avanzado.

  • En Perl, se puede usar otra forma de referencias a los patrones capturados dentro de (...)las expresiones que utilizan las variables $1, $2y así sucesivamente.

  • La expresión idiomática significa que, si el patrón coincide, imprima el contenido del primer grupo./(pattern)/ && print $1