Jaki jest mój adres IP?

24

Dziwi mnie, że to jeszcze nie było wyzwanie.

Wprowadź adres IP komputera, na którym pracujesz. Musisz podać zarówno lokalny, jak i zewnętrzny adres IP.

Lokalny adres IP, tzn. W domyślnym formacie 192.168.xx

Publiczny adres IP można zweryfikować za pomocą Google https://www.google.co.uk/search?source=hp&q=whats+my+ip

Dane wyjściowe mogą być w dowolnym formacie. IPv4 lub IPv6 lub dowolna ich kombinacja jest dozwolona, ​​jednak muszą być jedynymi danymi wyjściowymi. Kod może być pełnym programem lub funkcją.

obowiązują zasady , więc najkrótsze wygrane kodu.

Standardowe luki są zabronione.

EDYCJA: Zgodnie z komentarzem @Peter Taylor, w przypadku, gdy istnieje wiele adresów dowolnego typu, możesz wybrać albo wydrukować pierwszy, albo tyle, ile możesz uzyskać dostęp. Tak długo, jak obecny jest co najmniej jeden lokalny i jeden publiczny.

MysticVagabond
źródło
3
Myślę, że ta 0/1rzecz dodaje niepotrzebnego puchu do wyzwania.
Pan Xcoder,
5
Jest to nieokreślone. W szczególności nie odnosi się wyraźnie do przypadków, w których istnieje wiele lokalnych adresów IP i / lub wiele publicznych adresów IP. Ponadto nie ma wiarygodnego sposobu stwierdzenia, czy mam wiele publicznych adresów IP, a jeśli tak, to jakie są.
Peter Taylor,
5
Co jeśli host nie ma żadnych adresów RFC 1918? Wygląda na to, że nie ma na to wiarygodnej odpowiedzi, z wyjątkiem komputerów, które mają co najmniej jedną sieć prywatną.
Toby Speight,
4
... a nawet jeden interfejs sieciowy może mieć wiele adresów IP.
Kaz
14
W rzeczywistości nie rozumiem, jak można rozwiązać połowę tego problemu bez pobierania z zewnętrznego źródła , co jest jedną ze standardowych luk, których wyraźnie zabroniłeś.
Octopus,

Odpowiedzi:

18

Bash + curl + iproute2 , 54 50 49 48 33 bajtów

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

Dzięki @DomHastings za grę w golfa 1 bajtem!

Dzięki @Sisyphus za wymyślenie krótszego adresu URL!

Dzięki @zeppelin za grę w golfa z 9 bajtów!

ბიმო
źródło
@DomHastings Twoje ostatnie próby gry w golfa zwracają śmieci wraz z adresem IP, przynajmniej na Ubuntu 16.04.3 LTS
Ferrybig
@ Ferrybig Tak, 1/0część wysyła błąd do STDERR, ale jest to domyślnie ignorowane, jeśli jednak otrzymasz inne wyjście ip route, może to być po prostu wersja, którą uruchomiłem na moim komputerze. Wstyd!
Dom Hastings,
Pierwszy wiersz jest drukowany 1000dla mnie ... ip route get 1wynik: ptpb.pw/pixx
Majora320
Kiedy uruchamiam ten kod, otrzymuję następujące dane wyjściowe:RTNETLINK answers: Network is unreachable
kasperd
1
Możesz także nieco zoptymalizować swoją ekspresję AWK:awk 'NR<2&&$0=$7'
zeppelin,
9

Bash 37 31 27 bajtów

To jest inspirowana przez odpowiedzi przez Bruce Forte . Ta odpowiedź działa tylko z IPv4, co oznacza, że ​​nie działa dla mnie. Przepisałem go do wersji, która (tylko) działa z IPv6:

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

Jest to testowane na Ubuntu 14.04.5 podłączonym przez PPPoE, a ponieważ IPv6 jest zaprojektowany do użycia bez NAT, będzie dwa razy wysyłał ten sam adres IP.

-6 bajtów dzięki Zeppelin , -2 bajtów dzięki Ferrybig , -2 bajtów dzięki Markasoftware .

