PHP कैसे स्थानीय आईपी प्रणाली प्राप्त करने के लिए


96

मुझे 192 जैसे कंप्यूटर के स्थानीय आईपी प्राप्त करने की आवश्यकता है। * .... क्या यह PHP के साथ संभव है?

मुझे स्क्रिप्ट चलाने वाले सिस्टम के आईपी पते की आवश्यकता है, लेकिन मुझे बाहरी आईपी की आवश्यकता नहीं है, मुझे उसके स्थानीय नेटवर्क कार्ड पते की आवश्यकता है।

जवाबों:


111

सीएलआई से

PHP <5.3.0

$localIP = getHostByName(php_uname('n'));

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
यह वह समाधान है जो मेरे लिए काम करता है और जो गोले, ऑपरेटिंग सिस्टम कमांड और सभी प्रकार के सामान को कॉल करने से बचता है जो बाद में सुरक्षा छेद खोल सकते हैं या विषम मुद्दों को उठा सकते हैं।
डारियो फुमगल्ली

1
सर्वश्रेष्ठ प्रतिक्रिया आमतौर पर सादगी के साथ आती है। उसके जैसा।
m3nda

1
@ andras.tim मुझे सरल उत्तर पसंद हैं, हालांकि जब मैंने आपकी स्क्रिप्ट चलाई तो यह मेरी मशीन का IP पता नहीं लौटा रहा है, यह मेरे वर्चुअल मशीन में उपयोग किए गए IP पते को वापस कर रहा है..क्या समस्या हो सकती है?
स्कारल

बस जागरूक रहें, यह दृष्टिकोण DNS पर निर्भर करता है जो सिस्टम के होस्टनाम पर सेट है, जो सही तरीके से हल हो रहा है। हमेशा ऐसा नहीं होगा।
जस्टिन मैकएलेर

3
क्लाउड होस्टिंग वातावरण में, यह अपेक्षित परिणाम नहीं दे सकता है। क्योंकि प्रत्येक मेजबान के पास 2 से अधिक आईपी हैं।
यूनिक्सअगैन

60
$_SERVER['SERVER_ADDR']

13
स्पष्टीकरण: एक कंप्यूटर में कई आईपी पते हो सकते हैं। यह चर HTTP-केवल है और इसमें IP पता होता है जो वर्चुअल होस्ट पर चल रहा है। यह देखते हुए कि प्रश्न कितना अस्पष्ट है, यह कहना मुश्किल है कि क्या यह अपेक्षित उत्तर है।
अलवारो गोंजालेज

मुझे लगता है कि यह सही है, क्योंकि आपको हमेशा असाइन किए गए आईपी की आवश्यकता होती है, जो आपको जवाब दे रहा है। यदि नहीं, तो आपको @ andras.tim के asnwers का उपयोग करना होगा, क्योंकि आपको सिस्टम का मुख्य आईपी बताता है।
m3nda

यह वही है जो मैं चाहता था, क्योंकि मेरे सर्वर लोड बैलेंसर के पीछे हैं, ताकि getHostNameसाइटों का डोमेन नाम वापस न आए।
Yep_It's_Me

यदि आप एक
डॉक

30

यह एक पुरानी पोस्ट है, लेकिन इसे इसके साथ प्राप्त करें:

function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }

उदाहरण के लिए:

die( getLocalIp() );

इसे किसी अन्य साइट पर मिला, ट्रिम कमांड को न हटाएं क्योंकि अन्यथा आपको कंप्यूटर का नाम मिल जाएगा।

BACKTICKS (विशेष उद्धरण): यह काम करता है क्योंकि PHP एक "कमांड के रूप में" विशेष उद्धरणों (बैकटिक्स) के बीच जो कुछ भी है उसे चलाने का प्रयास करेगा और परिणामी आउटपुट लौटाएगा।

gethostbyname(trim(`hostname`));

करने की तुलना में बहुत समान (लेकिन बहुत अधिक कुशल) है:

$exec = exec("hostname"); //the "hostname" is a valid command in both windows and linux
$hostname = trim($exec); //remove any spaces before and after
$ip = gethostbyname($hostname); //resolves the hostname using local hosts resolver or DNS

7
@ अंपुल: विशेष उद्धरणों के कारण, जब आप सामान्य उद्धरणों का उपयोग करते हैं तो यह किसी कारण से काम नहीं करता है और जब आप ट्रिम कमांड को हटाते हैं तो यह भी काम नहीं करता है। अजीब लगता है मुझे पता है। उसके लिए उत्तर को नीचा दिखाना अच्छा नहीं है। जवाब पढ़ें।
कोडबीट

