PHP comment obtenir l'adresse IP locale du système

96

J'ai besoin d'obtenir l'adresse IP locale de l'ordinateur comme 192. * .... Est-ce possible avec PHP?

J'ai besoin de l'adresse IP du système exécutant le script, mais je n'ai pas besoin de l'adresse IP externe, j'ai besoin de l'adresse de sa carte réseau locale.

air
la source

Réponses:

111

Depuis CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());

andras.tim
la source
2
C'est la solution qui a fonctionné pour moi et qui évite d'appeler des shells, des commandes du système d'exploitation et toutes sortes de choses qui peuvent ouvrir des failles de sécurité ou soulever des problèmes étranges plus tard.
Dario Fumagalli
1
La meilleure réponse vient généralement avec la simplicité. Comme ça.
m3nda
1
@ andras.tim J'aime les réponses simples, mais quand j'ai exécuté votre script, il ne renvoie pas l'adresse IP de ma machine, il renvoie l'adresse IP utilisée dans ma machine virtuelle ... quel pourrait être le problème?
Scarl
soyez juste conscient, cette approche repose sur la résolution correcte du DNS quel que soit le nom d'hôte du système. ce ne sera pas toujours le cas.
Justin McAleer du
3
Dans un environnement d'hébergement cloud, cela peut ne pas renvoyer le résultat attendu. Parce que chaque hôte a plus de 2 IP.
UnixAgain
60
$_SERVER['SERVER_ADDR']
Sergey Eremin
la source
13
Précision: un ordinateur peut avoir plusieurs adresses IP. Cette variable est uniquement HTTP et contient l'adresse IP sur laquelle l'hôte virtuel s'exécute. Étant donné le caractère vague de la question, il est difficile de dire si c'est la réponse attendue.
Álvaro González
Je pense que c'est correct, car vous avez toujours besoin de l'adresse IP attribuée, celle qui vous répond. Sinon, vous devez utiliser asnwers @ andras.tim, car vous indique l'adresse IP principale du système.
m3nda
C'est exactement ce que je voulais, car mes serveurs sont derrière un équilibreur de charge et getHostNamene renvoie donc pas le nom de domaine du site.
Yep_It's_Me
Cela ne fonctionne pas si vous utilisez un conteneur docker
Freedo
30

Ceci est un ancien message, mais obtenez-le avec ceci:

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

Par exemple:

die( getLocalIp() );

Trouvé sur un autre site, ne supprimez pas la commande trim car sinon vous obtiendrez le nom de l'ordinateur.

BACKTICKS (Les guillemets spéciaux): Cela fonctionne parce que PHP tentera d'exécuter tout ce qui se trouve entre ces "guillemets spéciaux" (backticks) comme une commande shell et renvoie le résultat obtenu.

gethostbyname(trim(`hostname`));

Est très similaire (mais beaucoup plus efficace) que de faire:

