मेरा आईपी पता क्या है?


24

मुझे आश्चर्य है कि यह अभी तक एक चुनौती में नहीं आया है।

जिस मशीन पर आप चल रहे हैं उसका IP पता आउटपुट करें। आपको स्थानीय और बाहरी दोनों IP पतों को आउटपुट करना आवश्यक है।

स्थानीय आईपी पता, यानी 192.168.xx के डिफ़ॉल्ट प्रारूप के साथ

सार्वजनिक IP पते को https://www.google.co.uk/search?source=hp&q=whatsmy_ip का उपयोग करके सत्यापित किया जा सकता है

आउटपुट किसी भी प्रारूप में हो सकता है। IPv4 या IPv6 या प्रत्येक के किसी भी मिश्रण की अनुमति है, हालांकि उन्हें केवल आउटपुट होना चाहिए। कोड एक पूर्ण कार्यक्रम या एक फ़ंक्शन हो सकता है।

नियम इतनी छोटी कोड जीत लागू करते हैं।

मानक ढीले निषिद्ध हैं।

संपादित करें: @Peter टेलर की टिप्पणी के अनुसार, उस मामले में जहां या तो कई प्रकार के पते मौजूद हैं, आप या तो पहले वाले आउटपुट का चयन कर सकते हैं, या जितने का उपयोग कर सकते हैं। इतने लंबे समय तक कम से कम एक स्थानीय और एक जनता मौजूद है।


3
मुझे लगता 0/1है कि चुनौती के लिए अनावश्यक फालतू में बात बढ़ जाती है।
श्री एक्सकोडर

5
यह अधोमानक है। विशेष रूप से, यह उन मामलों को स्पष्ट रूप से संबोधित नहीं करता है जहां कई स्थानीय आईपी पते और / या कई सार्वजनिक आईपी पते हैं। इसके अलावा, यह बताने का कोई विश्वसनीय तरीका नहीं है कि मेरे पास कई सार्वजनिक आईपी पते हैं, और यदि ऐसा है तो वे क्या हैं।
पीटर टेलर

5
यदि होस्ट के पास कोई RFC 1918 पता नहीं है तो क्या होगा? ऐसा लगता है कि इस पर कोई विश्वसनीय जवाब नहीं है, केवल उन मशीनों को छोड़कर जिनके पास कम से कम एक निजी नेटवर्क है।
टोबी स्पाइट

4
... और यहां तक ​​कि एक नेटवर्क इंटरफ़ेस में कई आईपी पते हो सकते हैं।
काज

14
वास्तव में, मैं यह नहीं देखता कि आप इसका आधा हिस्सा बाहरी स्रोत से प्राप्त किए बिना कैसे हल कर सकते हैं , जो आपके द्वारा स्पष्ट रूप से मना किए जाने वाले मानक खामियों में से एक है।
ऑक्टोपस

जवाबों:


18

बैश + कर्ल + iproute2 , 54 50 49 48 33 बाइट्स

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

1 बाइट को बंद करने के लिए धन्यवाद @DomHastings!

एक छोटे URL के साथ आने के लिए @Sisyphus धन्यवाद!

9 बाइट्स बंद करने के लिए धन्यवाद @zeppelin!


@DomHastings आपका अंतिम गोल्फ प्रयास IP पते के साथ कुछ कचरा देता है, कम से कम Ubuntu 16.04.3 LTS पर
Ferrybig

@Ferrybig हाँ, यह 1/0हिस्सा STDERR के लिए एक त्रुटि उत्पन्न करता है, लेकिन इसे डिफ़ॉल्ट रूप से अनदेखा किया जाता है, यदि आपको इसके लिए अलग-अलग आउटपुट मिलते हैं, तो ip routeबस वह संस्करण हो सकता है जो मैं अपनी मशीन पर चला रहा था। शर्म की बात है!
डोम हेस्टिंग्स

1000मेरे लिए पहली पंक्ति प्रिंट करती है ... ip route get 1आउटपुट: ptpb.pw/pixx
मेजर 320

जब मैं उस कोड को चलाता हूं तो मुझे यह आउटपुट मिलता है:RTNETLINK answers: Network is unreachable
kasperd

1
आप अपनी AWK अभिव्यक्ति को थोड़ा अनुकूलित कर सकते हैं:awk 'NR<2&&$0=$7'
zeppelin

9

बैश 37 31 27 बाइट्स

