Qual é o meu endereço IP?


24

Estou surpreso que isso ainda não tenha sido um desafio.

Envie o endereço IP da máquina em que você está executando. Você é obrigado a enviar os endereços IP locais e externos.

Endereço IP local, ou seja, no formato padrão 192.168.xx

O endereço IP público pode ser verificado usando o google https://www.google.co.uk/search?source=hp&q=whats+my+ip

A saída pode estar em qualquer formato. IPv4 ou IPv6 ou qualquer combinação de cada um é permitido, no entanto, eles devem ser a única saída. O código pode ser um programa completo ou uma função.

regras aplicam para que os códigos mais curtos sejam ganhos.

As brechas padrão são proibidas.

EDIT: De acordo com o comentário de Peter Taylor, no caso de vários endereços de um ou outro tipo estarem presentes, você pode escolher a saída do primeiro ou o maior número possível de acessos. Desde que pelo menos um local e um público estejam presentes.


3
Eu acho que a 0/1coisa adiciona fluff desnecessário ao desafio.
Xcoder 18/08/19

5
Isso é subespecificado. Em particular, não trata claramente de casos em que existem vários endereços IP locais e / ou múltiplos endereços IP públicos. Além disso, não há maneira confiável de saber se eu tenho vários endereços IP públicos e, em caso afirmativo, quais são eles.
Peter Taylor

5
E se o host não tiver nenhum endereço RFC 1918? Parece que não há uma resposta confiável para isso, exceto em máquinas que possuem pelo menos uma rede privada.
Toby Speight

4
... e até uma interface de rede pode ter vários endereços IP.
Kaz

14
Na verdade, não vejo como você poderia resolver metade disso sem buscar em uma fonte externa , que é uma das brechas padrão que você proibiu expressamente.
Octopus

Respostas:


18

Bash + ondulação + iproute2 , 54 50 49 48 33 bytes

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

Obrigado @DomHastings por jogar fora 1 byte!

Obrigado @Sisyphus por criar um URL mais curto!

Obrigado @ zeppelin por jogar fora 9 bytes!


@DomHastings Suas últimas tentativas de golfe retornam um pouco de lixo junto com o endereço IP, pelo menos no Ubuntu 16.04.3 LTS
Ferrybig

@Ferrybig Sim, a 1/0peça gera um erro para STDERR, mas isso é ignorado por padrão, se você obtiver uma saída diferente ip route, essa poderia ser apenas a versão que eu estava executando na minha máquina. Vergonha!
Dom Hastings

As primeiras impressões de linha 1000para mim ... ip route get 1de saída: ptpb.pw/pixx
Majora320

Quando eu executar esse código eu recebo esta saída:RTNETLINK answers: Network is unreachable
kasperd

11
Você também pode otimizar a sua expressão AWK um pouco:awk 'NR<2&&$0=$7'
zeppelin

9

Bash 37 31 27 bytes

Isso é inspirado na resposta de Bruce Forte . Essa resposta funciona apenas com IPv4, o que significa que não funciona para mim. Eu o reescrevi em uma versão que (apenas) funciona com IPv6:

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

Isso é testado no Ubuntu 14.04.5 conectado via PPPoE e, como o IPv6 foi projetado para ser usado sem NAT, ele emitirá o mesmo endereço IP duas vezes.

-6 bytes graças ao zeppelin , -2 bytes graças ao Ferrybig , -2 bytes graças ao Markasoftware .


No meu Ubuntu 16.04.3 LTS, eu tive que mudar '{print$11,$11}'para '{print$9,$9}'fazer o trabalho de comando, o comando retornou 1024 2 vezes, o comando funciona na minha máquina Ubuntu 16.04.2
Ferrybig

@Ferrybig Provavelmente depende da configuração da rede então. Eu testei isso em uma rede onde os endereços são configurados automaticamente a partir de anúncios de roteador.
precisa saber é o seguinte

Para máquinas onde o endereço IP é configurado manualmente (estáticos), ip routenão saída da proto rapeça, você pode usar isso como um recurso para golf a sua resposta ainda
Ferrybig

@Ferrybig No momento, estou pensando se posso encontrar uma maneira de fazê-lo funcionar nos dois casos sem o tamanho explodir. Btw. na minha máquina 16.04.3 que recebeu sua configuração usando anúncios de roteador, proto staticnão diz isso proto ra, embora essa diferença não importe para esse código.
precisa saber é

Para jogar um pouco, use em awk '$0=$9" "$9'vez de {print$11,$11}. Muitos sistemas (incluindo o meu Arch) usar a palavra dia 9, por isso é mais curto do que 11, e também usando esta sintaxe é menor do que print $ 9, US $ 9
markasoftware

7

Mathematica, 17 bytes

O Mathematica tem um builtin para tudo

$MachineAddresses

Conforme descrito na documentação , este comando interno lista todos os endereços IP (locais e externos) associados ao seu dispositivo.


