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.

Luft
quelle

Antworten:

111

Von der CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());

andras.tim
quelle
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']
Sergey Eremin
quelle
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
Codebeat
quelle
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;
George Deac
quelle
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).

Arnaud Le Blanc
quelle
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.

Fosco
quelle
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

ern0
quelle
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',
)
ab1965
quelle
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.

Pratik Boda
quelle
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;

?>
Chinthaka Devinda
quelle
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.

Kowsigan Atsayam
quelle
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
Gonen
quelle
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");
gpupo
quelle
0
$_SERVER['SERVER_NAME']

Es hat bei mir funktioniert.

Titan
quelle
-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

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

Versuche dies

$localIP = gethostbyname(trim('hostname'));
matija kancijan
quelle