Wie lautet meine IP-Adresse?

24

Ich bin überrascht, dass dies noch keine Herausforderung darstellt.

Geben Sie die IP-Adresse des Computers aus, auf dem Sie ausgeführt werden. Sie müssen sowohl die lokale als auch die externe IP-Adresse ausgeben.

Lokale IP-Adresse, dh im Standardformat 192.168.xx

Die öffentliche IP-Adresse kann mithilfe von google https://www.google.co.uk/search?source=hp&q=whats+my+ip überprüft werden

Die Ausgabe kann in einem beliebigen Format erfolgen. IPv4 oder IPv6 oder eine beliebige Mischung von beiden ist zulässig, sie müssen jedoch die einzige Ausgabe sein. Code kann ein vollständiges Programm oder eine Funktion sein.

Regeln, sodass der kürzeste Code gewinnt.

Standardlücken sind verboten.

BEARBEITEN : Gemäß @Peter Taylors Kommentar können Sie für den Fall, dass mehrere von beiden Adresstypen vorhanden sind, entweder den ersten oder so viele ausgeben, wie Sie zugreifen können. Solange mindestens ein Einheimischer und ein Publikum anwesend sind.

MysticVagabond
quelle
3
Ich denke, das 0/1Ding fügt der Herausforderung unnötigen Flaum hinzu.
Mr. Xcoder
5
Dies ist unterbestimmt. Insbesondere werden Fälle nicht eindeutig behandelt, in denen mehrere lokale IP-Adressen und / oder mehrere öffentliche IP-Adressen vorhanden sind. Darüber hinaus gibt es keine zuverlässige Methode, um festzustellen, ob ich mehrere öffentliche IP-Adressen habe und wenn ja, welche.
Peter Taylor
5
Was ist, wenn der Host keine RFC 1918-Adressen hat? Es sieht so aus, als gäbe es keine verlässliche Antwort darauf, außer auf Computern mit mindestens einem privaten Netzwerk.
Toby Speight
4
... und sogar eine Netzwerkschnittstelle kann mehrere IP-Adressen haben.
Kaz
14
Ich verstehe eigentlich nicht, wie Sie die Hälfte dieses Problems lösen können, ohne von einer externen Quelle zu holen. Dies ist eine der Standardlücken, die Sie ausdrücklich untersagt haben.
Octopus

Antworten:

18

Bash + Curl + iproute2 , 54 50 49 48 33 Bytes

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

Vielen Dank an @DomHastings für das Golfen ab 1 Byte!

Vielen Dank an @Sisyphus für die Erstellung einer kürzeren URL!

Vielen Dank an @zeppelin für das Golfen mit 9 Bytes!

ბიმო
quelle
@DomHastings Deine letzten Golfversuche bringen Müll zusammen mit der IP-Adresse zurück, zumindest auf Ubuntu 16.04.3 LTS
Ferrybig
@Ferrybig Ja, das 1/0Teil gibt einen Fehler an STDERR aus, der jedoch standardmäßig ignoriert wird. Wenn Sie jedoch eine andere Ausgabe erhalten ip route, könnte dies nur die Version sein, die ich auf meinem Computer ausgeführt habe. Schande!
Dom Hastings
Die erste Zeile wird 1000für mich gedruckt ... ip route get 1Ausgabe: ptpb.pw/pixx
Majora320
Wenn ich diesen Code ausführe, erhalte ich folgende Ausgabe:RTNETLINK answers: Network is unreachable
kasperd
1
Sie können Ihren AWK-Ausdruck auch ein wenig optimieren:awk 'NR<2&&$0=$7'
Zeppelin
9

Bash 37 31 27 Bytes

Dies ist inspiriert von der Antwort von Bruce Forte . Diese Antwort funktioniert nur mit IPv4, was bedeutet, dass es bei mir nicht funktioniert. Ich habe es in eine Version umgeschrieben, die (nur) mit IPv6 funktioniert:

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

Dies wird auf Ubuntu 14.04.5 getestet, das über PPPoE verbunden ist, und da IPv6 für die Verwendung ohne NAT ausgelegt ist, wird dieselbe IP-Adresse zweimal ausgegeben.

-6 Bytes dank Zeppelin , -2 Bytes dank Ferrybig , -2 Bytes dank Markasoftware .

