Qual è il mio indirizzo IP?


24

Sono sorpreso che questo non abbia ancora sollevato una sfida.

Invia l'indirizzo IP della macchina su cui stai eseguendo. È necessario fornire sia gli indirizzi IP locali che quelli esterni.

Indirizzo IP locale, ovvero lungo il formato predefinito 192.168.xx

L'indirizzo IP pubblico può essere verificato utilizzando google https://www.google.co.uk/search?source=hp&q=whats+my+ip

L'output può essere in qualsiasi formato. È consentito IPv4 o IPv6 o qualsiasi mix di ciascuno, tuttavia devono essere l'unico output. Il codice può essere un programma completo o una funzione.

applicano le regole del così vince il codice più breve.

Sono vietate le scappatoie standard .

EDIT: Secondo il commento di @Peter Taylor, nel caso in cui siano presenti multipli di entrambi i tipi di indirizzo, è possibile scegliere di emettere il primo o quanti più è possibile accedere. Finché sono presenti almeno un locale e un pubblico.


3
Penso che la 0/1cosa aggiunga una lanugine inutile alla sfida.
Mr. Xcoder,

5
Questo è sotto specificato. In particolare, non risolve chiaramente i casi in cui vi sono più indirizzi IP locali e / o più indirizzi IP pubblici. Inoltre, non esiste un modo affidabile per dire se ho più indirizzi IP pubblici e, in tal caso, quali sono.
Peter Taylor,

5
Cosa succede se l'host non ha indirizzi RFC 1918? Sembra che non ci sia una risposta affidabile a questo, tranne che su macchine che hanno almeno una rete privata.
Toby Speight,

4
... e anche un'interfaccia di rete può avere più indirizzi IP.
Kaz,

14
In realtà, non vedo come potresti risolvere la metà di questo senza recuperare da una fonte esterna , che è una delle scappatoie standard che hai espressamente proibito.
Polpo,

Risposte:


18

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

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

Grazie @DomHastings per giocare a golf a 1 byte!

Grazie @Sisyphus per aver creato un URL più breve!

Grazie @zeppelin per giocare a golf con 9 byte!


@DomHastings I tuoi ultimi tentativi di golf restituiscono un po 'di immondizia insieme all'indirizzo IP, almeno su Ubuntu 16.04.3 LTS
Ferrybig,

@Ferrybig Sì, la 1/0parte restituisce un errore a STDERR, ma questo viene ignorato per impostazione predefinita, se si ottiene un output diverso per ip routequello, potrebbe essere solo la versione che stavo eseguendo sulla mia macchina. Vergogna!
Dom Hastings,

La prima riga viene stampata1000 per me ... ip route get 1output: ptpb.pw/pixx
Majora320

Quando RTNETLINK answers: Network is unreachable
eseguo

1
Puoi anche ottimizzare un po 'la tua espressione AWK:awk 'NR<2&&$0=$7'
zeppelin,

9

Bash 37 31 27 byte

Questo si ispira alla risposta di Bruce Forte . Questa risposta funziona solo con IPv4, il che significa che non funziona per me. L'ho riscritto in una versione che (solo) funziona con IPv6:

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

Questo è testato su Ubuntu 14.04.5 collegato tramite PPPoE e poiché IPv6 è progettato per essere utilizzato senza NAT, verrà emesso lo stesso indirizzo IP due volte.

-6 byte grazie allo zeppelin , -2 byte grazie a Ferrybig , -2 byte grazie a Markasoftware .


Sul mio Ubuntu 16.04.3 LTS, ho dovuto cambiare '{print$11,$11}'per '{print$9,$9}'far funzionare il comando, il tuo comando ha restituito 1024 2 volte, il tuo comando funziona sulla mia macchina Ubuntu 16.04.2
Ferrybig

@Ferrybig Probabilmente dipende quindi dalla configurazione di rete. Ho provato questo su una rete in cui gli indirizzi sono configurati automaticamente dagli annunci del router.
Kasperd,