kasperd
źródło
Na moim Ubuntu 16.04.3 LTS musiałem zmienić '{print$11,$11}'na'{print$9,$9}' , aby prace polecenia, twoja komenda zwrócony 1024 2 razy, swoje prace polecenia na moim Ubuntu 16.04.2 maszynie
Ferrybig
@ Ferrybig Prawdopodobnie zależy wtedy od konfiguracji sieci. Przetestowałem to w sieci, w której adresy są konfigurowane automatycznie na podstawie reklam routera.
kasperd
W przypadku komputerów, na których adres IP jest konfigurowany ręcznie (statyczny), ip route nie wyświetla proto raczęści, możesz użyć tego jako funkcji, aby uzyskać dalszą odpowiedź
Ferrybig
@ Ferrybig W tej chwili zastanawiam się, czy mogę znaleźć sposób, aby działał w obu przypadkach bez powiększania rozmiaru. Btw. mówi na moim komputerze 16.04.3, który otrzymał konfigurację za pomocą reklam routeraproto staticproto ra , że nie , choć ta różnica nie ma znaczenia dla tego kodu.
kasperd
Aby trochę zagrać w golfa, użyj awk '$0=$9" "$9'zamiast {print$11,$11}. Wiele systemów (w tym mój Arch one) używa 9. słowa, więc jest krótsze niż 11, a także użycie tej składni jest mniejsze niż print 9 USD, 9 USD
markasoftware
7

Mathematica, 17 bajtów

Mathematica ma wbudowane wszystko

$MachineAddresses

Jak opisano w dokumentacji , to wbudowane polecenie wyświetla listę wszystkich adresów IP (lokalnych i zewnętrznych) powiązanych z urządzeniem.

JungHwan Min
źródło
Dokumentacja nie mówi nic o adresach zewnętrznych.
kasperd,
Jeśli to polecenie wyświetla również adres ipv6, możesz powiedzieć, że adres ipv6 jest oczekiwanym rezultatem
Ferrybig
5
To tworzy listę kilku adresów IP, ale żaden z nich nie wydaje się być moim adresem zewnętrznym; Być może jednak nie interpretuję poprawnie. Mogę uzyskać mój zewnętrzny adres IP z czegoś takiego, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]ale nie wiem, jak uzyskać bezpośredni dostęp do tego.
Mark S.
@Znaki. To jest dziwne; Otrzymuję mój zewnętrzny adres IP po uruchomieniu polecenia (wydaje się, że to ostatni wpis). To polecenie nie działa jednak w Wolfram Sandbox. Być może jest to błąd; jakiego systemu operacyjnego i wersji Mathematica używasz?
JungHwan Min
@JungHwanMin 11.1.1.0 Student Edition daje mi 6 rzeczy, które, jak zakładam, to IPv6, następnie 192.168.0.104 i trzy adresy zaczynające się od 169.254. Ale mój adres zewnętrzny zaczyna się od 69.
Mark S.
6

AutoIt, 56 53 bajtów

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

@IPAddress1 to makro, które zwraca

Adres IP pierwszej karty sieciowej

_GetIP() zwraca

publiczny adres IP.


-3 bajty dzięki @ mınxomaτ

Daniel
źródło
3
Zgrabny, kolega z AutoIt (nie IT). Możesz usunąć spacje w tym kodzie.
mınxomaτ
@ mınxomaτ Dzięki za korektę
Daniel
6

C #, 196 194 188 163 bajtów

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

Zaoszczędzono 2 bajty dzięki @Xynos.
Zaoszczędź 25 bajtów dzięki @Nick.

Pełna / sformatowana wersja:

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
źródło
nie możesz zapisać dwóch bajtów, usuwając białe znaki wokół ==?
MysticVagabond
@Xynos Oczywiście nie zdawałem sobie sprawy, że go nie usunąłem.
TheLethalCoder
Wersja w golfa nie kompiluje się i nie jest samodzielną funkcją. Mieszanie samodzielnej funkcji ze skrótem korzystania z przestrzeni nazw Sockets wydaje się niesprawiedliwe, więc sugeruję wybranie jednej opcji i wybranie jej. To powiedziawszy, możesz zapisać niektóre bajty, rzutując i.AddressFamilyna intzamiast zamiast 2na AddressFamily, i możesz zastąpić Dns.GetHostName()pusty ciąg.
Nick
@Nick Spróbuję tego, gdy będę mieć szansę, a namespacesztuczka jest dość powszechna w języku C #. Jeśli uważasz, że nie powinno to być dozwolone, możesz zamieścić na nim meta, ale w tej chwili jest to uczciwa gra i fajna sztuczka w skracaniu usings.
TheLethalCoder
6

PowerShell v4 +, 40 36 bajtów

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

(Działa tylko na serwerze 2012 R2 lub nowszym albo Windows 8.1 lub nowszym. Nie działa na TIO).

Robi dokładnie to, co jest napisane na puszce. Pobiera adresy IP sieci lokalnej i wybiera tylko IPAczęść adresu (np. Odfiltrowuje maskę podsieci, bramę itp.).

Drugi jest Invoke-WebRequestdo http://eth0.mektórego po prostu dostaje Cich ontent; tzn. tylko publiczny adres IP.


Wersja bez golfa:

(Get-NetIPAddress).IPAddress
(Invoke-WebRequest eth0.me).content
AdmBorkBork
źródło
Anonimowy użytkownik sugeruje usunięcieGet-
Stephen
@StepHen Rzeczywiście. Działa świetnie.
AdmBorkBork,
4