Kasperd
quelle
Auf meinem Ubuntu 16.04.3 LTS musste ich ändern '{print$11,$11}', '{print$9,$9}'damit der Befehl funktioniert. Ihr Befehl gab 2 Mal 1024 zurück. Ihr Befehl funktioniert auf meinem Ubuntu 16.04.2-Rechner
Ferrybig
@Ferrybig Hängt dann wohl von der Netzwerkkonfiguration ab. Ich habe dies in einem Netzwerk getestet, in dem Adressen anhand von Routerankündigungen automatisch konfiguriert werden.
Kasperd
Für Maschinen, bei denen die IP-Adresse manuell konfiguriert wurde (statisch) und ip routedas proto raTeil nicht ausgegeben wurde , können Sie diese Funktion verwenden, um Ihre Antwort weiter zu
analysieren
@Ferrybig Im Moment überlege ich, ob ich in beiden Fällen einen Weg finden kann, es zum Laufen zu bringen, ohne dass die Größe explodiert. Btw. auf meiner 16.04.3 Maschine , welche die Konfiguration mit Router - Advertisements erhielt er sagt proto staticnicht proto ra, obwohl dieser Unterschied zu diesem Code spielt keine Rolle.
Kasperd
Verwenden Sie awk '$0=$9" "$9'stattdessen , um ein bisschen Golf zu spielen {print$11,$11}. Viele Systeme (einschließlich mein Arch eins) verwenden das 9. Wort, daher ist es kürzer als 11 und diese Syntax ist auch kleiner als print $ 9, $ 9
markasoftware
7

Mathematica, 17 Bytes

In Mathematica ist für alles etwas eingebaut

$MachineAddresses

Wie in der Dokumentation beschrieben , listet dieser integrierte Befehl alle (lokalen und externen) IP-Adressen auf, die Ihrem Gerät zugeordnet sind.

JungHwan min
quelle
Die Dokumentation sagt nichts über externe Adressen aus.
Kasperd
Wenn dieser Befehl auch die IPv6-Adresse auflistet, können Sie sagen, dass die IPv6-Adresse das erwartete Ergebnis ist
Ferrybig
5
Dadurch wird eine Liste mit mehreren IP-Adressen für mich erstellt, aber keine davon scheint meine externe Adresse zu sein. Möglicherweise interpretiere ich die Dinge jedoch nicht richtig. Ich kann meine externe IP-Adresse von so etwas wie beziehen, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]aber ich weiß nicht, wie ich das direkter erreichen kann.
Mark S.
@MarkS. Das ist merkwürdig; Ich erhalte meine externe IP-Adresse, wenn ich den Befehl ausführe (der letzte Eintrag scheint es zu sein). Dieser Befehl funktioniert jedoch nicht mit Wolfram Sandbox. Vielleicht ist das ein Fehler; Welche Betriebssystem- und Mathematica-Version verwenden Sie?
JungHwan Min 20.08.17
@JungHwanMin 11.1.1.0 Student Edition gibt mir 6 Dinge, von denen ich annehme, dass sie IPv6, dann 192.168.0.104 und drei Adressen sind, die mit 169.254 beginnen. Aber meine externe Adresse beginnt mit 69.
Mark S.
6

AutoIt, 56 53 Bytes

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

@IPAddress1 ist ein zurückgegebenes Makro

IP-Adresse des ersten Netzwerkadapters

_GetIP() kehrt zurück

die öffentliche IP-Adresse.


-3 Bytes dank @ mınxomaτ

Daniel
quelle
3
Ordentlich, ein AutoIt (nicht IT) -Kollege. Sie können die Leerzeichen in diesem Code löschen.
Mittwoch,
@ mınxomaτ Danke für die Korrektur :)
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")}

2 Bytes dank @Xynos gespart.
25 Bytes dank @Nick eingespart.

Voll / Formatierte Version:

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
quelle
können Sie nicht zwei Bytes sparen, indem Sie das Leerzeichen um das == entfernen?
MysticVagabond
@Xynos Natürlich wusste ich nicht, dass ich es nicht entfernt hatte.
TheLethalCoder
Die Golf-Version wird nicht kompiliert und ist keine eigenständige Funktion. Es scheint nicht fair zu sein, eine Standalone-Funktion mit der Abkürzung für den Sockets-Namespace zu mischen. Daher würde ich vorschlagen, eine Option auszuwählen und diese zu verwenden. Dieser sagte, können Sie einige Bytes speichern durch Gießen i.AddressFamilyzu intanstelle von Gießen 2auf AddressFamily, und Sie können ersetzen Dns.GetHostName()mit dem leeren String.
Nick
@ Nick Ich werde das versuchen, wenn ich eine Chance bekomme und der namespaceTrick für C # ziemlich verbreitet ist. Wenn du denkst, es sollte nicht erlaubt sein, kannst du auf Meta darüber posten, aber im Moment ist es faires Spiel und ein guter Trick, um usings zu verkürzen .
TheLethalCoder
6

PowerShell v4 +, 40 bis 36 Byte

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

(Funktioniert nur auf Server 2012 R2 oder höher oder Windows 8.1 oder höher. Funktioniert nicht auf TIO.)

