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.


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!


@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 .


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.


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τ


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

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

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

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 .


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

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

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

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

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

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.


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

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

1

Bash + Curl, 24 bajty

hostname -i;curl eth0.me

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.


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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.