यह ब्रूस फोर्ट के जवाब से प्रेरित है । यह जवाब केवल IPv4 के साथ काम करता है जिसका मतलब है कि यह मेरे लिए काम नहीं करता है। मैंने इसे एक संस्करण में फिर से लिखा है जो (केवल) IPv6 के साथ काम करता है:

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

यह PPPoE के माध्यम से जुड़ा Ubuntu 14.04.5 पर परीक्षण किया गया है और चूंकि IPv6 को किसी भी NAT के बिना उपयोग करने के लिए डिज़ाइन किया गया है, यह एक ही आईपी पते को दो बार आउटपुट करेगा।

-6 के लिए धन्यवाद बाइट्स टसेपेल्लिन , -2 के लिए धन्यवाद बाइट्स Ferrybig , -2 के लिए धन्यवाद बाइट्स Markasoftware


मेरी Ubuntu 16.04.3 LTS पर, मैं बदलना पड़ा '{print$11,$11}'करने के लिए '{print$9,$9}'आदेश काम करने के लिए, अपने आदेश 1024 में 2 बार, मेरे Ubuntu 16.04.2 मशीन पर आपका आदेश काम करता है लौटे
Ferrybig

@Ferrybig संभवतः नेटवर्क कॉन्फ़िगरेशन पर निर्भर करता है। मैंने इसका परीक्षण एक ऐसे नेटवर्क पर किया जहां पते राउटर विज्ञापनों से स्वतः कॉन्फ़िगर किए गए हैं।
1955 में कैस्परल्ड

उन मशीनों के लिए जहां आईपी पता मैन्युअल रूप से कॉन्फ़िगर किया गया है (स्थिर), भाग को ip routeआउटपुट नहीं करता है proto ra, आप इसे अपने उत्तर को आगे बढ़ाने के लिए एक सुविधा के रूप में उपयोग कर सकते हैं
फेरीबग

@Ferrybig इस समय मैं विचार कर रहा हूं कि क्या मैं इसे आकार देने के बिना दोनों मामलों में काम करने का तरीका खोज सकता हूं। Btw। मेरे 16.04.3 मशीन पर जो राउटर विज्ञापनों का उपयोग करके इसका विन्यास प्राप्त करता है, यह proto staticनहीं कहता है proto ra, हालांकि यह अंतर इस कोड के लिए कोई फर्क नहीं पड़ता।
कैस्परड

इसे थोड़ा गोल्फ करने के लिए, awk '$0=$9" "$9'इसके बजाय का उपयोग करें {print$11,$11}। कई सिस्टम (मेरे आर्क एक सहित) 9 वें शब्द का उपयोग करते हैं, इसलिए यह 11 से छोटा है, और इस सिंटैक्स का उपयोग प्रिंट 9 डॉलर, 9 डॉलर से भी छोटा है
markasoftware

7

गणितज्ञ, 17 बाइट्स

Mathematica में हर चीज के लिए एक बेसिन है

$MachineAddresses

दस्तावेज़ में वर्णित के रूप में , यह अंतर्निहित आदेश आपके डिवाइस से जुड़े सभी आईपी पते (स्थानीय और बाहरी दोनों) को सूचीबद्ध करता है।


प्रलेखन बाहरी पतों के बारे में कुछ नहीं कहता है।
कास्परड

यदि यह कमांड IPv6 पते को भी सूचीबद्ध करता है, तो आप कह सकते हैं कि ipv6 पता अपेक्षित परिणाम है
Ferrybig

5
यह मेरे लिए कई आईपी पतों की एक सूची तैयार करता है, लेकिन उनमें से कोई भी मेरा बाहरी पता नहीं लगता है; मैं सही ढंग से चीजों की व्याख्या नहीं कर सकता हूं, हालांकि। मैं अपने बाहरी आईपी पते को कुछ इस तरह से प्राप्त कर सकता हूं, WolframAlpha["ip address", {{"IPAddress:InternetData", 1}, "ComputableData"}][[1,2]]लेकिन मुझे नहीं पता कि इसे और अधिक सीधे कैसे प्राप्त किया जाए।
मार्क एस।

@निशान। बहुत ही अजीब है; जब मैं कमांड चलाता हूं तो मुझे अपना बाहरी आईपी पता मिलता है (अंतिम प्रविष्टि यह प्रतीत होती है)। यह आदेश वुल्फराम सैंडबॉक्स पर काम नहीं करेगा, हालांकि। शायद यह एक बग है; आप किस OS और Mathematica संस्करण का उपयोग कर रहे हैं?
जुंगह्वान न्यूनतम

