2008-12-01 3 views
8

क्या पर्ल से स्थानीय मशीन के आईपी पते निर्धारित करने के लिए कोई साफ और ओएस स्वतंत्र तरीका है?मैं पर्ल से स्थानीय मशीन के आईपी पते कैसे निर्धारित कर सकता हूं?

अब तक मैं पाया है निम्न समाधानों:

  • ifconfig और ipconfig (हार्ड, अलग खिड़कियों संस्करणों अलग ipconfig आउटपुट है)

  • के उत्पादन को पार्स एक अच्छी तरह से करने के लिए नेटवर्क कनेक्शन स्थापित ज्ञात आईपी और सॉकेट के स्थानीय आईपी पते की जांच करें (अगर मैं कनेक्शन स्थापित नहीं कर सकता और केवल एक आईपी पता निर्धारित नहीं करूँगा)

कोई बेहतर सुझाव?

+0

जादू संख्या 127.0.0.1 –

+2

यह मेरी आवश्यकता नहीं है। मैं बस एक अनुकूलित रूप में मशीन के आईपी पते मुद्रित करना चाहता हूं, मैं पते का उपयोग नहीं करना चाहता हूं। – Zizzencs

उत्तर

15

Net::Address::IP::Local होनहार लग रहा है।

use Net::Address::IP::Local; 

# Get the local system's IP address that is "en route" to "the internet": 
my $address  = Net::Address::IP::Local->public; 
+0

नया लिंक http://search.cpan.org/~jmehnle/Net-Address-IP-Local-0.1.2/lib/Net/Address/IP/Local.pm –

+0

लिंक संस्करण स्वतंत्र बनाया गया ;-) –

+1

@ zizzencs मुझे समझ में नहीं आता है कि आपने मशीन के * सभी * आईपी पते के लिए पूछे जाने पर जवाब क्यों स्वीकार कर लिया। यह उत्तर सिर्फ एक देता है। – dolmen

0

डब्लूएमआई का उपयोग करें?

Example of extracting IP addresses (PowerShell में, लेकिन यह बहुत स्पष्ट है कि क्या हो रहा है)

Example of accessing WMI from Perl (नहीं एक ही WMI काम करता है, लेकिन फिर से प्रक्रिया यथोचित स्पष्ट है)

संपादित करें: Networkadapterconfiguration के लिए गूगल codesearch पर एक खोज के बाद और भाषा "पर्ल":

Example looks like pretty much what you need

EDIT2: OCS कोड सबसे प्लेटफार्मों यह करने के लिए के लिए कोड को रोकने के लिए लगता है वास्तव में , इसलिए जब कोड का कोई भी सेट नहीं हो सकता है, तो आप उनके विचारों का दोबारा उपयोग कर सकते हैं। हालांकि, यह जीपीएल है।

उदाहरण के लिए, here's the Solaris code। अन्य बिट्स में बीएसडी, लिनक्स, मैकोज़ शामिल हैं ...

+0

आशाजनक लग रहा है, लेकिन अधिकांश लिनक्स सिस्टम पर afaik WMI उपलब्ध नहीं है। निश्चित रूप से आप OpenPegasus का उपयोग कर सकते हैं, लेकिन यह इस समस्या के लिए थोड़ा बड़ा होगा। – Zizzencs

+0

नहीं, डब्ल्यूएमआई नहीं होगा। ऐसा लगता है कि आपको ओएस प्रकार पर स्विच करने की आवश्यकता हो सकती है और अलग कोड हो सकता है। –

+0

मैं ऐसा करूँगा अगर कुछ और मदद नहीं करता है। आपके उत्तर के लिए धन्यवाद। – Zizzencs

13

आपके पास कुछ other options भी है, जिसमें "एक प्रसिद्ध आईपी के लिए नेटवर्क कनेक्शन स्थापित करने और सॉकेट के स्थानीय आईपी पते की जांच करने" के आपके समाधान शामिल हैं।

उस मामले (स्थापित करने नेटवर्क कनेक्शन) में, तथापि, कि लेख बताते हैं कि:

वहाँ एक मेजबान के आईपी पते जैसी कोई चीज नहीं है।
नेटवर्क इंटरफेस में आईपी पते हैं, होस्ट नहीं, और एक नेटवर्क इंटरफ़ेस में कई (आभासी) आईपी पते हो सकते हैं। ऑपरेटिंग सिस्टम की रूटिंग सबसिस्टम रिमोट मशीन से कनेक्ट करने के लिए किस नेटवर्क इंटरफ़ेस और आईपी पते का उपयोग करने का निर्णय लेता है।

यदि आपकी मशीन में केवल एक बाहरी नेटवर्क इंटरफ़ेस है, और इस इंटरफ़ेस में केवल एक आईपी पता है तो यह आईपी पता आमतौर पर मशीन का पता कहलाता है, लेकिन यह गलत है।
उदाहरण के लिए, मशीन, नहीं बाहरी IP पता

एक आभासी इंटरफेस अन्य समाधान के बीच यह वीपीएन पर एक और मशीन से कनेक्ट करने के लिए इस इंटरफेस के आईपी पते का उपयोग करेगा के माध्यम से एक वीपीएन से जुड़ा है, तो: का उपयोग करता है "Sys::Hostname"
(वर्क्स अगर Sys::Hostname एक समाधान योग्य होस्ट नाम के साथ आता है)

use Sys::Hostname; 
use Socket; 
my($addr)=inet_ntoa((gethostbyname(hostname))[4]); 
print "$addr\n"; 
+0

