IP Adresim Nedir?


24

Bunun henüz bir zorlukta ortaya çıkmamasına şaşırdım.

Çalıştığınız makinenin IP adresini girin. Hem yerel hem de harici IP adresleri vermeniz gerekir.

Yerel IP adresi, yani 192.168.xx’in varsayılan formatı boyunca

Genel IP adresi google https://www.google.co.uk/search?source=hp&q=whats+my+ip kullanılarak doğrulanabilir

Çıktı herhangi bir biçimde olabilir. IPv4 veya IPv6 veya bunların herhangi bir karışımına izin verilir, ancak bunlar yalnızca çıktı olmalıdır. Kod tam bir program veya işlev olabilir.

kuralları bu yüzden en kısa kod kazanır.

Standart Loopholes yasaktır.

EDIT: @Peter Taylor'ın yorumuna göre, iki türden bir adresin mevcut olması durumunda, ilkini ya da erişebildiğiniz kadar çıktısını seçebilirsiniz. En az bir yerel ve bir halk olduğu sürece.


3
Bence bu 0/1şey gereksiz yere kabartmaya meydan okuyor.
Bay Xcoder

5
Bu belirtilmiştir. Özellikle, birden fazla yerel IP adresinin ve / veya birden fazla genel IP adresinin bulunduğu durumları açıkça belirtmemektedir. Ayrıca, birden fazla genel IP adresimin olup olmadığını ve eğer öyleyse ne olduğunu söylemenin güvenilir bir yolu yoktur.
Peter Taylor

5
Ana bilgisayarın RFC 1918 adresleri yoksa ne olur? En azından bir özel ağa sahip makineler dışında, bunun için güvenilir bir cevap yok gibi görünüyor.
Toby Speight

4
... ve hatta bir ağ arayüzünde birden fazla IP adresi olabilir.
Kaz

14
Aslında, bu yarısını nasıl çözebileceklerini görmüyorum olmadan harici bir kaynaktan getirilirken siz açıkça yasak olan standart boşluklar biridir.
Ahtapot

Yanıtlar:


18

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

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

1 byte kapalı golf için teşekkürler @DomHastings!

Daha kısa bir URL ile geldiğiniz için teşekkürler @Sisyphus!

9 byte kapalı golf için teşekkürler @zeppelin!


@DomHastings Son golf girişimleriniz en azından Ubuntu'da, ip adresi ile birlikte bir miktar çöp geri veriyor. 16.04.3 LTS
Ferrybig,

@Ferrybig Evet, 1/0parça STDERR'ye bir hata veriyor, ancak eğer varsayılan olarak farklı çıktılar alırsanız ip route, bu sadece makinem üzerinde çalıştığım sürüm olabilir. Utanç!
Dom Hastings

İlk satır 1000benim için yazdırıyor ... ip route get 1çıktı: ptpb.pw/pixx
Majora320

Bu kodu çalıştırdığımda şu çıktıyı RTNETLINK answers: Network is unreachable
alıyorum

1
Ayrıca AWK ifadenizi biraz optimize edebilirsiniz:awk 'NR<2&&$0=$7'
zeppelin

9

Bash 37 31 27 bayt

Bu esinlenerek cevap tarafından Bruce Forte . Bu cevap sadece IPv4 ile çalışır, yani benim için işe yaramaz IPv6 ile çalışan (yalnızca) bir sürüme yeniden yazdım:

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

Bu, PPPoE ile bağlanan Ubuntu 14.04.5'te test edilmiştir ve IPv6, NAT olmadan kullanılmak üzere tasarlandığından, aynı IP adresini iki kez verir.

Zeplin sayesinde -6 bayt , Ferrybig sayesinde -2 bayt, Markasoftware sayesinde -2 bayt .


Benim Ubuntu 16.04.3 LTS, ben değiştirmek zorunda '{print$11,$11}'için '{print$9,$9}'komut işe yaraması için, komut benim Ubuntu 16.04.2 makinede 1024 2 kez, hakimiyetin eserler iade
Ferrybig

@Ferrybig Muhtemelen o zaman ağ yapılandırmasına bağlıdır. Bunu, adreslerin yönlendirici reklamlarından otomatik olarak yapılandırıldığı bir ağda test ettim.
kasperd