@JungHwanMin 11.1.1.0 छात्र संस्करण मुझे 6 चीजें देता है जो मुझे लगता है कि IPv6 हैं, फिर 192.168.0.104, और 169.254 के साथ शुरू होने वाले तीन पते। लेकिन मेरा बाहरी पता 69 से शुरू होता है।
मार्क एस।

6

ऑटो इट, 56 53 बाइट्स

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

@IPAddress1 एक मैक्रो है जो लौटता है

पहले नेटवर्क एडेप्टर का आईपी पता

_GetIP() रिटर्न

सार्वजनिक आईपी पता।


-3 बाइट्स @ mınxomates के लिए धन्यवाद


3
Neat, a fellow AutoIt (not IT) -er. You can delete the spaces in this code.
mınxomaτ

@mınxomaτ Thanks for the correction :)
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")}

Saved 2 bytes thanks to @Xynos.
Saved 25 bytes thanks to @Nick.

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

cant you save two bytes by removing the whitespace around the == ?
MysticVagabond

@Xynos Of course, didn't realise I hadn't removed it.
TheLethalCoder

The golfed version does not compile and is not a standalone function. It doesn't seem fair to mix a standalone function with the shortcut of using the Sockets namespace, so I'd suggest picking one option and going with it. That said, you can save some bytes by casting i.AddressFamily to int instead of casting 2 to AddressFamily, and you can replace Dns.GetHostName() with the empty string.
निक

@ मैं कोशिश करूंगा कि जब मुझे मौका मिले और namespaceट्रिक सी # के लिए काफी सामान्य हो। अगर आपको लगता है कि इसे अनुमति नहीं दी जानी चाहिए, तो आप इसके बारे में मेटा पर पोस्ट कर सकते हैं, लेकिन इस समय यह उचित खेल है और usingएस को छोटा करने में एक अच्छी चाल है ।
TheLethalCoder

6

PowerShell v4 +, 40 36 बाइट्स

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

(केवल सर्वर 2012 R2 या इसके बाद के संस्करण, या विंडोज 8.1 या इसके बाद के संस्करण पर काम करता है। TIO पर काम नहीं करता है।)

जैसा नाम, वैसा काम। स्थानीय नेटवर्क आईपी पते प्राप्त करता है और IPAउसके बाद बस ddress भाग का चयन करता है (उदाहरण के लिए, सबनेट मास्क, गेटवे आदि को फ़िल्टर करता है)।

दूसरा एक है Invoke-WebRequestकरने के लिए http://eth0.meजो केवल हो जाता है Content उसके; यानी, सिर्फ सार्वजनिक आईपी पता।


Ungolfed संस्करण:

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

एक अनाम उपयोगकर्ता हटाने का सुझाव देता हैGet-
स्टीफन

@StepHen वास्तव में। बहुत अच्छा काम करता है।
AdmBorkBork

4

यूनिक्स शेल + स्टंकल , 40 बाइट्स

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

एक STUN प्रोटोकॉल का उपयोग करता है:

NAT (STUN) के लिए सत्र ट्रैवर्सल यूटिलिटीज एक प्रोटोकॉल है जो नेटवर्क एड्रेस ट्रांसलेटर (NAT) ट्रैवर्सल से निपटने में अन्य प्रोटोकॉल के लिए एक उपकरण के रूप में कार्य करता है। इसका उपयोग एंडपॉइंट द्वारा IP पता और किसी NAT द्वारा आवंटित पोर्ट को निर्धारित करने के लिए किया जा सकता है

STUN सर्वर का नाम सार्वजनिक STUN सर्वर सूची से है

आउटपुट स्वरूप है:

 LOCAL IPV4 ADDRESS
 PUBLIC IPV4 ADDRESS

ध्यान दें कि दोनों लाइनें एक ही स्थान के साथ इंडेंट होंगी, लेकिन मेरा मानना ​​है कि यह लिखित रूप में आउटपुट नियमों को नहीं तोड़ता है।

नमूना उत्पादन:

  192.168.1.100    
  209.85.233.147

4

कर्ल (बैश वन-लाइनर): 27 बाइट्स

curl -w%{local_ip} eth0.me

परिणाम पर मुद्रित stdoutऔर इस तरह दिखता है:

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

curl कम से कम संस्करण 7.29.0 (फरवरी 6, 2013 से) होना चाहिए।

इसका उत्तर /codegolf//a/139538/66016 पर आधारित है ।


4

जाओ, केवल MacOS, 10 बाइट्स

MacOS में इस किलस्विच का उपयोग किया जा सकता है, यह वर्तमान निजी सक्रिय आईपी और सार्वजनिक आईपी को प्रिंट कर सकता है:

