PHP, wie man die lokale IP des Systems erhält


96

Ich brauche eine lokale IP des Computers wie 192. * .... Ist das mit PHP möglich?

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

Antworten:


111

Von der CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
Dies ist die Lösung, die für mich funktioniert hat und die das Aufrufen von Shells, Betriebssystembefehlen und allerlei Dingen vermeidet, die später Sicherheitslücken öffnen oder seltsame Probleme aufwerfen können.
Dario Fumagalli

1
Die beste Antwort ist normalerweise einfach. So wie das.
m3nda

1
@ andras.tim Ich mag einfache Antworten, aber wenn ich Ihr Skript ausgeführt habe, gibt es nicht die IP-Adresse meines Computers zurück, sondern die in meiner virtuellen Maschine verwendete IP-Adresse. Was könnte das Problem sein?
Scarl

Beachten Sie jedoch, dass dieser Ansatz darauf beruht, dass DNS den Hostnamen des Systems korrekt auflöst. das wird nicht immer der Fall sein.
Justin McAleer

3
In einer Cloud-Hosting-Umgebung wird möglicherweise nicht das erwartete Ergebnis zurückgegeben. Weil jeder Host mehr als 2 IPs hat.
UnixAgain

60
$_SERVER['SERVER_ADDR']

13
Erläuterung: Ein Computer kann mehrere IP-Adressen haben. Diese Variable ist nur HTTP und enthält die IP-Adresse, unter der der virtuelle Host ausgeführt wird. Angesichts der Unbestimmtheit der Frage ist es schwer zu sagen, ob dies die erwartete Antwort ist.
Álvaro González

Ich denke das ist richtig, weil du immer die zugewiesene IP brauchst, die dir antwortet. Wenn nicht, müssen Sie die Antworten von @ andras.tim verwenden, da dies die Haupt-IP des Systems angibt.
m3nda

Dies ist genau das, was ich wollte, da sich meine Server hinter einem Load Balancer befinden und daher getHostNameden Domainnamen der Site nicht zurückgeben.
Yep_It's_Me

Dies funktioniert nicht, wenn Sie in einem Docker-Container laufen
Freedo

30

Dies ist ein alter Beitrag, aber verstehen Sie ihn damit:

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

Beispielsweise:

die( getLocalIp() );

Wenn Sie es auf einer anderen Site gefunden haben, entfernen Sie den Befehl trim nicht, da Sie sonst den Computernamen erhalten.

BACKTICKS (Die speziellen Anführungszeichen): Es funktioniert, weil PHP versucht, alles, was zwischen diesen "speziellen Anführungszeichen" (Backticks) liegt, 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

7
@paul: Aufgrund der speziellen Anführungszeichen funktioniert es aus irgendeinem Grund nicht, wenn Sie normale Anführungszeichen verwenden, und wenn Sie den Befehl trim entfernen, funktioniert es sogar nicht. Es klingt komisch, ich weiß. Es ist nicht schön, die Antwort darauf abzulehnen. Lesen Sie die Antwort.
Codebeat