A documentação não diz nada sobre endereços externos.
precisa saber é o seguinte

Se este comando também listar o endereço IPv6, você poderá dizer que o endereço IPv6 é o resultado esperado.
Ferrybig

5
Isso produz uma lista de vários endereços IP para mim, mas nenhum deles parece ser meu endereço externo; Talvez eu não esteja interpretando as coisas corretamente. Posso obter meu endereço IP externo de algo assim, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]mas não sei como chegar a isso mais diretamente.
19417 Mark S.

@MarkS. Isso é estranho; Recebo meu endereço IP externo quando executo o comando (a última entrada parece ser). Este comando não funcionará no Wolfram Sandbox. Talvez isso seja um bug; qual versão do SO e do Mathematica você está usando?
JungHwan Min 20/08/19

O @JungHwanMin 11.1.1.0 Student Edition fornece 6 coisas que eu assumo serem IPv6, 192.168.0.104 e três endereços começando com 169.254. Mas meu endereço externo começa com 69.
Mark S.

6

AutoIt, 56 53 bytes

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

@IPAddress1 é uma macro que retorna

Endereço IP do primeiro adaptador de rede

_GetIP() retorna

o endereço IP público.


-3 bytes graças a @ mınxomaτ


3
Neat, um colega AutoIt (não TI). Você pode excluir os espaços neste código.
mınxomaτ

@ mınxomaτ Obrigado pela correção :) #
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")}

Economizou 2 bytes graças a @Xynos.
Economizou 25 bytes graças a @Nick.

Versão completa / formatada:

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();
        }
    }
}

você não pode salvar dois bytes removendo o espaço em branco ao redor do ==?
MysticVagabond

@Xynos Claro, não sabia que não o havia removido.
TheLethalCoder

A versão golfed não compila e não é uma função autônoma. Não parece justo misturar uma função autônoma com o atalho do uso do namespace Sockets, por isso sugiro escolher uma opção e segui-la. Dito isto, você pode salvar alguns bytes convertendo i.AddressFamilypara, em intvez de converter 2para AddressFamily, e pode substituir Dns.GetHostName()pela string vazia.
Nick

@ Nick Vou tentar isso quando tiver uma chance e o namespacetruque for bastante comum para C #. Se você acha que isso não deveria ser permitido, você pode postar uma meta sobre isso, mas no momento é um jogo justo e um truque legal para encurtar usings.
TheLethalCoder

6

PowerShell v4 +, 40 36 bytes

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

(Funciona apenas no Server 2012 R2 ou superior ou no Windows 8.1 ou superior. Não funciona no TIO.)

Faz exatamente o que diz na lata. Obtém os endereços IP da rede local e seleciona apenas a IPAparte do endereço (por exemplo, filtra a máscara de sub-rede, o gateway etc.).

O segundo é um Invoke-WebRequestao http://eth0.mequal simplesmente obtém o Cseu ponto inicial; ou seja, apenas o endereço IP público.


Versão não destruída:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content

Um usuário anônimo sugere a remoçãoGet-
Stephen

@StepHen De fato. Funciona bem.
AdmBorkBork

4

Shell Unix + stunclient , 40 bytes

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

Faz uso de um protocolo STUN :

Os utilitários transversais de sessão para NAT (STUN) são um protocolo que serve como uma ferramenta para outros protocolos ao lidar com a travessia do Network Address Translator (NAT). Ele pode ser usado por um nó de extremidade para determinar o endereço IP e a porta alocados a ele por um NAT

O nome do servidor STUN é da lista de servidores Public STUN .

O formato de saída é:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Observe que as duas linhas serão recuadas com um único espaço, mas acredito que isso não viola as regras de saída conforme gravadas.

Saída de amostra:

  192.168.1.100    
  209.85.233.147

4

ondulação (uma linha do bash): 27 bytes

curl -w%{local_ip} eth0.me

O resultado é impresso stdoute fica assim:

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

curl deve ter pelo menos a versão 7.29.0 (de 6 de fevereiro de 2013).

A resposta é baseada em /codegolf//a/139538/66016 .


4

Ir, apenas MacOS, 10 bytes

No macOS, esse killswitch pode ser usado, pode imprimir o IP ativo privado atual e o IP público:

$ 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 não é uma ferramenta interna, mas tenta simplificar o processo de localização dos IPs apropriados.

A saída pode ser obtida 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úblico:

$ dig o-o.myaddr.l.google.com @ns.google.com txt +short

2
Oi! Bem-vindo ao PPCG! Esta pergunta está etiquetada como code-golf . Você poderia fornecer código de golfe com um idioma e uma contagem de bytes?
Stephen

3

PowerShell v3 + (resposta alternativa para windows 7+)

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me

2
Bem-vindo ao PPCG!
Stephen

11
Você pode remover os espaços -matchao redor para salvar alguns bytes.
AdmBorkBork

3

Bash + Awk + Ondulação, 43 bytes

usando apenas ferramentas integradas para Mac e Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me