2
Backticks (`) को PHP में निष्पादन ऑपरेटर कहा जाता है। पहले कोड ब्लॉक में आपका कार्य निष्पादन कमांड के समान ही होता है। PHP
क्रिस्टियान

2
वास्तव में सबसे अच्छा विचार नहीं है। gethostbynameहोस्ट मशीन के लिए लूपबैक आईपी (जैसे 127.0.0.1) लौटना संभव और मान्य है ।
कोई नहीं

2
इससे मुझे बहुत मदद मिली, मुझे लगा कि $ _SERVER ['REMOTE_ADDR'] जैसे सरल PHP फ़ंक्शन होंगे ; जो काम नहीं किया, लेकिन इस समाधान मेरे लिए काम किया !!!
पीनी चेइनी

24

यह प्रयास करें (यदि आपका सर्वर लिनक्स है):

$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;

9
बिल्कुल ठीक नहीं। eth0उचित इंटरफ़ेस है इसकी कोई गारंटी नहीं है।
कोई नहीं

धन्यवाद, यह मेरे लिए पूरी तरह से काम किया। इंटरफ़ेस सेट करने में सक्षम होने के नाते मदद की!
रहीम खोआ

मेरे मामले में (वाईफाई स्थानीय नेटवर्क में स्थानीय आईपी) मुझे अपने सिस्टम (fr_FR) पर उपयोग किए जाने वाले लोकेल के कारण संभवतः के wlan0बजाय eth0और के 'inet addr:'साथ निर्दिष्ट करना था 'inet adr:'। इसके अलावा, यह जवाब वह उपाय था जिसकी मुझे तलाश थी। धन्यवाद!
Niavlys

वास्तव 'inet adr:'में मेरे टर्मिनल (फ्रेंच लोकेल) में काम किया, लेकिन PHP स्क्रिप्ट 'inet addr:'में सही मूल्य (अंग्रेजी लोकेल, मुझे लगता है) था।
Niavlys

20

स्थानीय मशीन का डिफ़ॉल्ट बाहरी IP पता इस तरह प्राप्त किया जा सकता है:

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock, "8.8.8.8", 53);
socket_getsockname($sock, $name); // $name passed by reference

$localAddr = $name;

यह काम किस प्रकार करता है:

चूंकि यह UDP है, socket_connectइसलिए नेटवर्क पर नहीं जाता है। यह केवल सॉकेट में एक स्थानीय पता और पोर्ट असाइन करता है। यह हमें स्थानीय पता प्राप्त करने की अनुमति देता है।

यह समाधान बिना किसी नेटवर्क ट्रैफ़िक, DNS, या कमांड निष्पादन के काम करता है।

अगर कोई मार्ग नहीं है तो यह काम नहीं कर सकता है 8.8.8.8(जैसे आपके पास कोई इंटरनेट कनेक्शन नहीं है)।


3
यह उत्तर दूसरों की तुलना में बेहतर है। $ _SERVER सरणी पर कोई भी निर्भरता अपाचे के तहत चलने पर निर्भर है। यह विचार क्रोन जॉब पर भी काम करता है। मैं इसका उपयोग केवल कुछ कार्यों को निष्पादित करने के लिए कर रहा हूं यदि कोई सर्वर स्टेजिंग या प्रोडक्शन लैन पर चल रहा है। उत्तम!
प्रति

यह एक ग्यारह उत्तर है। मैंने डॉक कंटेनरों में अपने होस्ट का आईपी प्राप्त करने के लिए $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
डॉक

यह अधिक पोर्टेबल है मुझे लगता है। इसके अलावा, यह उल्लेख socketsकरना महत्वपूर्ण है कि पीएचपी पर मॉड्यूल को स्थापित और सक्षम किया जाना चाहिए।
फैबियो मोंटेफुस्कोलो

हाँ, थैंक्यू वेरी @ अरनौद ले ब्लांक, मेरे लिए बहुत उपयोगी है, मुझे इस तकनीक के साथ अपना आईपी पता मिला
आबिद अली

यह वही है जिसकी मुझे तलाश है। धन्यवाद!
जॉर्ज़

15

निर्भर करता है कि आप स्थानीय द्वारा क्या मतलब है:

यदि स्थानीय द्वारा आप PHP कोड को निष्पादित करने वाले सर्वर / सिस्टम के पते का मतलब है, तो चर्चा करने के लिए अभी भी दो रास्ते हैं। यदि PHP एक वेब सर्वर के माध्यम से चलाया जा रहा है, तो आप सर्वर पते को पढ़कर प्राप्त कर सकते हैं $_SERVER['SERVER_ADDR']। यदि PHP एक कमांड लाइन इंटरफेस के माध्यम से चलाया जा रहा है, तो आपको संभवतः शेल-एक्ज़ीक्यूट ipconfig(विंडोज) / ifconfig(* nix) और एड्रेस को grep करना होगा।

यदि स्थानीय रूप से आपका मतलब वेबसाइट विज़िटर के रिमोट एड्रेस से है, लेकिन उनके बाहरी आईपी पते से नहीं है (क्योंकि आपने विशेष रूप से 192. * कहा है), तो आप भाग्य से बाहर हैं। NAT रूटिंग का पूरा बिंदु उस पते को छिपाना है। आप एक आईपी पते के पीछे अलग-अलग कंप्यूटरों के स्थानीय पते की पहचान नहीं कर सकते हैं, लेकिन कुछ चालें (उपयोगकर्ता एजेंट, संभवतः मैक पता) हैं जो एक ही आईपी से कई कंप्यूटरों तक पहुँचने में अंतर करने में मदद कर सकती हैं।


1
और अंतिम लेकिन कम से कम नहीं, ipconfig / ifconfig सबसे अधिक संभावना कई आईपी पते लौटाएगा: क्योंकि एक कंप्यूटर में आमतौर पर एक भी पता नहीं होता है। बहुत बढ़िया जवाब।
अलवारो गोंजालेज

हाँ NAT का पूरा बिंदु स्थानीय IP को छुपाने के लिए है, अब whatismyip.com देखें कि वे आपके आंतरिक आईपी पते को जानते हैं, इस वेबसाइट को अपने मोबाइल का उपयोग करके भी खोलें, वे आपके मोबाइलों के स्थानीय आईपी पते को भी जानते हैं। संपादित करें: Im JioFi राउटर का उपयोग कर रहा है, मोबाइल पर एंड्रॉइड 9 AOSP पर आधारित मोबाइल डेटा का उपयोग करके रोम
ऋषभ गुसाईं

10

होस्टनाम (1) आईपी पते को बता सकता है: hostname --ip-addressया जैसा कि आदमी कहता है, इसका उपयोग करना बेहतर हैhostname --all-ip-addresses


6

आप लिनक्स होस्ट पर CLI में नियमित उपयोगकर्ता के रूप में यह कोशिश कर सकते हैं:

function get_local_ipv4() {
  $out = split(PHP_EOL,shell_exec("/sbin/ifconfig"));
  $local_addrs = array();
  $ifname = 'unknown';
  foreach($out as $str) {
    $matches = array();
    if(preg_match('/^([a-z0-9]+)(:\d{1,2})?(\s)+Link/',$str,$matches)) {
      $ifname = $matches[1];
      if(strlen($matches[2])>0) {
        $ifname .= $matches[2];
      }
    } elseif(preg_match('/inet addr:((?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3})\s/',$str,$matches)) {
      $local_addrs[$ifname] = $matches[1];
    }
  }
  return $local_addrs;
}

$addrs = get_local_ipv4();
var_export($addrs);

आउटपुट:

array (
  'eth0' => '192.168.1.1',
  'eth0:0' => '192.168.2.1',
  'lo' => '127.0.0.1',
  'vboxnet0' => '192.168.56.1',
)

array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )मुझे यह मिल गया। मैंने इस कोड को php फाइल में जोड़ा,
स्ट्रॉ हैट

अच्छा जवाब, थैंक्स। split()फ़ंक्शन को 5.3.0.0 के रूप में परिभाषित किया गया है। इसलिए explode()इसके बजाय सुझाव का उपयोग करें
थानू

4
$localIP = gethostbyname(trim(exec("hostname")));

मैंने विंडोज पीसी में कोशिश की और इसका काम किया और यह भी सोचा कि क्या यह लिनक्स पर काम करेगा।


4

यह बहुत सरल है और ऊपर दिए गए उत्तर जटिल चीजें हैं। बस आप इस विधि का उपयोग करके स्थानीय और सार्वजनिक दोनों आईपी पते प्राप्त कर सकते हैं।

   <?php 
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;

$localIp = gethostbyname(gethostname());
echo $localIp;

?>

2

यह आसान है। आप इस सरल कोड द्वारा होस्ट नाम प्राप्त कर सकते हैं।

$ip = getHostByName(getHostName());

या आप $_SERVER['HTTP_HOST']hostname प्राप्त करने के लिए भी उपयोग कर सकते हैं ।


1

मैंने सर्वर-साइड php (लिनक्स टर्मिनल से चल रहा है) के लिए इस सवाल से फिड किया

मैंने 'ifconfig' में विस्फोट किया और इसे IP पते पर ट्रिम कर दिया।

यह रहा:

$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];

और निश्चित रूप से 'wlan0' को अपने इच्छित नेटवर्क डिवाइस में बदलें।

मेरा आउटपुट है:

192.168.1.5

0

यदि आप OS X पर देव वातावरण में हैं, तो Wifi से जुड़े:

echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF रूट के सापेक्ष मौजूदा स्क्रिप्ट का फ़ाइल नाम लौटाता है

  • SERVER_PROTOCOL पृष्ठ-अनुरोधित प्रोटोकॉल का नाम और संशोधन लौटाता है

  • REQUEST_METHOD पृष्ठ तक पहुँचने के लिए उपयोग की गई अनुरोध विधि लौटाता है

  • DOCUMENT_ROOT उस रूट डायरेक्टरी को लौटाता है जिसके तहत वर्तमान स्क्रिप्ट निष्पादित हो रही है


जो भी पूछा गया था, वह सब सच है, लेकिन सभी पूरी तरह से अप्रासंगिक है। -1।
मार्क अमेरी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.