$ 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

यह बिल्ट-इन टूल नहीं है, लेकिन उचित आईपी खोजने की प्रक्रिया को आसान बनाने की कोशिश करता है।

जैसे कमांड का उपयोग करके आउटपुट प्राप्त कर सकते हैं:

$ route get 0.0.0.0

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

$ networksetup -listnetworkserviceorder

$ scutil --dns

सार्वजनिक आईपी:

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

2
नमस्ते! PPCG में आपका स्वागत है! इस सवाल को कोड-गोल्फ टैग किया गया है । क्या आप एक भाषा और एक बाइट गिनती के साथ गोल्फ कोड प्रदान कर सकते हैं?
स्टीफन

3

PowerShell v3 + (विंडोज़ 7 के लिए वैकल्पिक उत्तर)

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

2
PPCG में आपका स्वागत है!
स्टीफन

1
आप -matchयुगल बाइट को बचाने के लिए आसपास के रिक्त स्थान को हटा सकते हैं ।
AdmBorkBork

3

बैश + अक्क + कर्ल, 43 बाइट्स

केवल मैक और लिनक्स के लिए निर्मित उपकरणों का उपयोग करना

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

1
* मार मतलब है।
सुसी डोगा


मैंने सवाल को संपादित करने के लिए कहा क्योंकि यह मेरे लिनक्स लैपटॉप पर काम करता है न कि केवल
मैकोस

thx, मैंने सुधार किया क्योंकि bash एक शेल प्रति से (tcsh, sh और किसी भी अन्य शेल पर काम करना चाहिए), आपको ifconfig, awk और कर्ल भी करने की आवश्यकता है
एलेक्स निकिफोरोव

1
यह "मैकओएस / लिनक्स" नहीं है, यह बैश है। बस इसे ऐसे चिह्नित करें।
LyricLy

2

पायथन 3, 124 133 बाइट्स

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

क्या आपको भी इसकी आवश्यकता नहीं है print a,b? दिलचस्प बात यह है कि यह मेरे सिस्टम (Win7) पर दो आईपी आउटपुट करता है, लेकिन दोनों में से कोई भी मेरा वास्तविक आईपी पता नहीं है। bवास्तव में एक वर्चुअल एडेप्टर का आईपी है न कि मेरा लोकल एरिया कनेक्शन
ऑक्टोपस

हालांकि, यह अभी भी एक स्थानीय आईपी पता है । मैंने उस पर स्पष्टीकरण मांगने के लिए प्रश्न पर एक टिप्पणी छोड़ दी।
ऑक्टोपस

@ ऑक्टोपस आप मुद्रण के बारे में सही हैं, अद्यतन
Teo

एक सुझाए गए संपादन में, @ डेविड ने यह सुझाव दिया: 113 बाइट्स ( यहां देखें )
स्टीफन

2

Node.js (जावास्क्रिप्ट) 224 223 194 175 173 130 बाइट्स

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 संस्करण:

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 बाइट (अनावश्यक अर्धविराम के कारण)।
  • सहेजे गए 29 बाइट्स @AndrewLi (कम कोड के लिए उपयोग किए गए एरो फ़ंक्शंस) के लिए धन्यवाद
  • सहेजी गयी 19 @MiniGod करने के लिए धन्यवाद बाइट्स (प्रयुक्त .get()बजाय .request()- .end();हटा दिए गए)।
  • @ Zacharý (एक तीर फ़ंक्शन के एक लोन पैरामीटर के आसपास की आवश्यकता नहीं है) के लिए धन्यवाद 2 बाइट्स सहेजे गए
  • 43 बाइट्स @Birjolaxew के लिए धन्यवाद (संग्रहीत requireऔर console.logएकल-अक्षर चर में, सीधे url को पारित require('http').getकिया, dataघटना से सीधे आउटपुट लॉग किया )।

क्या आप छोटे कोड के लिए तीर फ़ंक्शन का उपयोग नहीं कर सकते हैं?
एंड्रयू ली

@AndrewLi बढ़िया सुझाव, धन्यवाद। :)

आप उपयोग कर सकते हैं .get()के बजाय .request()। तो फिर तुम भी जरूरत नहीं है .end();
17

1
आप एक तीर समारोह के एक अकेला पैरामीटर के आसपास parens की जरूरत नहीं है। ( (a)=>=> a=>), IIRC।
ज़चारि