$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
la source
7
@paul: En raison des guillemets spéciaux, lorsque vous utilisez des guillemets normaux, cela ne fonctionne pas pour une raison quelconque et lorsque vous supprimez la commande Trim, cela ne fonctionne même pas. Cela semble bizarre je sais. Il n'est pas agréable de voter contre la réponse à cela. Lisez la réponse.
Codebeat
2
Les backticks (`) sont appelés l'opérateur d'exécution en PHP. Ce que vous faites dans le premier bloc de code est presque identique à la commande exec. Voir PHP: Execution Operators - Manual
Christiaan
2
Pas vraiment la meilleure idée. Il est possible et valide gethostbynamede renvoyer une adresse IP de bouclage (par exemple 127.0.0.1) pour la machine hôte.
personne
2
Cela m'aide beaucoup, je pensais qu'il y aurait une simple fonction PHP comme $ _SERVER ['REMOTE_ADDR']; qui n'a pas fonctionné, mais cette solution a fonctionné pour moi !!!
Pini Cheyni
24

essayez ceci (si votre serveur est Linux):

$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
George Deac
la source
9
Pas tout à fait raison. Il n'y a aucune garantie que eth0l'interface appropriée.
personne
Merci, cela a parfaitement fonctionné pour moi. Être capable de définir l'interface a aidé!
Rahim Khoja
Dans mon cas (IP locale dans le réseau local WiFi), j'ai dû spécifier à la wlan0place eth0et remplacer 'inet addr:'par 'inet adr:', probablement en raison de la locale utilisée sur mon système (fr_FR). A part ça, cette réponse était la solution que je recherchais. Merci!
Niavlys
Eh bien en fait 'inet adr:'fonctionné dans mon terminal (langue française), mais dans le script PHP 'inet addr:'était la valeur correcte (locale anglaise, je suppose).
Niavlys
20

L'adresse IP externe par défaut de la machine locale peut être obtenue comme ceci:

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

Comment ça fonctionne:

Puisque c'est UDP, socket_connectne sort pas sur le réseau. Il attribue uniquement une adresse et un port locaux au socket. Cela nous permet d'obtenir l'adresse locale.

Cette solution fonctionne sans trafic réseau, DNS ou exécution de commande.

Cela peut ne pas fonctionner s'il n'y a pas d'itinéraire vers 8.8.8.8(par exemple, vous n'avez pas de connexion Internet).

Arnaud Le Blanc
la source
3
Cette réponse est bien meilleure que les autres. Toute dépendance vis-à-vis du tableau $ _SERVER dépend de son exécution sous Apache. Cette idée fonctionne également sur un travail cron. Je ne l'utilise que pour exécuter certaines fonctions si un serveur s'exécute sur le réseau de transfert ou de production. Parfait!
Per
C'est une réponse élégante. Je l'ai adapté dans un script gérant les conteneurs docker pour obtenir l'ip de mon hôte sur le réseau docker:$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
FatherShawn
C'est plus portable, je suppose. En outre, il est important de mentionner que le socketsmodule doit être installé et activé sur PHP.
Fabio Montefuscolo
oui, merci beaucoup @Arnaud Le Blanc, c'est très utile pour moi, j'ai obtenu mon adresse IP avec cette technique
Abid Ali
c'est ce que je recherche. Merci!
Jorz le
15

Cela dépend de ce que vous entendez par local:

Si par local vous entendez l'adresse du serveur / système exécutant le code PHP, alors il y a encore deux pistes à discuter. Si PHP est exécuté via un serveur Web, vous pouvez obtenir l'adresse du serveur en lisant $_SERVER['SERVER_ADDR']. Si PHP est exécuté via une interface de ligne de commande, vous devrez probablement exécuter le shell ipconfig(Windows) / ifconfig(* nix) et extraire l'adresse.

Si par local, vous entendez l'adresse distante du visiteur du site Web, mais pas son adresse IP externe (puisque vous avez spécifiquement dit 192. *), alors vous n'avez pas de chance. L'intérêt du routage NAT est de cacher cette adresse. Vous ne pouvez pas identifier les adresses locales des ordinateurs individuels derrière une adresse IP, mais il existe quelques astuces (agent utilisateur, éventuellement adresse mac) qui peuvent aider à différencier s'il y a plusieurs ordinateurs accédant à partir de la même IP.

Fosco
la source
1
Enfin, ipconfig / ifconfig renverra probablement plusieurs adresses IP: car un ordinateur n'a normalement pas une seule adresse. Très bonne réponse.
Álvaro González
oui, tout l'intérêt de NAT est de masquer l'adresse IP locale maintenant consultez whatismyip.com ils connaissent votre adresse IP interne, ouvrez également ce site Web en utilisant votre mobile, ils connaissent également l'adresse IP locale de votre mobile. EDIT: J'utilise JioFi Router, sur mobile, j'utilise des données mobiles sur Android 9 AOSP Based rom
Rishabh Gusain
10

hostname (1) peut indiquer l'adresse IP:, hostname --ip-addressou comme le dit l'homme, il vaut mieux utiliserhostname --all-ip-addresses

ern0
la source
6

Vous pouvez essayer ceci en tant qu'utilisateur régulier dans la CLI sur l'hôte Linux:

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

Production:

array (
  'eth0' => '192.168.1.1',
  'eth0:0' => '192.168.2.1',
  'lo' => '127.0.0.1',
  'vboxnet0' => '192.168.56.1',
)
ab1965
la source
array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )J'ai ça. J'ai ajouté ce code dans un fichier php,
Chapeau de paille
Bonne réponse, merci. split()La fonction a été obsolète depuis PHP 5.3.0. alors suggérez d'utiliser à la explode()place
Thanu
4
$localIP = gethostbyname(trim(exec("hostname")));

J'ai essayé sur PC Windows et cela a fonctionné et je pense également que cela fonctionnera sous Linux.

Pratik Boda
la source
4

C'est très simple et les réponses ci-dessus compliquent les choses. Vous pouvez simplement obtenir des adresses IP locales et publiques en utilisant cette méthode.

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

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

?>
Chinthaka Devinda
la source
2

C'est facile. Vous pouvez obtenir le nom d'hôte par ce simple code.

$ip = getHostByName(getHostName());

Ou vous pouvez également utiliser $_SERVER['HTTP_HOST']pour obtenir le nom d'hôte.

Kowsigan Atsayam
la source
1

J'ai tripoté cette question pour un php côté serveur (fonctionnant à partir d'un terminal Linux)

J'ai explosé 'ifconfig' et l'ai réduit à l'adresse IP.

C'est ici:

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

Et bien sûr, remplacez «wlan0» par le périphérique réseau souhaité.

Ma sortie est:

192.168.1.5
Gonen
la source
0

Si vous êtes dans un environnement de développement sur OS X, connecté via Wifi:

echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");
gpupo
la source
0
$_SERVER['SERVER_NAME']

Cela a fonctionné pour moi.

Titan
la source
-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF Renvoie le nom de fichier du script courant avec le chemin relatif à la racine

  • SERVER_PROTOCOL Renvoie le nom et la révision du protocole demandé par la page

  • REQUEST_METHOD Renvoie la méthode de requête utilisée pour accéder à la page

  • DOCUMENT_ROOT Renvoie le répertoire racine sous lequel le script actuel s'exécute

user2301590
la source
Tout est vrai, mais aussi tout à fait sans rapport avec la question qui a été posée. -1.
Mark Amery
-6

Essaye ça

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