Nasıl (CLI) PHP benim sunucusunun IP adresini bulurum

5 Cevap php

Kenara bariz (localhost, 127.0.0.1) PHP (komut satırı arayüzü!) Komut dosyası üzerinde çalıştığı bilgisayarın IP keşfetmek için bir mekanizma var mı?

Bu bir Web uygulaması değil gibi $_SERVER[*] çalışmaz - bu bir komut satırı betik.

TIA

5 Cevap

PHP <çalışıyorsanız 5.3, bu yardımcı olabilir (* NIX tabanlı sistemler en az on):

 mscharley@S04:~$ cat test.php
#!/usr/bin/env php
<?php

function getIPs($withV6 = true) {
    preg_match_all('/inet'.($withV6 ? '6?' : '').' addr: ?([^ ]+)/', `ifconfig`, $ips);
    return $ips[1];
}

$ips = getIPs();
var_dump($ips);

 mscharley@S04:~$ ./test.php
array(5) {
  [0]=>
  string(13) "72.67.113.141"
  [1]=>
  string(27) "fe80::21c:c0ff:fe4a:d09d/64"
  [2]=>
  string(13) "72.67.113.140"
  [3]=>
  string(9) "127.0.0.1"
  [4]=>
  string(7) "::1/128"
}
 mscharley@S04:~$

Sık sık bunu yapıyor tahmin yoksa ya, o zaman belki bu (sadece istismar değil) çalışacak:

$ip = file_get_contents('http://whatismyip.org/');

bu sunucunun IP adresini dönmelidir bu deneyin

$host= gethostname();
$ip = gethostbyname($host);

Bütün bunlardan başarısız olursa, sonuç her zaman exec ipconfig veya ifconfig, platforma bağlı olarak, ve ayrıştırmak.

Ben bu oldukça eski bir soru olduğunu biliyorum, ama kesin bir cevap olacaksa görünmüyor (olarak çok mümkün bir gibi.) I * NIX kutuları ve Win X hem de bu değeri belirlemek için bir ihtiyaç oldu kutuları. Ayrıca CLI idam komut dosyası gibi olmayan bir CLI komut. Aşağıdaki fonksiyonu insanların yılda konuştu olan farklı kavramlar üzerinde ödünç hangi, ben geldim en iyisidir. Belki bazı kullanım olabilir:

function getServerAddress() {
    if(isset($_SERVER["SERVER_ADDR"]))
    return $_SERVER["SERVER_ADDR"];
    else {
    // Running CLI
    if(stristr(PHP_OS, 'WIN')) {
        //  Rather hacky way to handle windows servers
        exec('ipconfig /all', $catch);
        foreach($catch as $line) {
        if(eregi('IP Address', $line)) {
            // Have seen exec return "multi-line" content, so another hack.
            if(count($lineCount = split(':', $line)) == 1) {
            list($t, $ip) = split(':', $line);
            $ip = trim($ip);
            } else {
            $parts = explode('IP Address', $line);
            $parts = explode('Subnet Mask', $parts[1]);
            $parts = explode(': ', $parts[0]);
            $ip = trim($parts[1]);
            }
            if(ip2long($ip > 0)) {
            echo 'IP is '.$ip."\n";
            return $ip;
            } else
            ; // TODO: Handle this failure condition.
        }
        }
    } else {
        $ifconfig = shell_exec('/sbin/ifconfig eth0');
        preg_match('/addr:([\d\.]+)/', $ifconfig, $match);
        return $match[1];
    }
    }
}