¿Cuál es mi dirección IP?

24

Me sorprende que esto no haya surgido en un desafío todavía.

Imprima la dirección IP de la máquina en la que está ejecutando. Se requiere que envíe las direcciones IP locales y externas.

Dirección IP local, es decir, a lo largo del formato predeterminado de 192.168.xx

La dirección IP pública se puede verificar utilizando google https://www.google.co.uk/search?source=hp&q=whats+my+ip

La salida puede estar en cualquier formato. Se permite IPv4 o IPv6 o cualquier combinación de cada uno, sin embargo, deben ser la única salida. El código puede ser un programa completo o una función.

aplican las reglas del , por lo que el código más corto gana.

Las lagunas estándar están prohibidas.

EDITAR: Según el comentario de @Peter Taylor, en el caso de que haya múltiples direcciones de cualquier tipo, puede optar por generar la primera o todas las que pueda acceder. Siempre que al menos un local y un público estén presentes.

MysticVagabond
fuente
3
Creo que la 0/1cosa agrega una pelusa innecesaria al desafío.
Sr. Xcoder
55
Esto está poco especificado. En particular, no aborda claramente los casos en que hay múltiples direcciones IP locales y / o múltiples direcciones IP públicas. Además, no hay una forma confiable de saber si tengo varias direcciones IP públicas y, de ser así, cuáles son.
Peter Taylor
55
¿Qué sucede si el host no tiene ninguna dirección RFC 1918? Parece que no hay una respuesta confiable a esto, excepto en máquinas que tienen al menos una red privada.
Toby Speight
44
... e incluso una interfaz de red puede tener múltiples direcciones IP.
Kaz
14
En realidad, no veo cómo podría resolver la mitad de esto sin obtenerlo de una fuente externa , que es una de las lagunas estándar que ha prohibido expresamente.
Pulpo

Respuestas:

18

Bash + curl + iproute2 , 54 50 49 48 33 bytes

ip r g 1|awk '$0=$7'
curl eth0.me

¡Gracias @DomHastings por jugar golf en 1 byte!

¡Gracias @Sisyphus por crear una URL más corta!

¡Gracias @zeppelin por jugar 9 bytes!

ბიმო
fuente
@DomHastings Sus últimos intentos de golf devuelven algo de basura junto con la dirección IP, al menos en Ubuntu 16.04.3 LTS
Ferrybig
@Ferrybig Sí, la 1/0parte emite un error a STDERR, pero eso se ignora por defecto, si obtienes una salida diferente ip route, esa podría ser la versión que estaba ejecutando en mi máquina. ¡Vergüenza!
Dom Hastings
La primera línea se imprime 1000para mí ... ip route get 1salida: ptpb.pw/pixx
Majora320
Cuando ejecuto ese código obtengo esta salida:RTNETLINK answers: Network is unreachable
kasperd
1
También puede optimizar un poco su expresión AWK:awk 'NR<2&&$0=$7'
zeppelin
9

Bash 37 31 27 bytes

Esto está inspirado en la respuesta de Bruce Forte . Esa respuesta solo funciona con IPv4, lo que significa que no funciona para mí. Lo he reescrito en una versión que (solo) funciona con IPv6:

ip r g b::|awk '$0=$9" "$9'

Esto se prueba en Ubuntu 14.04.5 conectado a través de PPPoE y dado que IPv6 está diseñado para usarse sin NAT, generará la misma dirección IP dos veces.

-6 bytes gracias a zeppelin , -2 bytes gracias a Ferrybig , -2 bytes gracias a Markasoftware .

kasperd
fuente
En mi Ubuntu 16.04.3 LTS, tuve que cambiar '{print$11,$11}'para '{print$9,$9}'hacer que el comando funcionara, tu comando regresó 1024 2 veces, tu comando funciona en mi máquina Ubuntu 16.04.2
Ferrybig
@Ferrybig Probablemente depende de la configuración de la red en ese momento. Probé esto en una red donde las direcciones se configuran automáticamente desde los anuncios de enrutador.
kasperd
Para las máquinas donde la dirección IP se configura manualmente (estática), ip routeno genera la proto raparte, puede usar esto como una función para obtener su respuesta aún más
Ferrybig
@Ferrybig En este momento estoy pensando si puedo encontrar una manera de hacerlo funcionar en ambos casos sin que el tamaño explote. Por cierto. en mi máquina 16.04.3 que recibió su configuración usando anuncios de enrutador dice que proto staticno proto ra, aunque esa diferencia no importa a este código.
kasperd
Para jugar un poco al golf, use en awk '$0=$9" "$9'lugar de {print$11,$11}. Muchos sistemas (incluido mi Arch One) usan la novena palabra, por lo que es más corta que 11, y también usar esta sintaxis es más pequeña que imprimir $ 9, $ 9
markasoftware
7