Unix Shell + oszałamiający , 40 bajtów

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

Wykorzystuje protokół STUN :

Session Traversal Utilities for NAT (STUN) to protokół, który służy jako narzędzie dla innych protokołów w postępowaniu z translacją adresów sieciowych (NAT). Może być używany przez punkt końcowy w celu ustalenia adresu IP i portu przydzielonego mu przez NAT

Nazwa serwera STUN pochodzi z listy publicznych serwerów STUN .

Format wyjściowy to:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Zauważ, że obie linie będą wcięte pojedynczą spacją, ale uważam, że nie łamie to reguł wyjściowych, jak napisano.

Przykładowe dane wyjściowe:

  192.168.1.100    
  209.85.233.147
zepelin
źródło
4

curl (bash one-liner): 27 bajtów

curl -w%{local_ip} eth0.me

Wynik zostanie wydrukowany stdouti wygląda następująco:

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

curl powinna być co najmniej w wersji 7.29.0 (od 6 lutego 2013 r.).

Odpowiedź jest oparta na /codegolf//a/139538/66016 .

Kirill Bulygin
źródło
4

Go, tylko MacOS, 10 bajtów

W systemie macOS można użyć tego przycisku kills , który może wydrukować bieżący prywatny aktywny adres IP i publiczny adres IP:

$ 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

To nie jest wbudowane narzędzie, ale próbuje uprościć proces znajdowania odpowiednich adresów IP.

Dane wyjściowe można uzyskać za pomocą poleceń takich jak:

$ route get 0.0.0.0

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

$ networksetup -listnetworkserviceorder

$ scutil --dns

Publiczny adres IP:

$ dig o-o.myaddr.l.google.com @ns.google.com txt +short
nbari
źródło
2
Cześć! Witamy w PPCG! To pytanie jest oznaczone kodem golfowym . Czy możesz podać kod do gry w golfa w języku i liczbie bajtów?
Stephen
3

PowerShell v3 + (alternatywna odpowiedź dla systemu Windows 7+)

((ipconfig) -match "v4").split(":")[1]
Invoke-RestMethod eth0.me
YChi Lu
źródło
2
Witamy w PPCG!
Stephen
1
Możesz usunąć otaczające spacje, -matchaby zaoszczędzić kilka bajtów.
AdmBorkBork,
3

Bash + Awk + Curl, 43 bajty

używając tylko wbudowanych narzędzi dla komputerów Mac i Linux

ifconfig|awk '/bro/{print $2}';curl eth0.me
Alex Nikiforov
źródło
1
* bash masz na myśli.
Suici Doga,
bash + awk + curl
Alex Nikiforov
zredagowałem pytanie, żeby powiedzieć „bash”, ponieważ działa ono na moim laptopie z linuksem, a nie tylko na komputerach
Mac
dzięki, poprawiłem, ponieważ bash sam w sobie jest powłoką (powinien działać na tcsh, sh i każdej innej powłoce), musisz także mieć ifconfig, awk i curl
Alex Nikiforov
1
To nie jest „MacOS / Linux”, to Bash. Po prostu zaznacz to jako takie.
LyricLy,
2

Python 3, 124 133 bajty

from urllib2 import urlopen
import socket
a=urlopen('http://eth0.me').read()
b=socket.gethostbyname(socket.gethostname())
print a,b
Teo
źródło
Czy ty też nie musisz print a,b? Co ciekawe, generuje to dwa adresy IP w moim systemie (Win7), ale żaden z nich nie jest moim rzeczywistym lokalnym adresem IP. bto właściwie adres IP wirtualnego adaptera, a nie moje połączenie lokalne .
Octopus,
Prawdopodobnie jest to nadal lokalny adres IP . Zostawiłem komentarz do pytania, aby poprosić o wyjaśnienie na ten temat.
Octopus,
@Octopus masz rację co do drukowania, zaktualizowano
Teo
W sugerowanej edycji @David zasugerował to: 113 bajtów ( recenzja tutaj )
Stephen
2

Node.js (JavaScript) 224 223 194 175 173 130 bajtów

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

Wersja bez golfa:

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

  • Zapisano 1 bajt (z powodu niepotrzebnego średnika).
  • Zaoszczędzono 29 bajtów dzięki @AndrewLi (używane funkcje strzałek dla krótszego kodu).
  • Zaoszczędzono 19 bajtów dzięki @MiniGod (używane .get()zamiast .request()- .end();usunięte).
  • Zaoszczędzono 2 bajty dzięki @ Zacharý (nawiasy niepotrzebne wokół pojedynczego parametru funkcji strzałki).
  • Zaoszczędzono 43 bajty dzięki @Birjolaxew (przechowywane requirei console.logzmienne jednoliterowe, przekazały adres URL bezpośrednio do require('http').get, rejestrowały dane wyjściowe bezpośrednio ze datazdarzenia).