IP adresinin manuel olarak yapılandırıldığı (statik) makinelerin parçayı ip routeçıkarmaması için proto ra, bunu cevabınızı daha da
arttırmak

@Ferrybig Şu anda, her iki durumda da büyüklük patlaması olmadan çalışmasını sağlayacak bir yol bulabilir miyim diye düşünüyorum. Btw. diyor yönledirici kullanarak yapılandırmasını aldı benim 16.04.3 makinede proto staticdeğil proto rao fark bu koda önemli değil gerçi.
kasperd

Biraz golf oynamak awk '$0=$9" "$9'yerine , kullanın {print$11,$11}. Pek çok sistem (benim Arch
one'ım

7

Mathematica, 17 bayt

Mathematica'da her şey için bir yapı var

$MachineAddresses

Belgelerde açıklandığı gibi , bu yerleşik komut, cihazınızla ilişkili tüm IP adreslerini (hem yerel hem de harici) listeler.


Belgeler dış adresler hakkında hiçbir şey söylemiyor.
kasperd

Bu komut ipv6 adresini de listelerse, ipv6 adresinin beklenen sonuç olduğunu söyleyebilirsiniz
Ferrybig

5
Bu benim için birkaç IP adresinin bir listesini üretir, ancak hiçbiri benim dış adresim gibi görünmüyor; Yine de olayları doğru yorumlamıyor olabilirim. Harici IP adresimi şunun gibi bir şeyden alabilirim WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]ama nasıl daha doğrudan ulaşabileceğimi bilmiyorum.
Mark S. 16

@MarkS. Bu garip; Komutu çalıştırdığımda harici IP adresimi alıyorum (son giriş göründüğü gibi). Bu komut, Wolfram Sandbox'ta çalışmayacak. Belki de bu bir hatadır; Hangi işletim sistemi ve Mathematica sürümünü kullanıyorsunuz?
JungHwan Min

@JungHwanMin 11.1.1.0 Öğrenci Sürümü, IPv6, sonra 192.168.0.104 ve 169.254 ile başlayan üç adres olduğunu düşündüğüm 6 şeyi veriyor. Fakat dış adresim 69 ile başlıyor.
Mark S. 23

6

AutoIt, 56 53 bayt

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

@IPAddress1 dönen bir makro

İlk ağ adaptörünün IP adresi

_GetIP() döner

genel IP adresi.


@ Mınxomaτ sayesinde -3 bayt


3
Düzgün, bir dost AutoIt (BT değil) -er. Bu koddaki boşlukları silebilirsiniz.
mınxomaτ

@ mınxomaτ Düzeltme için teşekkürler :)
Daniel

6

C #, 196 194 188 163 bayt

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

@ Xynos sayesinde 2 bayt kaydedildi.
@Nick sayesinde 25 bayt kaydedildi.

Tam / Biçimli Sürüm:

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

== etrafında boşluk bırakarak iki bayt kaydedemez misiniz?
MysticVagabond

@Xynos Elbette, kaldırmadığımın farkında değildim.
TheLethalCoder

Golf edilen sürüm derlenmez ve bağımsız bir işlev değildir. Bağımsız bir işlevi Sockets ad alanını kullanmanın kısayoluyla karıştırmak adil görünmüyor, bu yüzden bir seçenek seçip onunla devam etmeyi öneririm. Yani döküm bazı bayt kaydedebilirsiniz söyledi i.AddressFamilyiçin intyerine döküm 2için AddressFamilyve yerini alabilecek Dns.GetHostName()boş dize ile.
Nick,

@Nick, bir şans bulduğumda ve hilenin namespaceC # için oldukça yaygın olduğunu deneyeceğim . Buna izin verilmemesi gerektiğini düşünüyorsanız, bu konuda meta yayınlayabilirsiniz ancak şu anda adil bir oyundur ve kısaltmaları temiz bir püf noktasıdır using.
TheLethalCoder

6

PowerShell v4 +, 40 36 bayt

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