Mathematica, 17 bytes

Mathematica tiene un incorporado para todo

$MachineAddresses

Como se describe en la documentación , este comando incorporado enumera todas las direcciones IP (tanto locales como externas) asociadas con su dispositivo.

JungHwan Min
fuente
La documentación no dice nada sobre direcciones externas.
kasperd
Si este comando también enumera la dirección ipv6, entonces puede decir que la dirección ipv6 es el resultado esperado
Ferrybig
55
Esto produce una lista de varias direcciones IP para mí, pero ninguna de ellas parece ser mi dirección externa; Sin embargo, es posible que no esté interpretando las cosas correctamente. Puedo obtener mi dirección IP externa de algo así, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]pero no sé cómo llegar a eso más directamente.
Mark S.
@Marcas. Eso es raro; Obtengo mi dirección IP externa cuando ejecuto el comando (la última entrada parece ser). Sin embargo, este comando no funcionará en Wolfram Sandbox. Quizás esto es un error; ¿Qué sistema operativo y versión de Mathematica estás usando?
JungHwan Min
@JungHwanMin 11.1.1.0 Student Edition me da 6 cosas que supongo son IPv6, luego 192.168.0.104 y tres direcciones que comienzan con 169.254. Pero mi dirección externa comienza con 69.
Mark S.
6

AutoIt, 56 53 bytes

#include<Inet.au3>
ConsoleWrite(@IPAddress1&_GetIP())

@IPAddress1 es una macro que regresa

Dirección IP del primer adaptador de red

_GetIP() devoluciones

La dirección IP pública.


-3 bytes gracias a @ mınxomaτ

Daniel
fuente
3
Neat, un compañero de AutoIt (no IT). Puede eliminar los espacios en este código.
mınxomaτ
@ mınxomaτ Gracias por la corrección :)
Daniel
6

C #, 196 194 188 163 bytes

namespace System.Net.Sockets{using Linq;_=>Dns.GetHostEntry("").AddressList.First(i=>(int)i.AddressFamily==2)+" "+new WebClient().DownloadString("http://eth0.me")}

Guardado 2 bytes gracias a @Xynos.
Guardado 25 bytes gracias a @Nick.

Versión completa / formateada:

namespace System.Net.Sockets
{
    using Linq;

    class P
    {
        static void Main()
        {
            Func<object, string> f = _ =>
                Dns.GetHostEntry(Dns.GetHostName())
                    .AddressList
                    .First(i => (int)i.AddressFamily == 2) + " " + new WebClient().DownloadString("http://eth0.me");

            Console.WriteLine(f(null));

            Console.ReadLine();
        }
    }
}
TheLethalCoder
fuente
¿No puede guardar dos bytes eliminando el espacio en blanco alrededor del ==?
MysticVagabond
@Xynos Por supuesto, no me di cuenta de que no lo había eliminado.
TheLethalCoder
La versión de golf no se compila y no es una función independiente. No parece justo mezclar una función independiente con el acceso directo del uso del espacio de nombres Sockets, por lo que te sugiero que elijas una opción y la sigas. Dicho esto, se puede ahorrar algunos bytes por colada i.AddressFamilya intsu lugar de echar 2a AddressFamily, y se puede reemplazar Dns.GetHostName()con la cadena vacía.
Nick
@ Nick Intentaré eso cuando tenga la oportunidad y el namespacetruco sea bastante común para C #. Si crees que no debería permitirse, puedes publicar en meta al respecto, pero en este momento es un juego justo y un buen truco para acortar using.
TheLethalCoder
6

PowerShell v4 +, 40 36 bytes

NetIPAddress|% IPA*
iwr eth0.me|% C*

(Solo funciona en Server 2012 R2 o superior, o Windows 8.1 o superior. No funciona en TIO).

Hace exactamente lo que dice en la lata. Obtiene las direcciones IP de la red local y selecciona solo la IPAparte de la dirección (p. Ej., Filtra la máscara de subred, la puerta de enlace, etc.).

El segundo es un Invoke-WebRequesta http://eth0.meque simplemente obtiene su Ccontenido; es decir, solo la dirección IP pública.


Versión sin golf:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content
AdmBorkBork
fuente
Un usuario anónimo sugiere eliminarGet-
Stephen
@StepHen De hecho. Funciona genial.
AdmBorkBork
4