ये भी अच्छे समाधान हैं जो सभी मामलों में काम नहीं करेंगे।यदि कोई बेहतर समाधान नहीं है तो मैं इन्हें जोड़कर एक कस्टम समाधान तैयार करूंगा। धन्यवाद। – Zizzencs

1

मैं IO::Interface लिनक्स और सोलारिस के साथ अच्छे सफलता मिली है, और मुझे लगता है कि यह और भी AIX पर काम किया लेकिन मुझे यकीन के लिए याद नहीं आ रहा। Search.cpan.org, rt.cpan.org और ActiveState की विभिन्न साइटों पर चारों ओर पोकिंग, ऐसा लगता है कि आईओ :: इंटरफेस विंडोज़ पर बिल्डिंग समस्याएं अनुभव कर रहा है। मुझे लगता है कि यह उपलब्ध है कि यह उपलब्ध है, पीपीएम में आईओ-इंटरफेस की तलाश करना है।

2

perldoc है एक answer to this question in its FAQ ("perlfaq9") - विभिन्न मॉड्यूल (जो मानक पुस्तकालय के हिस्से हैं) या यहां तक ​​कि एक अंतर्निहित फ़ंक्शन का उपयोग।

0

नेट :: पता :: आईपी :: स्थानीय ठीक काम करता है, लेकिन जब से मूल पोस्टर सभी स्थानीय पते के लिए पूछता है, मुझे लगता है कि यह एक है बेहतर:

http://www.perlmonks.org/?node_id=166951

यह मेरे लिए ठीक काम किया विंडोज एक्सपी के लिए ActivePerl के साथ।

13

मेरे मामले में, मुझे बिना किसी गैर-मूल निर्भरताओं के समाधान की आवश्यकता है। मैं नेट :: पता :: आईपी :: स्थानीय में कोड के अध्ययन के बाद इस के साथ आया था:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use IO::Socket::INET; 

my $local_ip_address = get_local_ip_address(); 

print "$local_ip_address\n"; 

# This idea was stolen from Net::Address::IP::Local::connected_to() 
sub get_local_ip_address { 
    my $socket = IO::Socket::INET->new(
     Proto  => 'udp', 
     PeerAddr => '198.41.0.4', # a.root-servers.net 
     PeerPort => '53', # DNS 
    ); 

    # A side-effect of making a socket connection is that our IP address 
    # is available from the 'sockhost' method 
    my $local_ip_address = $socket->sockhost; 

    return $local_ip_address; 
} 

get_local_ip_address()Net::Address::IP::Local->public_ipv4 रूप में एक ही स्ट्रिंग लौटना चाहिए।

यदि वांछित है, तो आप स्थानीय DNS सर्वर पर PeerAddr विशेषता (आईओ :: सॉकेट :: आईएनईटी के लिए कन्स्ट्रक्टर के तर्कों में तर्क बदल सकते हैं) बदल सकते हैं।

+0

-1 कॉपी/पेस्ट के रूप में पर्ल के साथ विकास का अनुशंसित तरीका नहीं है। – dolmen

+1

@ डॉल्मैन सहमत हैं। अगर यह मेरे मामले में बिल्कुल मदद करता है, तो मैंने लिखी लिपि को क्रॉन जॉब के रूप में इस्तेमाल किया था, जिसे DNS रिकॉर्ड्स को सक्रिय रखने के लिए विकास बॉक्स में तैनात किया गया था। अगर मैंने इसे फिर से संशोधित किया है, तो मैं [fatpacking] (https://metacpan.org/module/fatpack) नेट :: पता :: आईपी :: स्थानीय रूप से स्क्रिप्ट में स्थानीय मानता हूं। > = डी –

+3

@ डॉल्मेन -1 पर आसान। इस तरह की चीज उन लोगों की मदद करती है जो पर्ल से परिचित नहीं हैं और बस इसे पूरा करना चाहते हैं। – pelesl

5

सभी इंटरफेस के आईपी पते को पुनः प्राप्त करने के लिए, IO::Interface::Simple का उपयोग करें:

perl -MIO::Interface::Simple '-Esay $_->address for grep { $_->is_running && defined $_->address } IO::Interface::Simple->interfaces' 

आप 127.0.0.1 (लूपबैक) में कोई दिलचस्पी नहीं हैं, तो आप $_->is_loopback पर फ़िल्टर कर सकते हैं।

0

खिड़कियों के लिए मैं

foreach (split(/\r?\n/,`netstat -r`)) 
{ 
    next unless /^\s+0.0.0.0/; 
    @S = split(/\s+/); 
    # $S[3] = Default Gateway 
    # $S[4] = Main IP 
} 

पहली पंक्ति का उपयोग शुरू करने 0.0.0.0 डिफ़ॉल्ट गेटवे है। शायद कई गेटवे हो सकते हैं। 255.255.255.255 से शुरू होने वाली रेखाएं भी उपयोगी हैं। netstat -r और मार्ग प्रिंट एक ही हैं।

ओएसएक्स, लिनक्स के लिए अनुकूलित किया जा सकता है इतना उपयोगी नहीं है।

0

मैंने इन लिनक्स कमांड का संयोजन किया है, इसलिए किसी भी पर्ल मॉड्यूल पर निर्भरता नहीं है।

hostname -i 
hostname -I 
ls /sys/class/net 
ip -f inet addr show eth0| grep -Po 'inet \K[\d.]+' 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^