źródło
Nie możesz użyć funkcji strzałek do skrócenia kodu?
Andrew Li,
@AndrewLi Świetna sugestia, dzięki. :)
Możesz użyć .get()zamiast .request(). Wtedy też nie potrzebujesz .end();.
MiniGod
1
Nie potrzebujesz parens wokół pojedynczego parametru funkcji strzałki. ( (a)=>=> a=>), IIRC.
Zacharý
1
@AndrewLi Hmm, problem polega na tym, że gdy kod jest uruchamiany w REPL, drukuje dodatkowe informacje (np. Informacje o żądaniu), co jest zabronione w pytaniu. Mógłbym dodać dodatkowy kod, aby ukryć to wyjście, ale może to przeciwdziałać redukcji bajtów wynikającej z pominięcia requirewywołań, więc zostawię to na razie. W każdym razie dziękuję za sugestię.
1

Plik wsadowy Windows , 116 bajtów

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

Pierwszy wiersz iteruje wyniki działania ipconfig i pobiera lokalny adres IPv4.

Jeśli chodzi o część publicznego adresu IP, musiałem ukraść odrobinę cudownej odpowiedzi Powershell, ponieważ, o ile wiem, nie ma sposobu na uzyskanie publicznego adresu IP maszyny za pomocą skryptów wsadowych.

Zaczynamy od @znaku, aby wyłączyć echo znaku zachęty ( C:\...\path>), a następnie uruchomić polecenie Powershell Invoke-WebRequest(z jego aliasem iwr) i wyodrębnić jego contentczęść.

I eksperymentowali z nie stosując(...).content , a zamiast tego tylko uruchamiając komendę i wydobywania aktualne informacje z pełnej wydajności, używając partii. Ale okazało się, że było to znacznie dłużej niż to rozwiązanie, więc go zatrzymałem.

Testowane w systemie Windows 10.0.15063.

Matheus Avellar
źródło
1

R, 142 , 140 , 137 bajtów

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

Testowane na Win10 i R (3.4.1).
Dzięki za @ Bruce-Forte za krótki adres URL.

Wersja bez golfa:

library(magrittr)
system("ipconfig",int=T) %>% 
     regmatches(.,regexpr("v4.+",.)) %>% 
      {a <- nchar(.)
       substr(., a - 14, a)}
readLines("http://eth0.me")
AndriusZ
źródło
Do 120 bajtów Wypróbuj online!
BLT
@BLT fajne rozwiązanie. Można zapisać 3 bajty, zastępując a <- nchar(x)za=nchar(x)
AndriusZ
@AndruisZ dzięki, ale to naprawdę twoje rozwiązanie - właśnie to usunąłem.
BLT
1

Python 2.7.13 128 bajtów

print __import__("urllib").urlopen("http://eth0.me").read(),__import__("socket").gethostbyname(__import__("socket").getfqdn())
Alexander Baine
źródło
1

Bash + Curl, 24 bajty

hostname -i;curl eth0.me
Prawdopodobnie
źródło
To nie działa .. Ze strony podręcznika: „ Ta opcja wylicza wszystkie skonfigurowane adresy we wszystkich interfejsach sieciowych. [...] Nie przyjmuj żadnych założeń dotyczących kolejności danych wyjściowych.”
ბიმო
Czy -I (kapitał) nie ma innego zastosowania niż -i (małe litery). Podany przez Ciebie fragment pochodzi z sekcji -I .
Prawdopodobnie
Przepraszam za to. Ale jeszcze gorzej: „ Unikaj korzystania z tej opcji ”, w każdym razie to nie działa (przynajmniej na moich komputerach) ..
ბიმო
Zgadza się, co prawda nie przeczytałem pełnej dokumentacji przed wysłaniem. Co dziwne, wydaje się, że działa dobrze na niektórych moich komputerach. Ale ta niespójność sprawiłaby, że to rozwiązanie byłoby w najlepszym wypadku niewiarygodne.
Prawdopodobnie
1

MS-SQL, 59 bajtów

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Zwraca adres IP zwróconej do klienta instancji SQL wykonującej zapytanie.

BradC
źródło
0

VBA, 58 bajtów

Ups, nie obsługuje adresu lokalnego - naprawa w toku

Uwaga: Używa odniesienia do

Microsoft Internet Controls

Anonimowa funkcja bezpośredniego okna VBE, która nie przyjmuje danych wejściowych i wyjściowych adresu IP użytkownika przez okno przeglądarki Internet Explorer

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Taylor Scott
źródło