Per le macchine in cui l'indirizzo IP è configurato manualmente (statico), ip routenon proto ra
genera

@Ferrybig Al momento sto meditando se riesco a trovare un modo per farlo funzionare in entrambi i casi senza far esplodere le dimensioni. Btw. sulla mia 16.04.3 macchina che ha ricevuto la sua configurazione utilizzando annunci router si dice proto staticnon proto ra, anche se tale differenza non importa a questo codice.
Kasperd,

Per giocare un po 'a golf, usa awk '$0=$9" "$9'invece di {print$11,$11}. Molti sistemi (incluso il mio Arch one) usano la nona parola, quindi è più breve di 11, e anche usare questa sintassi è più piccolo della stampa $ 9, $ 9
markasoftware

7

Mathematica, 17 byte

Mathematica ha una funzione per tutto

$MachineAddresses

Come descritto nella documentazione , questo comando incorporato elenca tutti gli indirizzi IP (sia locali che esterni) associati al dispositivo.


La documentazione non dice nulla sugli indirizzi esterni.
Kasperd,

Se questo comando elenca anche l'indirizzo ipv6, allora puoi dire che l'indirizzo ipv6 è il risultato atteso
Ferrybig

5
Questo produce un elenco di diversi indirizzi IP per me, ma nessuno di questi sembra essere il mio indirizzo esterno; Tuttavia, potrei non interpretare le cose correttamente. Posso ottenere il mio indirizzo IP esterno da qualcosa del genere WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]ma non so come raggiungerlo più direttamente.
Mark S.

@MarkS. È bizzarro; Ottengo il mio indirizzo IP esterno quando eseguo il comando (l'ultima voce sembra essere). Questo comando, tuttavia, non funziona su Wolfram Sandbox. Forse questo è un bug; quale versione del sistema operativo e Mathematica stai usando?
JungHwan Min

@JungHwanMin 11.1.1.0 Student Edition mi dà 6 cose che presumo siano IPv6, quindi 192.168.0.104 e tre indirizzi che iniziano con 169.254. Ma il mio indirizzo esterno inizia con 69.
Mark S.

6

AutoIt, 56 53 byte

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

@IPAddress1 è una macro che ritorna

Indirizzo IP della prima scheda di rete

_GetIP() ritorna

l'indirizzo IP pubblico.


-3 byte grazie a @ mınxomaτ


3
Neat, un collega AutoIt (non IT) -er. Puoi eliminare gli spazi in questo codice.
mınxomaτ,

@ mınxomaτ Grazie per la correzione :)
Daniel,

6

C #, 196 194 188 163 byte

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

Salvato 2 byte grazie a @Xynos.
25 byte salvati grazie a @Nick.

Versione completa / formattata:

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

non puoi salvare due byte rimuovendo lo spazio bianco attorno a ==?
MysticVagabond,

@Xynos Naturalmente, non avevo capito che non l'avevo rimosso.
TheLethalCoder il

La versione golfata non viene compilata e non è una funzione autonoma. Non sembra giusto combinare una funzione autonoma con la scorciatoia dell'uso dello spazio dei nomi di Sockets, quindi suggerirei di scegliere un'opzione e andare con essa. Detto questo, è possibile salvare alcuni byte gettando i.AddressFamilyal intposto di colata 2a AddressFamily, e si può sostituire Dns.GetHostName()con la stringa vuota.
Nick,

@Nick Lo proverò quando avrò la possibilità e il namespacetrucco è abbastanza comune per C #. Se pensi che non dovrebbe essere permesso, puoi postare su meta a riguardo, ma al momento è un gioco leale e un trucco per accorciare using.
TheLethalCoder

6

PowerShell v4 +, 40 36 byte

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

(Funziona solo su Server 2012 R2 o versione successiva o Windows 8.1 o versione successiva. Non funziona su TIO.)

