wake-up-neo.com

PHP wie man die lokale IP des Systems erhält

Ich muss die lokale IP des Computers wie 192 erhalten. * .... Ist dies mit PHP möglich?

Ich benötige die IP-Adresse des Systems, auf dem das Skript ausgeführt wird, aber keine externe IP-Adresse. Ich benötige seine lokale Netzwerkkartenadresse.

84
air

Von CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());

100
andras.tim
$_SERVER['SERVER_ADDR']
55
Sergey Eremin

Dies ist ein alter Beitrag, aber holen Sie es sich mit diesem:

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

Beispielsweise:

die( getLocalIp() );

Haben Sie es auf einer anderen Site gefunden, entfernen Sie den Befehl trim nicht, da Sie sonst den Namen des Computers erhalten.

BACKTICKS (Die speziellen Anführungszeichen): Es funktioniert, weil PHP) versucht, alles, was zwischen diesen "speziellen Anführungszeichen" (Backticks) steht, als Shell-Befehl auszuführen, und die resultierende Ausgabe zurückgibt.

gethostbyname(trim(`hostname`));

Ist sehr ähnlich (aber viel effizienter) als:

$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
29
Codebeat

versuchen Sie dies (wenn Ihr Server Linux ist):

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

Die standardmäßige externe IP-Adresse des lokalen Computers kann folgendermaßen ermittelt werden:

$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;

Wie es funktioniert:

Da dies UDP ist, wird socket_connect Nicht im Netzwerk ausgeführt. Dem Socket werden nur eine lokale Adresse und ein lokaler Port zugewiesen. Auf diese Weise können wir die lokale Adresse ermitteln.

Diese Lösung funktioniert ohne Netzwerkverkehr, DNS oder Befehlsausführung.

Möglicherweise funktioniert es nicht, wenn es keine Route zu 8.8.8.8 Gibt (z. B. Sie haben keine Internetverbindung).

17
Arnaud Le Blanc

Kommt darauf an, was du mit lokal meinst:

Wenn mit lokal die Adresse des Servers/Systems gemeint ist, der den PHP= Code ausführt, dann gibt es noch zwei Möglichkeiten zu diskutieren. Wenn PHP) ausgeführt wird Wenn Sie einen Webserver haben, können Sie die Serveradresse durch Lesen von $_SERVER['SERVER_ADDR']. Wenn PHP über eine Befehlszeilenschnittstelle ausgeführt wird, müssten Sie wahrscheinlich ipconfig (Windows)/ifconfig (* nix) und greife nach der Adresse.

Wenn Sie mit lokal die Remoteadresse des Website-Besuchers meinen, aber nicht dessen externe IP-Adresse (da Sie ausdrücklich 192. * angegeben haben), haben Sie Pech. Der Sinn von NAT Routing ist es, diese Adresse zu verbergen. Sie können die lokalen Adressen einzelner Computer hinter einer IP-Adresse nicht identifizieren, aber es gibt einige Tricks (Benutzerprogramm, möglicherweise Mac-Adresse), die dies können Unterscheiden Sie, ob mehrere Computer von derselben IP-Adresse aus zugreifen.

15
Fosco

hostname (1) kann die IP-Adresse mitteilen: hostname --ip-address, oder wie man sagt, ist es besser, hostname --all-ip-addresses zu verwenden.

10
ern0

Sie können dies als normaler Benutzer in der CLI auf dem Linux-Host versuchen:

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

Ausgabe:

array (
  'eth0' => '192.168.1.1',
  'eth0:0' => '192.168.2.1',
  'lo' => '127.0.0.1',
  'vboxnet0' => '192.168.56.1',
)
6
ab1965
$localIP = gethostbyname(trim(exec("hostname")));

Ich habe es in Windows PC versucht und es hat funktioniert und denke auch, dass es unter Linux funktionieren wird.

4
Pratik Boda

Es ist sehr einfach und die obigen Antworten erschweren die Dinge. Mit dieser Methode können Sie einfach sowohl lokale als auch öffentliche IP-Adressen abrufen.

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

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

?>
1

Ich habe mit dieser Frage nach einer serverseitigen PHP-Version (die vom Linux-Terminal ausgeführt wird) herumgespielt.

Ich habe 'ifconfig' aufgelöst und auf die IP-Adresse reduziert.

Hier ist es:

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

Und natürlich ändern Sie 'wlan0' zu Ihrem gewünschten Netzwerkgerät.

Meine Ausgabe ist:

192.168.1.5
1
Gonen

Wenn Sie sich in einer Entwicklungsumgebung unter OS X befinden, die über WLAN verbunden ist:

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

Es ist einfach. Sie können den Hostnamen mit diesem einfachen Code ermitteln.

$ip = getHostByName(getHostName());

Oder Sie können auch $_SERVER['HTTP_Host'], um den Hostnamen zu erhalten.

0