2
Backticks (`) werden in PHP als Ausführungsoperator bezeichnet. Was Sie im ersten Codeblock tun, ist fast dasselbe wie der Befehl exec. Siehe PHP: Ausführungsoperatoren - Handbuch
Christiaan

2
Nicht wirklich die beste Idee. Es ist möglich und gültig gethostbyname, eine Loopback-IP (z. B. 127.0.0.1) für den Host-Computer zurückzugeben.
niemand

2
Das hilft mir sehr, ich dachte, es gäbe eine einfache PHP-Funktion wie $ _SERVER ['REMOTE_ADDR']; was nicht funktioniert hat, aber diese Lösung hat bei mir funktioniert !!!
Pini Cheyni

24

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;

9
Nicht absolut richtig. Es gibt keine Garantie eth0für die entsprechende Schnittstelle.
niemand

Danke, das hat bei mir perfekt funktioniert. Das Einstellen der Schnittstelle hat geholfen!
Rahim Khoja

In meinem Fall (lokale IP WiFi lokales Netzwerk) musste ich angeben wlan0statt eth0und zu ersetzen 'inet addr:'mit 'inet adr:', möglicherweise aufgrund der locale auf meinem System (fr_FR). Davon abgesehen war diese Antwort die Lösung, nach der ich gesucht habe. Vielen Dank!
Niavlys

Gut 'inet adr:'funktionierte eigentlich in meinem Terminal (französisches Gebietsschema), aber im PHP-Skript 'inet addr:'war der richtige Wert (englisches Gebietsschema, denke ich).
Niavlys

20

Die standardmäßige externe IP-Adresse des lokalen Computers kann wie folgt abgerufen 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, socket_connectgeht es nicht ins Netzwerk. Es wird dem Socket nur eine lokale Adresse und ein lokaler Port zugewiesen. Dadurch können wir die lokale Adresse erhalten.

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

Es funktioniert möglicherweise nicht, wenn es keine Route zu gibt 8.8.8.8(z. B. wenn Sie keine Internetverbindung haben).


3
Diese Antwort ist viel besser als die anderen. Jedes Vertrauen in das Array $ _SERVER hängt davon ab, dass es unter Apache ausgeführt wird. Diese Idee funktioniert auch bei einem Cron-Job. Ich verwende es, um bestimmte Funktionen nur auszuführen, wenn ein Server im Staging oder im Produktions-LAN ausgeführt wird. Perfekt!
Per

Dies ist eine elegante Antwort. Ich habe es in einem Skript angepasst, das Docker-Container verwaltet, um die IP meines Hosts im Docker-Netzwerk $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
abzurufen

Es ist tragbarer, denke ich. Es ist auch wichtig zu erwähnen, dass das socketsModul auf PHP installiert und aktiviert sein sollte.
Fabio Montefuscolo

Ja, vielen Dank @Arnaud Le Blanc, es ist sehr hilfreich für mich, ich habe meine IP-Adresse mit dieser Technik erhalten
Abid Ali

das ist was ich suche. Vielen Dank!
Jorz

15

Kommt darauf an, was du mit lokal meinst:

Wenn mit lokal die Adresse des Servers / Systems gemeint ist, auf dem der PHP-Code ausgeführt wird, gibt es noch zwei Möglichkeiten. Wenn PHP über einen Webserver ausgeführt wird, können Sie die Serveradresse durch Lesen abrufen $_SERVER['SERVER_ADDR']. Wenn PHP über eine Befehlszeilenschnittstelle ausgeführt wird, müssten Sie wahrscheinlich ipconfig(Windows) / ifconfig(* nix) unter Shell ausführen und die Adresse ermitteln.

Wenn mit lokal die Remote-Adresse des Website-Besuchers gemeint ist, nicht jedoch dessen externe IP-Adresse (da Sie ausdrücklich 192 * angegeben haben), haben Sie kein Glück. Der Sinn des NAT-Routings besteht darin, diese Adresse zu verbergen. Sie können die lokalen Adressen einzelner Computer hinter einer IP-Adresse nicht identifizieren. Es gibt jedoch einige Tricks (Benutzeragent, möglicherweise Mac-Adresse), mit denen Sie unterscheiden können, ob mehrere Computer von derselben IP-Adresse aus zugreifen.


1
Und zu guter Letzt gibt ipconfig / ifconfig höchstwahrscheinlich mehrere IP-Adressen zurück: weil ein Computer normalerweise keine einzige Adresse hat. Gute Antwort.
Álvaro González

Ja, der springende Punkt bei NAT ist, die lokale IP- Adresse zu verbergen. Überprüfen Sie jetzt whatismyip.com. Sie kennen Ihre interne IP-Adresse. Öffnen Sie diese Website auch mit Ihrem Handy. Sie kennen auch die lokale IP-Adresse Ihres Handys. BEARBEITEN: Ich benutze JioFi Router, auf dem Handy Ich benutze mobile Daten auf Android 9 AOSP Based Rom
Rishabh Gusain

10

Hostname (1) kann die IP-Adresse angeben: hostname --ip-addressoder wie der Mensch sagt, ist es besser, sie zu verwendenhostname --all-ip-addresses


6

Sie können dies als regulärer Benutzer in der CLI auf einem 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',
)

array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )Ich schaff das. Ich habe diesen Code in der PHP-Datei hinzugefügt,
Straw Hat

Gute Antwort, danke. split()Funktion wurde ab PHP 5.3.0 VERRINGERT. explode()
Schlagen Sie

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

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


4

Es ist sehr einfach und die obigen Antworten erschweren die Sache. 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;

?>

2

Es ist einfach. Sie können den Hostnamen durch diesen einfachen Code erhalten.

$ip = getHostByName(getHostName());

Sie können auch $_SERVER['HTTP_HOST']den Hostnamen abrufen.


1

Ich habe mit dieser Frage für ein serverseitiges PHP (läuft vom Linux-Terminal) herumgespielt.

Ich habe 'ifconfig' explodiert und auf die IP-Adresse gekürzt.

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' auf Ihr gewünschtes Netzwerkgerät.

Meine Ausgabe ist:

192.168.1.5

0

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
$_SERVER['SERVER_NAME']

Es hat bei mir funktioniert.


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF Gibt den Dateinamen des aktuellen Skripts mit dem Pfad relativ zum Stamm zurück

  • SERVER_PROTOCOL Gibt den Namen und die Revision des von der Seite angeforderten Protokolls zurück

  • REQUEST_METHOD Gibt die Anforderungsmethode zurück, die für den Zugriff auf die Seite verwendet wird

  • DOCUMENT_ROOT Gibt das Stammverzeichnis zurück, unter dem das aktuelle Skript ausgeführt wird


Alles wahr, aber auch alles völlig irrelevant für die gestellte Frage. -1.
Mark Amery

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.