Macht genau das, was es verspricht. Ruft die IP-Adressen des lokalen Netzwerks ab und wählt nur den IPADdress-Teil davon aus (z. B. filtert die Subnetzmaske, das Gateway usw. heraus).

Die zweite ist eine, Invoke-WebRequestzu http://eth0.meder man einfach den CInhalt bekommt ; dh nur die öffentliche IP-Adresse.


Ungolfed-Version:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content
AdmBorkBork
quelle
Ein anonymer Benutzer schlägt vor, zu entfernenGet-
Stephen
@StepHen In der Tat. Funktioniert super.
AdmBorkBork
4

Unix Shell + Stunclient , 40 Bytes

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

Verwendet ein STUN-Protokoll :

Session Traversal Utilities für NAT (STUN) ist ein Protokoll, das als Tool für andere Protokolle im Umgang mit NAT-Traversal (Network Address Translator) dient. Es kann von einem Endpunkt verwendet werden, um die IP-Adresse und den Port zu ermitteln, die ihm von einem NAT zugewiesen wurden

Der Name des STUN-Servers stammt aus der Liste der öffentlichen STUN-Server .

Das Ausgabeformat ist:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Beachten Sie, dass beide Zeilen mit einem Leerzeichen eingerückt werden, aber ich glaube, dass dies nicht die geschriebenen Ausgaberegeln verletzt.

Beispielausgabe:

  192.168.1.100    
  209.85.233.147
Zeppelin
quelle
4

Curl (Bash One-Liner): 27 Bytes

curl -w%{local_ip} eth0.me

Das Ergebnis wird gedruckt stdoutund sieht folgendermaßen aus:

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

curl sollte mindestens die Version 7.29.0 haben (ab 6. Februar 2013).

Die Antwort basiert auf /codegolf//a/139538/66016 .

Kirill Bulygin
quelle
4

Go, nur MacOS, 10 Bytes

In macOS könnte dieser Killswitch verwendet werden, er kann aktuelle private aktive IP und öffentliche IP ausgeben:

$ 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

Dies ist kein integriertes Tool, sondern versucht, das Auffinden der richtigen IP-Adressen zu vereinfachen.

Die Ausgabe könnte mit folgenden Befehlen erfolgen:

$ route get 0.0.0.0

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

$ networksetup -listnetworkserviceorder

$ scutil --dns

Öffentliche IP:

$ dig o-o.myaddr.l.google.com @ns.google.com txt +short
nbari
quelle
2
Hallo! Willkommen bei PPCG! Diese Frage ist getaggt mit Code-Golf . Könnten Sie Golf Code mit einer Sprache und einer Byteanzahl versehen?
Stephen
3

PowerShell v3 + (alternative Antwort für Windows 7+)

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me
YChi Lu
quelle
2
Willkommen bei PPCG!
Stephen
1
Sie können die umgebenden Leerzeichen entfernen -match, um einige Bytes zu sparen.
AdmBorkBork
3

Bash + Awk + Curl, 43 Bytes

Verwenden Sie nur integrierte Tools für Mac und Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me
Alex Nikiforov
quelle
1
* bash du meinst.
Suici Doga
Bash + awk + Curl
Alex Nikiforov
Ich habe die Frage bearbeitet, um bash zu sagen, da es auf meinem Linux-Laptop nicht nur
MacOS funktioniert
thx, ich habe mich verbessert, da bash eine Shell per se ist (sollte auf tcsh, sh und jeder anderen Shell funktionieren), müssen Sie auch ifconfig, awk und curl haben
Alex Nikiforov
1
Dies ist nicht "MacOS / Linux", sondern Bash. Markiere es einfach als solches.
Text
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
quelle
Müssen Sie das nicht auch print a,b? Interessanterweise werden auf meinem System (Win7) zwei IP-Adressen ausgegeben, aber keine davon ist meine tatsächliche lokale IP-Adresse. bist eigentlich die IP eines virtuellen Adapters und nicht meine LAN-Verbindung .
Octopus
Vermutlich ist das aber immer noch eine lokale IP-Adresse . Ich habe einen Kommentar zu der Frage hinterlassen, um dies zu klären.
Octopus
@ Octopus Sie haben Recht über das Drucken, aktualisiert
Teo
In einer vorgeschlagenen Bearbeitung schlug @David Folgendes vor: 113 Bytes ( Überprüfung hier )
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+"")))

Ungolfed-Version:

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 gespeichert (wegen unnötigem Semikolon).
  • 29 Bytes dank @AndrewLi eingespart (verwendete Pfeilfunktionen für kürzeren Code).
  • Dank @MiniGod wurden 19 Byte gespeichert ( .get()anstelle von .request()- .end();entfernt).
  • Dank @ Zacharý 2 Bytes gespart (Klammern um einen einzelnen Parameter einer Pfeilfunktion werden nicht benötigt).
  • 43 Bytes dank @Birjolaxew gespeichert (gespeichert requireund console.login Einzelbuchstaben-Variablen, direkt an URL übergeben require('http').get, protokollierte Ausgabe direkt vom dataEreignis).

