Encontrar la dirección IP pública en un script de shell


39

Puedo encontrar mi dirección IP usando el comando ifconfig o hostname -i.

Pero, ¿cómo encuentro mi IP pública?

(Tengo una IP pública estática pero quiero descubrirla usando el comando unix)


¿Estás tratando de hacer esto programáticamente?
Andrew Keith el

sí en el script de shell
shantanuo

1
¿Estás usando Linux, MacOSX, FreeBSD, etc.? La salida de 'ifconfig' es diferente para estos diferentes sistemas operativos, y el comando 'ip' no existe en MacOSX. ¿Está buscando la IP de su computadora (necesitará un script de shell para analizar ifconfig, o algo así), o su enrutador (los siguientes sitios web podrían funcionar)?
Stefan Lasiewski

Respuestas:


49

curl ifconfig.me

curl ifconfig.me/ip (solo por la ip)

curl ifconfig.me/all (para más información, lleva tiempo)

Para más comandos visite: http://ifconfig.me/#cli_wrap


1
¿Qué pasa con las direcciones IPv6?
Matt3o12

Ese enlace está muerto. Puede usar esto en su lugar:curl http://checkip.amazonaws.com/
Farhan.K

@ Farhan.K, publique esto como respuesta, ya que probablemente sea la mejor respuesta. Si no lo hace, mencionaré su nombre sugiriéndolo
2017

@Aliostad no dude en publicarlo :)
Farhan.K

@ Farhan.K argh, protegido: /
Aliostad

26

Puedes solicitar myip.opendns.com. de OpenDNS. dig @208.67.222.220 myip.opendns.com


8
Eso es genial. Para cualquier versión más fácil de recordar, puede ingresar dig @resolver1.opendns.com myip.opendns.com. O en Windows: nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat el

2
Lo que funcionó mejor para mí: dig @208.67.222.220 myip.opendns.com +shortpara obtener directamente la ip sin tener que pasar por la respuesta completa.
Christopher Chiche

18

dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short

dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

dig -4 @resolver1.opendns.com -t a myip.opendns.com +short


Tenga en cuenta que lo anterior solo funciona para IPv4 actualmente (ninguno de estos solucionadores parece tener IPv6 actualmente, pero si omite -4y el explícito-t a , entonces corre el riesgo de que se rompa en el futuro (con la excepción de Google txt, que en realidad podría funcionar para IPv6 un día, si Google lo habilita correctamente)).

Tenga en cuenta que myip.opendns.comsolo se puede resolver a través de resolver1.opendns.com, y no con auth1.opendns.com, por lo tanto, ¡parecen estar haciendo un secuestro de DNS y un hombre en el medio de su propio nombre de dominio! Por lo tanto, no puede usarlo para encontrar la IP de un resolutor aleatorio, ya resolver1.opendns.comque no tiene autoridad para hacerlo myip.opendns.com.

Tenga en cuenta que o-o.myaddr.l.google.comparece el enfoque más flexible y a prueba de futuro; incluso es bueno para probar si su solucionador de DNS admite la extensión experimental EDNS0 para la subred del cliente (que muy pocos resolutores tienen soporte para):

% dig @8.8.8.8 -t txt o-o.myaddr.l.google.com +noall +answer +stats | tail -8
;; global options:  printcmd
o-o.myaddr.l.google.com. 60     IN      TXT     "74.125.189.16"
o-o.myaddr.l.google.com. 60     IN      TXT     "edns0-client-subnet 88.198.54.0/24"
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec  8 20:38:46 2013
;; MSG SIZE  rcvd: 114

2
@ Matt3o12 <encontré OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh

Hoy en día, el método para obtener registros TXT de Google admite tanto IPv4 como IPv6, por lo que debe especificar -4o -6si necesita una versión IP específica.
Martin

12

Una respuesta muy simple si tiene acceso a internet es:

curl icanhazip.com

Tenga en cuenta que confiar en fuentes de terceros para su IP puede ser problemático, especialmente si lo que hace con esos datos tiene un significado especial.

Una forma más confiable es elegir un servidor DNS conocido y confiable (idealmente ejecutando DNSSEC) y consultar el nombre de host de la caja con él, siempre que su servidor DNS contenga tales entradas;

dig @trustworthysource.com +short `hostname`

8

Escribí un servicio web simple y rápido para esto.