Unix Shell + cliente aturdidor , 40 bytes

stunclient stun.vo.lu|cut -d: -f2|sed 1d

Hace uso de un protocolo STUN :

Session Traversal Utilities para NAT (STUN) es un protocolo que sirve como herramienta para otros protocolos al tratar con el recorrido de Network Address Translator (NAT). Puede ser utilizado por un punto final para determinar la dirección IP y el puerto que le asigna un NAT

El nombre del servidor STUN es de la lista de servidores STUN públicos .

El formato de salida es:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Tenga en cuenta que ambas líneas estarán sangradas con un solo espacio, pero creo que esto no rompe las reglas de salida tal como están escritas.

Salida de muestra:

  192.168.1.100    
  209.85.233.147
zepelín
fuente
4

curl (bash one-liner): 27 bytes

curl -w%{local_ip} eth0.me

El resultado está impreso stdouty se ve así:

1.2.3.4
192.168.0.10
# no trailing newline, use "curl -w%{local_ip}\\n eth0.me" for it

curl debe ser al menos de la versión 7.29.0 (del 6 de febrero de 2013).

La respuesta se basa en /codegolf//a/139538/66016 .

Kirill Bulygin
fuente
4

Ir, solo MacOS, 10 bytes

En macOS, este conmutador podría usarse, puede imprimir la IP privada activa actual y la IP pública:

$ killswitch 
Interface  MAC address         IP
en1        bc:34:36:d2:81:ba   192.168.2.10

Public IP address: 179.43.176.99

No VPN interface found, verify VPN is connected

Esta no es una herramienta integrada, pero trata de simplificar el proceso de encontrar las IP adecuadas.

La salida podría obtenerse usando comandos como:

$ route get 0.0.0.0

$ ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

$ networksetup -listnetworkserviceorder

$ scutil --dns

IP pública:

$ dig o-o.myaddr.l.google.com @ns.google.com txt +short
nbari
fuente
2
¡Hola! Bienvenido a PPCG! Esta pregunta está etiquetada con código de golf . ¿Podría proporcionar un código de golf con un idioma y un recuento de bytes?
Stephen
3

PowerShell v3 + (respuesta alternativa para Windows 7+)

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me
YChi Lu
fuente
2
Bienvenido a PPCG!
Stephen
1
Puede eliminar los espacios circundantes -matchpara guardar un par de bytes.
AdmBorkBork
3

Bash + Awk + Curl, 43 bytes

utilizando solo herramientas integradas para Mac y Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me
Alex Nikiforov
fuente
1
* bash quieres decir.
Suici Doga
bash + awk + curl
Alex Nikiforov
Edité la pregunta para decir bash ya que funciona en mi computadora portátil Linux no solo en macos
Suici Doga
gracias, mejoré ya que bash es un shell per se (debería funcionar en tcsh, sh y cualquier otro shell), también debe tener ifconfig, awk y curl
Alex Nikiforov
1
Esto no es "MacOS / Linux", es Bash. Solo márquelo como tal.
Letra de
2

Python 3, 124 133 bytes

from urllib2 import urlopen
import socket
a=urlopen('http://eth0.me').read()
b=socket.gethostbyname(socket.gethostname())
print a,b
Teo
fuente
¿No lo necesitas también print a,b? Curiosamente, esto genera dos IP en mi sistema (Win7), pero ninguna de ellas es mi dirección IP local real. ben realidad es la IP de un adaptador virtual y no mi conexión de área local .
Octopus
Sin embargo, podría decirse que sigue siendo una dirección IP local . Dejé un comentario sobre la pregunta para pedir una aclaración al respecto.
Octopus
@Octopus usted correcto acerca de la impresión, actualizado
Teo
En una edición sugerida, @David sugirió esto: 113 bytes ( revisión aquí )
Stephen
2

Node.js (JavaScript) 224 223 194 175 173 130 bytes

r=require,l=console.log,r('dns').lookup(r('os').hostname(),(a,b)=>l(b));r('http').get('http://eth0.me',a=>a.on('data',c=>l(c+"")))

Versión sin golf:

require('dns').lookup(require('os').hostname(), (err, loc, fam) => console.log(loc));
require('http').get('http://eth0.me', res => {
    res.on('data', chunk => console.log(chunk + ""));
});

  • Se guardó 1 byte (debido a un punto y coma innecesario).
  • Se guardaron 29 bytes gracias a @AndrewLi (se utilizaron funciones de flecha para código más corto).
  • Guardado 19 bytes gracias a @MiniGod (usado en .get()lugar de .request()- .end();eliminado).
  • Guardado 2 bytes gracias a @ Zacharý (paréntesis no necesarios alrededor de un parámetro solitario de una función de flecha).
  • Guardado 43 bytes gracias a @Birjolaxew (almacenado requireyconsole.log en variables de una sola letra, pasó la URL directamente a require('http').get, la salida registrada directamente desde el dataevento).