(Yalnızca Server 2012 R2 veya üzeri ya da Windows 8.1 veya üzeri sürümlerde çalışır. TIO'da çalışmaz.)

Teneke söylediklerini aynen yapar. Yerel ağ IP adreslerini alır ve sadece IPAadres bölümünü seçer (örneğin, alt ağ maskesini, ağ geçidini vb. Filtreler).

İkinci bir olduğu Invoke-WebRequestiçin http://eth0.meolan sadece alır Content seçilir; yani, sadece halka açık IP adresi.


Ungolfed versiyonu:

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

İsimsiz bir kullanıcı kaldırmayı önerirGet-
Stephen

@StepHen Gerçekten. Harika çalışıyor.
AdmBorkBork

4

Unix Shell + stunclient , 40 bayt

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

Bir yararlanır STUN protokolü :

NAT (STUN) için Oturum Geçişi Yardımcı Programları, Ağ Adresi Çeviricisi (NAT) geçişi ile ilgili diğer protokoller için bir araç görevi gören bir protokoldür. Bir NAT adresi tarafından kendisine tahsis edilen IP adresini ve portu belirlemek için bir uç nokta tarafından kullanılabilir.

STUN sunucusu adı, Genel STUN sunucusu listesindendir .

Çıkış formatı:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

Her iki satırın da tek bir boşlukla girileceğini unutmayın, ancak bunun çıktı kurallarını yazılı olarak bozmadığına inanıyorum.

Örnek çıktı:

  192.168.1.100    
  209.85.233.147

4

kıvırmak (bash one-liner): 27 bayt

curl -w%{local_ip} eth0.me

Sonuç yazdırılır stdoutve şöyle görünür:

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

curl en az 7.29.0 sürümünde olmalıdır (6 Şubat 2013'den itibaren).

Cevap, /codegolf//a/139538/66016 adresine dayanmaktadır .


4

Git, sadece MacOS, 10 bayt

MacOS'ta bu killswitch kullanılabilir, mevcut özel aktif IP ve genel IP'yi yazdırabilir:

$ 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

Bu yerleşik bir araç değil, uygun IP'leri bulma işlemini basitleştirmeye çalışıyor.

Çıktı, aşağıdaki gibi komutları kullanarak elde edilebilir:

$ route get 0.0.0.0

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

$ networksetup -listnetworkserviceorder

$ scutil --dns

Genel IP:

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

2
Merhaba! PPCG'ye Hoşgeldiniz! Bu soru kod-golf olarak etiketlendi . Bir dil ve bayt sayısı ile golf kodu verebilir misiniz?
Stephen

3

PowerShell v3 + (Windows 7+ için alternatif cevap)

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

2
PPCG'ye Hoşgeldiniz!
Stephen,

1
-matchBirkaç bayttan tasarruf etmek için etrafındaki boşlukları kaldırabilirsiniz .
AdmBorkBork

3

Bash + Awk + Curl, 43 bayt

Mac ve Linux için yalnızca yerleşik araçlar kullanarak

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

1
* Bash demek istiyorsun.
Suici Doga

bash + awk + curl
Alex Nikiforov

sadece macos değil linux dizüstü bilgisayarımda çalıştığı için bash sorusunu düzenledi
Suici Doga

thx, ben bash kendi başına bir kabuk (tcsh, sh ve diğer herhangi bir kabuk üzerinde çalışması gerekir) olduğundan, ben de, eğer ifconfig, awk ve curl olması gerekir
Alex Nikiforov

1
Bu "MacOS / Linux" değil, Bash. Sadece böyle işaretleyin.
LyricLy

2

Python 3, 124 133 bayt

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

Ayrıca ihtiyacın yok print a,bmu? İlginç bir şekilde, bu sistemime iki IP veriyor (Win7), ancak hiçbiri gerçek yerel IP adresim değil. bAslında Yerel Bağlantım değil sanal adaptörün IP'sidir .
Ahtapot

Yine de tartışmalı, bu hala yerel bir IP adresi . Bununla ilgili açıklama istemek için Soru hakkında bir yorum bıraktım.
Ahtapot

@Octopus baskı konusunda haklısın, güncellendi
Teo

Önerilen bir düzenlemede, @David bunu önerdi: 113 bayt ( Burada inceleme )
Stephen

2

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

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 versiyonu:

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 bayt kaydedildi (gereksiz noktalı virgül nedeniyle).
  • @AndrewLi sayesinde 29 bayt kaydedildi (daha kısa kod için ok işlevlerini kullandı).
  • @ MiniGod sayesinde 19 bayt kaydedildi ( .get()yerine .request()- .end();çıkarıldı).
  • @ Zacharý sayesinde 2 bayt kurtarıldı (bir ok işlevinin yalnız bir parametresi etrafında parantez gerekmez).
  • @Birjolaxew sayesinde kaydedilen 43 bayt (saklı requireve console.logtek harfli değişkenlerde doğrudan url'ye iletildi require('http').get, doğrudan dataolaydan günlüğe kaydedilmiş çıktı ).

Kısa kod için ok fonksiyonlarını kullanamaz mısın?
Andrew Li

@AndrewLi Harika bir öneri, teşekkürler. :)

Sen kullanabilirsiniz .get()yerine .request(). O zaman da ihtiyacın yok .end();.
MiniGod

1
Bir ok işlevinin yalnız bir parametresinin etrafındaki parens gerekmez. ( (a)=>=> a=>), IIRC.
Zacharý

1
@AndrewLi Hmm, sorun, REPL'de kod çalıştırıldığında, soruda yasaklanan ekstra bilgileri (örneğin, istek bilgilerini) yazdırmasıdır. Bu çıktıyı gizlemek için ekstra kod ekleyebilirim, ancak requireçağrıları dışlamadan kaynaklanan bayt azalmasını engelleyebilir , bu yüzden şimdilik bırakacağım. Yine de öneri için teşekkürler.

1

Windows Toplu İş Dosyası , 116 bayt

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

İlk satır, çalışmanın sonuçlarını yineler ipconfigve yerel IPv4 adresinizi alır.

Kamuya açık olan IP bölümü için, harika Powershell yanıtından biraz çalmak zorunda kaldım, çünkü bildiğim kadarıyla, makinenin genel IP'sini yalnızca toplu komut dosyası kullanarak elde etmenin bir yolu yoktu.

@İstemi yankılanmayı bastırmak için bir işaretle başlıyoruz ( C:\...\path>), ardından Powershell komutunu Invoke-WebRequest(takma adıyla birlikte iwr) çalıştırıyor ve bunun bir contentkısmını çıkarıyoruz .

Ben deneyler değil kullanarak (...).contentve bunun yerine, sadece toplu kullanarak komutu çalıştırarak ve tam çıkışından gerçek bilgileri ayıklamak. Ancak bu, bu çözümden çok daha uzun sürdü, ben de öyle tuttum.

Windows 10.0.15063'te test edilmiştir.


1

R, 142 , 140 , 137 bayt

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

Win10 ve R'de test edilmiştir (3.4.1).
Kısa URL için @ Bruce-Forte için teşekkürler.

Ungolfed versiyonu:

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


@ BLT güzel bir çözüm. Sen değiştirerek, 3 bayt kaydedebilirsiniz a <- nchar(x)ilea=nchar(x)
AndriusZ

@AndruisZ teşekkürler, ama bu gerçekten senin çözümün - Ben sadece de-magrittr'd.
BLT

1

Python 2.7.13 128 bayt

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

1

Bash + Curl, 24 bayt

hostname -i;curl eth0.me

Bu işe yaramadı. Man sayfasından: " Bu seçenek tüm ağ arayüzlerinde yapılandırılmış tüm adresleri numaralandırıyor. [...] Çıktının sırası hakkında herhangi bir varsayımda bulunmayın."
1917

Does not -I farklı bir kullanımı vardır (sermaye) -i (küçük harf). Alıntı yaptığın parça I bölümündendi.
Muhtemelen

Doğru, bunun için üzgünüm. Ama daha da kötüsü, " Bu seçeneği kullanmaktan kaçının " diyor , her iki şekilde de çalışmaz (en azından makinelerimde) ..
ბიმო

Doğru, kuşkusuz, göndermeden önce tüm belgeleri okumadım. İşin garibi, birkaç makinemde iyi çalışıyor gibi görünüyor. Ancak bu tutarsızlık bu çözümü en iyi şekilde güvenilmez hale getirecektir.
Muhtemelen

1

MS-SQL, 59 bayt

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

Sorguyu yürüten SQL örneğinin istemciye dönük IP adresini döndürür.


0

VBA, 58 Bayt

Hata! Yerel adres işlenmiyor - düzeltme devam ediyor

Not: referans kullanır

Microsoft Internet Controls

Internet Explorer penceresi aracılığıyla giriş yapmayan ve kullanıcının IP adresini veren anonim VBE acil pencere işlevi

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.