curl ident.me

Puede solicitar su IPv4:

curl v4.ident.me

O IPv6:

curl v6.ident.me

Y la API está documentada en http://api.ident.me/



5

Si

  1. solo tiene una dirección IP pública y
  2. Está conectado directamente a Internet (sin NAT / proxy / VPN, etc.)

entonces puede analizar la salida de ifconfig para las direcciones IP de las interfaces (la parte "inet addr:") para obtener la lista de direcciones IP de todas sus interfaces. La única dirección IP que no está en el rango privado (consulte http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) es su dirección IP pública.

La misma lista también se puede obtener a través de

ip addr show

que puede ser más fácil de analizar.

Si no tiene una conexión directa a Internet (NAT, etc.), no hay forma de encontrar su dirección IP pública sin ayuda externa (ya que su computadora no lo sabe). Entonces tendrás que hacerlo como en las otras respuestas.


4

Tomé un enfoque un poco diferente al usar el protocolo STUN que fue diseñado para NAT Traversal. Si usa Ubuntu, puede instalar el paquete "aturdir" escribiendo:

sudo apt-get install stun

El paquete instala un servidor STUN que probablemente no necesitará, pero también viene con un cliente de prueba STUN que utilicé para resolver este problema. Ahora puede recuperar su IP pública con un comando (no tan simple):

stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq

Ahora, lo que hace es: aturdir contacta al servidor STUN público "stunserver.org" y obtiene una respuesta con su IP pública, el resto del comando es simplemente filtrar la IP de la salida.


stun.l.google.com es más rápido: D
Zibri

3

Una forma es, puede hacer una solicitud a la página en

http://www.biranchi.com/ip.php

devuelve la dirección IP de su sistema


Sirve de texto plano con un tipo de texto / html ...
Bortzmeyer

¿No está mostrando tu IP en tu navegador?

2
Pero con el tipo equivocado.
bortzmeyer

@bortzmeyer Uh, ¿cuál es el "tipo correcto"? text/htmlestá bien para lo que devuelve esa pseudo API: ciertamente no es XML o JSON. text/plaintal vez, pero es completamente utilizable como text/html.
ceejayoz

3
+1 para una página que no necesita grepping. Tambiénwget -q -O - http://wgetip.com/
xofer

3

Google ahora muestra su dirección IP pública: http://www.google.com/search?q=ip


Eso no funciona para mí, ya sea en un navegador o mediante curl.
Ladadadada 01 de

Eso es extraño. El mío dice "Su dirección IP pública es XX.XX.XXX.XX - Obtenga más información" en la parte superior antes del primer serp.
Jake Wilson

Trabajó en mi conexión 3G. Aprende más puntos aquí .
Ladadadada 01 de

Google por alguna extraña razón solo muestra su dirección IP en función de qué User-Agentcadena se proporciona a la página. Con Firefox, funciona; pero SeaMonkey con la cadena "Firefox" deshabilitada (a través de "general.useragent.compatMode.firefox" establecida en falso), de repente no lo hace. No tengo ni idea de por qué Google habilita explícitamente cosas como esta solo para Firefox en lugar de cualquier Gecko, ya que hay muchos otros navegadores de escritorio basados ​​en Gecko que son igualmente compatibles, incluido SeaMonkey.
cnst

curl -qs " google.com/search?q=blowme"|tr " () "" \ n "| grep Client | cut -d": "-f 2 | tr -d" "
Zibri

3

Bien ... Sé que esto es MUCHO después del hecho y probablemente ni siquiera valga la pena publicarlo, pero aquí está mi solución de trabajo.

#!/bin/sh

IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP

Agradable y simple


2
Esto devuelve la dirección IP interna que no se solicitó. Pero, para su información, también puede hacerlo con el comando hostname -I(mayúscula 'i').
Redsandro

3

La forma más simple es usar http://ifconfig.me/ , como se sugiere.

En esta página, sabrá qué comando usar para la información que desea recuperar.

Para IP:

curl ifconfig.me
o
curl ifconfig.me/ip

Para el nombre de host público:

curl ifconfig.me/host

Para toda la información en un archivo XML:

curl ifconfig.me/all.xml

etc ... solo echa un vistazo a http://ifconfig.me


2