quelle
Können Sie Pfeilfunktionen nicht für kürzeren Code verwenden?
Andrew Li
@ AndrewLi Toller Vorschlag, danke. :)
Sie können .get()anstelle von verwenden .request(). Dann brauchst du das auch nicht .end();.
MiniGod
1
Sie brauchen keine Parens um einen einzelnen Parameter einer Pfeilfunktion. ( (a)=>=> a=>), IIRC.
Zacharý
1
@AndrewLi Hmm, das Problem ist, dass beim Ausführen des Codes in der REPL zusätzliche Informationen (z. B. die Anforderungsinformationen) ausgegeben werden, die in der Frage nicht zulässig sind. Ich könnte zusätzlichen Code hinzufügen, um diese Ausgabe auszublenden, aber dies könnte der Reduzierung von Bytes entgegenwirken, die durch das Weglassen der requireAufrufe entstehen. Deshalb lasse ich es für den Moment. Trotzdem danke für den Vorschlag.
1

Windows-Batchdatei , 116 Byte

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

Die erste Zeile durchläuft die Ergebnisse der Ausführung ipconfigund ruft Ihre lokale IPv4-Adresse ab.

Für den öffentlichen IP-Teil musste ich ein wenig von der wunderbaren Powershell-Antwort stehlen , da es meines Wissens keine Möglichkeit gibt, die öffentliche IP-Adresse des Computers ausschließlich über Batch-Scripting zu ermitteln.

Wir beginnen mit einem @Zeichen, um das Echo der Eingabeaufforderung ( C:\...\path>) zu unterdrücken , führen dann den Befehl Powershell Invoke-WebRequest(mit seinem Alias iwr) aus und extrahieren den contentTeil davon.

Ich experimentierte damit , den Befehl nicht zu verwenden (...).contentund stattdessen nur auszuführen und die tatsächlichen Informationen aus der vollständigen Ausgabe mit Batch zu extrahieren. Aber das erwies sich als viel länger als diese Lösung, also habe ich es behalten.

Getestet unter Windows 10.0.15063.

Matheus Avellar
quelle
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")

Getestet auf win10 und R (3.4.1).
Vielen Dank für @ Bruce-Forte für die kurze URL.

Ungolfed-Version:

library(magrittr)
system("ipconfig",int=T) %>% 
     regmatches(.,regexpr("v4.+",.)) %>% 
      {a <- nchar(.)
       substr(., a - 14, a)}
readLines("http://eth0.me")
AndriusZ
quelle
Bis zu 120 Bytes Probieren Sie es online!
BLT
@BLT nette Lösung. Sie können maximal 3 Bytes speichern, durch den Austausch a <- nchar(x)mita=nchar(x)
AndriusZ
@AndruisZ danke, aber es ist wirklich deine Lösung - ich habe es einfach de-magrittriert.
BLT
1

Python 2.7.13 128 Bytes

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

Bash + Curl, 24 Bytes

hostname -i;curl eth0.me
Wahrscheinlich
quelle
Dies funktioniert nicht. Auf der Manpage: " Diese Option listet alle konfigurierten Adressen auf allen Netzwerkschnittstellen auf. [...] Nehmen Sie keine Annahmen über die Reihenfolge der Ausgabe vor."
ბიმო
Hat -I (Kapital) keine andere Verwendung als -i (Kleinbuchstaben)? Das Bit, das Sie zitiert haben, stammt aus dem Abschnitt -I .
Wahrscheinlich
Tut mir leid. Aber noch schlimmer: " Vermeiden Sie es, diese Option zu verwenden ", so oder so funktioniert dies nicht (zumindest auf meinen Computern).
ბიმო
Richtig, zugegeben, ich habe vor dem Posten nicht die gesamte Dokumentation gelesen. Seltsamerweise scheint es auf einigen meiner Maschinen gut zu funktionieren. Diese Inkonsistenz würde diese Lösung jedoch bestenfalls unzuverlässig machen.
Voraussichtlich
1

MS-SQL, 59 Bytes

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Gibt die clientseitige IP-Adresse der SQL-Instanz zurück, die die Abfrage ausführt.

BradC
quelle
0

VBA, 58 Bytes

Whoops, behandelt keine lokale Adresse - Fix in Bearbeitung

Hinweis: Verwendet Verweise auf

Microsoft Internet Controls

Anonyme VBE-Sofortfensterfunktion, die keine Eingabe vornimmt und die IP-Adresse des Benutzers über ein Internet Explorer-Fenster ausgibt

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