1
@AndrewLi हम्म, समस्या यह है कि जब कोड को REPL में चलाया जाता है, तो यह अतिरिक्त जानकारी (जैसे अनुरोध जानकारी) को प्रिंट करता है, जो प्रश्न में निषिद्ध है। मैं इस आउटपुट को छिपाने के लिए अतिरिक्त कोड जोड़ सकता हूं, लेकिन यह बाइट्स की कमी का प्रतिकार कर सकता है, जिसके परिणामस्वरूप requireकॉल को छोड़ना होगा, इसलिए मैं इसे अभी के लिए छोड़ दूंगा। वैसे भी सुझाव के लिए धन्यवाद।

1

विंडोज 'बैच फ़ाइल , 116 बाइट्स

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

पहली पंक्ति चलने के परिणामों से गुजरती है ipconfigऔर आपके स्थानीय IPv4 पते को प्राप्त करती है।

सार्वजनिक आईपी भाग के लिए, मुझे अद्भुत पॉवर्सशेल उत्तर से थोड़ा चोरी करना पड़ा क्योंकि, जहां तक ​​मुझे पता है, मशीन के सार्वजनिक आईपी को पूरी तरह से बैच स्क्रिप्टिंग का उपयोग करने का कोई तरीका नहीं है।

हम एक @संकेत के साथ शुरू करते हैं , शीघ्रपतन ( C:\...\path>) को दबाने के लिए , फिर पॉवर्सशेल कमांड Invoke-WebRequest(इसके उपनाम के साथ ) चलाएं iwrऔर उस contentहिस्से को निकालें ।

मैं के साथ प्रयोग नहीं का उपयोग कर (...).contentऔर, बजाय, केवल आदेश चल रहा है और पूरा उत्पादन से वास्तविक जानकारी निकालने, बैच का उपयोग कर। लेकिन यह इस समाधान से अधिक लंबा साबित हुआ, इसलिए मैंने इसे रखा।

विंडोज 10.0.15063 पर परीक्षण किया गया।


1

आर, 142 , 140 , 137 बाइट्स

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

Win10 और R (3.4.1) पर परीक्षण किया गया।
लघु URL के लिए @ ब्रूस-फोर्ट के लिए धन्यवाद।

Ungolfed संस्करण:

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


@BLT अच्छा समाधान। तुम्हें पता है, 3 बाइट्स बचा सकता है की जगह a <- nchar(x)के साथa=nchar(x)
AndriusZ

@AndruisZ धन्यवाद, लेकिन यह वास्तव में आपका समाधान है - मैं बस इसे de-magrittr'd।
BLT


1

बैश + कर्ल, 24 बाइट्स

hostname -i;curl eth0.me

यह काम नहीं करता है .. मैन पेज से: " यह विकल्प सभी नेटवर्क इंटरफेस पर सभी कॉन्फ़िगर किए गए पतों की गणना करता है। [...] आउटपुट के क्रम के बारे में कोई धारणा नहीं बनाते हैं।"
ბიმო

नहीं करता मैं तुलना में एक अलग उपयोग किया है (राजधानी) मैं (लोअरकेस)। आपके द्वारा उद्धृत बिट -I अनुभाग से था ।
संभवतः

सच है, इस बारे में खेद है। लेकिन इससे भी बदतर यह कहता है कि " इस विकल्प का उपयोग करने से बचें ", या तो यह काम नहीं करता है (कम से कम मेरी मशीनों पर) ..
at

सही है, माना कि मैंने पोस्ट करने से पहले पूरा दस्तावेज नहीं पढ़ा। अजीब तरह से यह मेरी कुछ मशीनों पर ठीक काम करता है। लेकिन यह असंगति इस समाधान को सर्वोत्तम रूप से अविश्वसनीय बना देगी।
संभवतः

1

MS-SQL, 59 बाइट्स

SELECT TOP 1 local_net_address
FROM sys.dm_exec_connections

क्वेरी निष्पादित करने वाले SQL इंस्टेंस का क्लाइंट-फेसिंग IP पता देता है।


0

VBA, 58 बाइट्स

वूप्स, स्थानीय पते को संभालता नहीं है - प्रगति में तय करता है

ध्यान दें: संदर्भ का उपयोग करता है

Microsoft Internet Controls

अनाम VBE तत्काल विंडो फ़ंक्शन जो कोई इनपुट नहीं लेता है और इंटरनेट एक्सप्लोरर विंडो के माध्यम से उपयोगकर्ता के आईपी पते को आउटपुट करता है

Set i=New InternetExplorer:i.Visible=1:i.Navigate"eth0.me"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.