Fa esattamente quello che dice sulla scatola. Ottiene gli indirizzi IP della rete locale e seleziona solo la IPAparte relativa (ad es. Filtra la maschera di sottorete, il gateway, ecc.).

La seconda è una Invoke-WebRequesta http://eth0.mecui si ottiene semplicemente la Csua parte; cioè, solo l'indirizzo IP pubblico.


Versione non golfata:

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

Un utente anonimo suggerisce di rimuovereGet-
Stephen,

@StepHen Infatti. Funziona alla grande.
AdmBorkBork,

4

Unix Shell + stunclient , 40 byte

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

Utilizza un protocollo STUN :

Session Traversal Utilities per NAT (STUN) è un protocollo che funge da strumento per altri protocolli nella gestione di NAT (Network Address Translator). Può essere utilizzato da un endpoint per determinare l'indirizzo IP e la porta assegnata ad esso da un NAT

Il nome del server STUN è dall'elenco del server STUN pubblico .

Il formato di output è:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Si noti che entrambe le righe saranno rientrate con un singolo spazio, ma credo che ciò non rompa le regole di output come scritto.

Uscita campione:

  192.168.1.100    
  209.85.233.147

4

arricciatura (bash one-liner): 27 byte

curl -w%{local_ip} eth0.me

Il risultato è stampato stdoute si presenta così:

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

curl dovrebbe essere almeno della versione 7.29.0 (dal 6 febbraio 2013).

La risposta si basa su /codegolf//a/139538/66016 .


4

Vai, solo MacOS, 10 byte

In macOS questo killswitch può essere usato, può stampare l'IP privato attivo e l'IP pubblico corrente:

$ 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

Questo non è uno strumento integrato ma cerca di semplificare il processo di ricerca degli IP corretti.

L'output potrebbe essere ottenuto usando comandi come:

$ route get 0.0.0.0

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

$ networksetup -listnetworkserviceorder

$ scutil --dns

IP pubblico:

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

2
Ciao! Benvenuti in PPCG! Questa domanda è taggata code-golf . Potresti fornire al codice golfato una lingua e un conteggio byte?
Stephen,

3

PowerShell v3 + (risposta alternativa per Windows 7+)

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

2
Benvenuti in PPCG!
Stephen,

1
È possibile rimuovere gli spazi circostanti -matchper salvare un paio di byte.
AdmBorkBork,

3

Bash + Awk + Curl, 43 byte

utilizzando solo strumenti integrati per Mac e Linux

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

1
* bash intendi.
Suici Doga,

bash + awk + curl
Alex Nikiforov

ho modificato la domanda per dire bash poiché funziona sul mio laptop linux non solo macos
Suici Doga

grazie, ho migliorato poiché bash è una shell di per sé (dovrebbe funzionare su tcsh, sh e qualsiasi altra shell), devi avere ifconfig, awk e curl anche
Alex Nikiforov

1
Questo non è "MacOS / Linux", è Bash. Contrassegnalo come tale.
Lirico

2

Python 3, 124 133 byte

from urllib2 import urlopen
import socket
a=urlopen('http://eth0.me').read()
b=socket.gethostbyname(socket.gethostname())
print a,b

Non è necessario print a,b? È interessante notare che questo genera due IP sul mio sistema (Win7), ma nessuno dei due è il mio attuale indirizzo IP locale. bè in realtà l'IP di un adattatore virtuale e non la mia connessione alla rete locale .
Polpo,

Probabilmente, comunque, è ancora un indirizzo IP locale . Ho lasciato un commento sulla domanda per chiedere chiarimenti al riguardo.
Polpo,

@Octopus hai ragione sulla stampa, aggiornato
Teo

In una modifica suggerita, @David ha suggerito questo: 113 byte ( recensione qui )
Stephen,

2

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

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