fuente
¿No puedes usar las funciones de flecha para un código más corto?
Andrew Li
@ AndrewLi Gran sugerencia, gracias. :)
Puedes usar en .get()lugar de .request(). Entonces tampoco necesitas el .end();.
MiniGod
1
No necesita parens alrededor de un parámetro solitario de una función de flecha. ( (a)=>=> a=>), IIRC.
Zacharý
1
@AndrewLi Hmm, el problema es que cuando el código se ejecuta en el REPL, imprime información adicional (por ejemplo, la información de la solicitud), que está prohibido en la pregunta. Podría agregar código adicional para ocultar esta salida, pero podría contrarrestar la reducción de bytes que resultan de omitir las requirellamadas, así que lo dejaré por ahora. Gracias por la sugerencia de todos modos.
1

Archivo por lotes de Windows , 116 bytes

@for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "v4"')do @echo%%b
@powershell -Command "(iwr eth0.me).content"

La primera línea recorre los resultados de la ejecución ipconfigy obtiene su dirección IPv4 local.

Para la parte de IP pública, tuve que robar un poco de la maravillosa respuesta de Powershell porque, hasta donde yo sé, no hay forma de obtener la IP pública de la máquina utilizando únicamente secuencias de comandos por lotes.

Comenzamos con un @signo, para suprimir el eco de la solicitud ( C:\...\path>), luego ejecutamos el comando Powershell Invoke-WebRequest(con su alias iwr) y extraemos la contentparte de eso.

Experimenté con no usar (...).contenty, en cambio, solo ejecutar el comando y extraer la información real de la salida completa, usando el lote. Pero eso resultó ser mucho más largo que esta solución, así que lo guardé.

Probado en Windows 10.0.15063.

Matheus Avellar
fuente
1

R, 142 , 140 , 137 bytes

library(magrittr);system("ipconfig",int=T)%>%regmatches(.,regexpr("v4.+",.))%>%{a=nchar(.);substr(.,a-14,a)};readLines("http://eth0.me")

Probado en win10 y R (3.4.1).
Gracias por @ Bruce-Forte por la URL corta.

Versión sin golf:

library(magrittr)
system("ipconfig",int=T) %>% 
     regmatches(.,regexpr("v4.+",.)) %>% 
      {a <- nchar(.)
       substr(., a - 14, a)}
readLines("http://eth0.me")
AndriusZ
fuente
Hasta 120 bytes ¡ Pruébelo en línea!
BLT
@BLT buena solución. Puede guardar 3 bytes, reemplazando a <- nchar(x)cona=nchar(x)
AndriusZ
@AndruisZ, gracias, pero es realmente tu solución, simplemente lo desmagité.
BLT
1

Python 2.7.13 128 bytes

print __import__("urllib").urlopen("http://eth0.me").read(),__import__("socket").gethostbyname(__import__("socket").getfqdn())
Alexander Baine
fuente
1

Bash + Curl, 24 bytes

hostname -i;curl eth0.me
Probablemente
fuente
Esto no funciona ... Desde la página de manual: " Esta opción enumera todas las direcciones configuradas en todas las interfaces de red. [...] No haga suposiciones sobre el orden de la salida".
ბიმო
¿No tiene -I (mayúscula) un uso diferente que -i (minúscula)? La parte que citó fue de la sección -I .
Probablemente el
Es cierto, lo siento por eso. Pero aún peor dice " Evita usar esta opción ", de cualquier manera esto no funciona (al menos en mis máquinas) ..
ბიმო
Correcto, es cierto que no leí la documentación completa antes de publicar. Por extraño que parezca, parece funcionar bien en algunas de mis máquinas. Pero esta inconsistencia haría que esta solución no sea confiable en el mejor de los casos.
Probablemente el
1

MS-SQL, 59 bytes

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Devuelve la dirección IP orientada al cliente de la instancia de SQL que ejecuta la consulta.

BradC
fuente
0

VBA, 58 bytes

Whoops, no maneja la dirección local - corrección en progreso

Nota: utiliza referencias a

Microsoft Internet Controls

Función de ventana inmediata anónima VBE que no toma entrada y emite la dirección IP del usuario a través de una ventana de Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Taylor Scott
fuente