11
* bash você quer dizer.
Suici Doga

festa + awk + onda
Alex Nikiforov

Eu editei a questão de dizer festa, uma vez que funciona no meu linux laptop não apenas MacOS
Suici Doga

thx, melhorei desde bash é um shell per se (deve funcionar em tcsh, sh e qualquer outro shell), você precisa ter ifconfig, awk e onda também
Alex Nikiforov

11
Este não é "MacOS / Linux", é Bash. Basta marcar como tal.
precisa saber é o seguinte

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

Você também não precisa print a,b? Curiosamente, isso gera dois IPs no meu sistema (Win7), mas nenhum deles é o meu endereço IP local real. bé realmente o IP de um adaptador virtual e não a minha conexão local .
Octopus

Indiscutivelmente, ainda é um endereço IP local . Deixei um comentário sobre a questão para pedir esclarecimentos.
Octopus

@Octopus você está certo sobre a impressão, atualizados
Teo

Em uma edição sugerida, o @David sugeriu o seguinte: 113 bytes ( Revise aqui )
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+"")))

Versão não destruída:

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 + ""));
});

  • 1 byte salvo (devido a ponto e vírgula desnecessário).
  • Economizou 29 bytes graças a @AndrewLi (funções de seta usadas para código mais curto).
  • Economizou 19 bytes graças ao @MiniGod (usado em .get()vez de .request()- .end();removido).
  • Salvou 2 bytes graças a @ Zacharý (parênteses não são necessários em torno de um único parâmetro de uma função de seta).
  • 43 bytes salvos graças ao @Birjolaxew (armazenado requiree console.logem variáveis ​​de uma letra, passou o URL diretamente para require('http').get, saída registrada diretamente do dataevento).

Você não pode usar as funções de seta para código mais curto?
Andrew Li

@AndrewLi Ótima sugestão, obrigado. :)

Você pode usar em .get()vez de .request(). Então você também não precisa do .end();.
MiniGod 18/08/19

11
Você não precisa parens em torno de um único parâmetro de uma função de seta. ( (a)=>=> a=>), IIRC.
Zacharý 18/08/19

11
@AndrewLi Hmm, o problema é que, quando o código é executado no REPL, ele imprime informações extras (por exemplo, as informações de solicitação), o que é proibido na pergunta. Eu poderia adicionar código extra para ocultar essa saída, mas isso pode neutralizar a redução de bytes que resulta da exclusão das requirechamadas, então deixarei por enquanto. Obrigado pela sugestão de qualquer maneira.

1

Arquivo em lote do Windows , 116 bytes

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

A primeira linha repete os resultados da execução ipconfige obtém o seu endereço IPv4 local.

Na parte de IP público, tive que roubar um pouco da maravilhosa resposta do Powershell porque, até onde eu sei, não há como obter o IP público da máquina usando apenas scripts em lote.

Começamos com um @sinal, para suprimir o eco do prompt ( C:\...\path>), depois executamos o comando Powershell Invoke-WebRequest(com seu alias iwr) e extraímos a contentparte dele.

Experimentei não usar (...).contente, em vez disso, apenas executar o comando e extrair as informações reais da saída completa, usando o lote. Mas isso provou ser muito mais longo que esta solução, então eu a mantive.

Testado no Windows 10.0.15063.


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

Testado em win10 e R (3.4.1).
Obrigado por @ Bruce-Forte pelo URL curto.

Versão não destruída:

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

Até 120 bytes Experimente online!
BLT

Solução agradável @BLT. Você pode salvar 3 bytes, substituindo a <- nchar(x)pora=nchar(x)
AndriusZ

@AndruisZ obrigado, mas é realmente a sua solução - acabei de retirá-la.
BLT

1

Python 2.7.13 128 bytes

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

1

Bash + Curl, 24 bytes

hostname -i;curl eth0.me

Isso não funciona. Na página do manual: " Esta opção enumera todos os endereços configurados em todas as interfaces de rede. [...] Não faça nenhuma suposição sobre a ordem da saída."
ბიმო

Não -I (capital) têm um uso diferente do que -i (em minúsculas). A parte que você citou foi da seção -I .
Provavelmente

Verdade, desculpe por isso. Mas, pior ainda, diz " Evite usar esta opção ", de qualquer maneira isso não funciona (pelo menos nas minhas máquinas) .. #
#

Certo, é verdade que não li a documentação completa antes de postar. Curiosamente, parece funcionar bem em algumas das minhas máquinas. Mas essa inconsistência tornaria essa solução não confiável, na melhor das hipóteses.
Provavelmente

1

MS-SQL, 59 bytes

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Retorna o endereço IP do cliente da instância SQL que está executando a consulta.


0

VBA, 58 bytes

Ops, não lida com o endereço local - correção em andamento

Nota: Usa referência a

Microsoft Internet Controls

Função de janela imediata VBE anônima que não recebe entrada e gera o endereço IP do usuário por meio de uma janela do Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.