Versione non golfata:

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 salvato (a causa di un punto e virgola non necessario).
  • 29 byte salvati grazie a @AndrewLi (funzioni freccia usate per codice più corto).
  • Risparmiato 19 byte grazie a @MiniGod (usato.get() invece di .request()- .end();rimosso).
  • Salvato 2 byte grazie a @ Zacharý (parentesi non necessarie attorno a un parametro solitario di una funzione freccia).
  • 43 byte salvati grazie a @Birjolaxew (memorizzati requiree console.login variabili a lettera singola, passato l'URL direttamente a require('http').get, output registrato direttamente datadall'evento).

Non puoi usare le funzioni freccia per un codice più corto?
Andrew Li,

@AndrewLi Ottimo suggerimento, grazie. :)

Puoi usare .get()invece di .request(). Quindi anche tu non hai bisogno di .end();.
MiniGod,

1
Non hai bisogno di parentesi attorno a un parametro solitario di una funzione freccia. ( (a)=>=> a=>), IIRC.
Zacharý,

1
@AndrewLi Hmm, il problema è che quando il codice viene eseguito nel REPL, stampa informazioni extra (ad esempio le informazioni di richiesta), che è proibito nella domanda. Potrei aggiungere un codice extra per nascondere questo output, ma potrebbe contrastare la riduzione di byte che risulta dal tralasciare le requirechiamate, quindi lo lascerò per ora. Grazie comunque per il suggerimento.

1

File batch di Windows , 116 byte

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

La prima riga scorre i risultati dell'esecuzione ipconfige ottiene l'indirizzo IPv4 locale.

Per quanto riguarda l'IP pubblico, ho dovuto rubare un po 'dalla meravigliosa risposta di Powershell perché, per quanto ne so, non c'è modo di ottenere l'IP pubblico della macchina usando solo script batch.

Iniziamo con un @segno, per sopprimere l'eco del prompt ( C:\...\path>), quindi eseguiamo il comando Powershell Invoke-WebRequest(con il suo alias iwr) ed estraiamo la contentparte di quello.

Ho sperimentato di non utilizzare (...).contente, invece, solo di eseguire il comando e di estrarre le informazioni effettive dall'output completo, usando batch. Ma quello si è rivelato molto più lungo di questa soluzione, quindi l'ho tenuto.

Testato su Windows 10.0.15063.


1

R, 142 , 140 , 137 byte

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

Testato su win10 e R (3.4.1).
Grazie per @ Bruce-Forte per l'URL breve.

Versione non golfata:

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

Fino a 120 byte Provalo online!
BLT,

@BLT bella soluzione. È possibile salvare 3 byte, sostituendo a <- nchar(x)cona=nchar(x)
AndriusZ

@AndruisZ grazie, ma è davvero la tua soluzione - l'ho appena cancellato.
BLT,

1

Python 2.7.13 128 byte

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

1

Bash + Curl, 24 byte

hostname -i;curl eth0.me

Questo non funziona .. Dalla pagina man: " Questa opzione elenca tutti gli indirizzi configurati su tutte le interfacce di rete. [...] Non fare ipotesi sull'ordine dell'output."
ბიმო

Non -I (capitale) hanno un utilizzo diverso da quello -i (minuscolo). Il bit che hai citato era dalla sezione -I .
Probabilmente il

Vero, mi dispiace per quello. Ma peggio ancora dice " Evita di usare questa opzione ", in ogni caso non funziona (almeno sulle mie macchine) ..
ბიმო

Bene, devo ammettere che non ho letto la documentazione completa prima di pubblicare. Stranamente sembra funzionare bene su alcune delle mie macchine. Ma questa incoerenza renderebbe questa soluzione inaffidabile nella migliore delle ipotesi.
Probabilmente il

1

MS-SQL, 59 byte

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Restituisce l'indirizzo IP rivolto al client dell'istanza SQL che esegue la query.


0

VBA, 58 byte

Spiacenti, non gestisce l'indirizzo locale - correzione in corso

Nota: utilizza il riferimento a

Microsoft Internet Controls

Funzione di finestra immediata VBE anonima che non accetta input e genera l'indirizzo IP dell'utente tramite una finestra di Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.