Estoy haciendo esto mucho y desde muchos dispositivos, así que hice mis propios dos servicios en un servidor:

  1. archivo php en la raíz de un servidor web:

    user@host:~$ cat index.php`
    <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
    

    Uso en una cáscara:

    $ curl -4 mydomain.com
    79.22.192.12
    

    También trabajando con ipv6:

    $ curl mydomain.com
    2a01:e34:ee7d:180::3
    

    Con netcat:

    $ echo "GET /" | nc myserver.com 80
    2a01:e34:ee7d:180::3
    

    En un enrutador Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. pirateo rápido con un servidor Telnet personalizado: xinetd spawning / usr / bin / env:

    service telnet
    {
       server           = /usr/bin/env
       socket_type      = stream
       protocol         = tcp
       flags            = IPv6
       wait             = no
       port             = 23
       cps              = 3 30
       passenv          = %a
    }
    

    y luego telnet para ello:

    $ nc -4 myserver.com 23
    REMOTE_HOST=::ffff:79.22.192.12
    
    $ nc myserver.com 23
    REMOTE_HOST=2a01:e34:ee7d:180::3
    

    funciona igual con un enrutador:

    router#telnet myserver.com
    79.22.192.12
    

De esta manera, puede hacer que funcione en su red interna, si algún nat o proxy está involucrado en la comunicación y desea saber de qué IP aparece.

No requiere ningún servicio de terceros.


2

Para evitar depender de fuentes externas, utilizo expect, para hacer telnet en mi enrutador y obtener la dirección IP de su interfaz pública. Aquí hay un ejemplo de script script:

#!/usr/bin/expect
if { $argc < 3 } {
puts "usage: ./telnet2router.exp router-ip username password"
return -1
}
set ip [lrange $argv 0 0]
set username [lrange $argv 1 1]
set password [lrange $argv 2 2]

spawn telnet $ip
expect "login:" {
    send "$username\r"
}
expect "Password:" {
    send "$password\r"
}
expect "#" {
    send "ifconfig ppp0 | grep inet\r"
    send "exit\r"
}
expect eof

Luego ejecuto el script anterior como este para obtener la ip pública:

./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1

Por supuesto, esto se basa en la suposición de que tengo acceso de administrador al enrutador, y es un enrutador basado en Linux, con el comando ifconfig disponible.




1

Si lo que desea es encontrar la dirección IP externa en su enrutador, puede pedirle al enrutador su dirección pálida o pedirle a alguien de afuera que la obtenga por usted.

para una forma manual, puede navegar en cualquiera de los sitios anteriores que devolverán la dirección IP de la solicitud de ingreso.

De manera automatizada, puede intentar:

wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\. 

que le dará la línea que contiene la dirección IP en la respuesta http, luego la analizará con sed, awk, etc.


0

puedes usar solo el shell para verificar tu ip externa, también usando proveedores externos

#!/bin/bash
TCP_HOST="checkmyip.com"
TCP_PORT=80              
exec 5<>/dev/tcp/"${TCP_HOST}"/"${TCP_PORT}"
echo -e "GET / HTTP/1.0\nHOST:${TCP_HOST}\n" >&5
while read -r line 
do  
    case "$line" in
        *"Your local IP address is"* ) 
            line="${line#*Your local IP address is&nbsp;}"
            line=${line%%</p>*}
            echo "Your ip is: $line"
            exec >&5-
            exit
            ;;            
    esac
done <&5

salida


0
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]. * \. [0-9]. * \. [0-9]. * \. [0-9]. *'
-m1 

0

Hago esto. Simplemente me da la IP sin ninguna participación de terceros.

ip addr show | grep eth0 | grep inet | tr -s "" | corte -f3 -d "" | cortar -f1 -d "/"


3
Quiere su dirección IP pública. No el local.
Jake Wilson

0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

0

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.


0

En OS X, aquí hay dos soluciones simples para obtener la IP privada y pública (con código de bonificación si usa LaunchBar).

IP privada

$ ipconfig getifaddr $1
# $1=en0 || en1 || en*

LaunchBar Script

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"

IP pública

$ dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com
# ||    
$ curl $1
# $1=http://wtfismyip.com/text || http://ip-addr.es || http://icanhazip.com || http://wgetip.com || http://ident.me || http://ifconfig.me || https://shtuff.it/myip/short || http://curlmyip.com

LaunchBar Script

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.