PHP come ottenere l'IP locale del sistema


96

Devo ottenere l'IP locale del computer come 192. * .... È possibile con PHP?

Ho bisogno dell'indirizzo IP del sistema che esegue lo script, ma non ho bisogno dell'IP esterno, ho bisogno dell'indirizzo della sua scheda di rete locale.

Risposte:


111

Dalla CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
Questa è la soluzione che ha funzionato per me e che evita di chiamare shell, comandi del sistema operativo e ogni sorta di cose che possono aprire falle di sicurezza o sollevare problemi strani in seguito.
Dario Fumagalli

1
La migliore risposta di solito arriva con la semplicità. Come quello.
m3nda

1
@ andras.tim Mi piacciono le risposte semplici, tuttavia quando ho eseguito il tuo script non restituisce l'indirizzo IP della mia macchina, ma restituisce l'indirizzo IP utilizzato nella mia macchina virtuale .. quale potrebbe essere il problema però?
Scarl

basta essere consapevoli, questo approccio si basa sul DNS che risolve correttamente qualunque sia il nome host del sistema impostato. non sarà sempre così.
Justin McAleer

3
Nell'ambiente di hosting cloud, questo potrebbe non restituire il risultato atteso. Perché ogni host ha più di 2 IP.
UnixAgain

60
$_SERVER['SERVER_ADDR']

13
Chiarimento: un computer può avere diversi indirizzi IP. Questa variabile è solo HTTP e contiene l'indirizzo IP su cui è in esecuzione l'host virtuale. Considerando quanto sia vaga la domanda, è difficile dire se questa sia la risposta attesa.
Álvaro González

Penso che sia corretto, perché hai sempre bisogno dell'ip assegnato, quello ti sta rispondendo. In caso contrario, devi usare gli asnwers di @ andras.tim, perché ti dice l'ip principale del sistema.
m3nda

Questo è esattamente quello che volevo, perché i miei server sono dietro un bilanciatore del carico, quindi getHostNamenon restituisce il nome di dominio del sito.
Yep_It's_Me

Questo non funziona se
esegui

30

Questo è un vecchio post, ma prendilo con questo:

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

Per esempio:

die( getLocalIp() );

Trovato su un altro sito, non rimuovere il comando trim perché altrimenti otterrai il nome del computer.

BACKTICK (Le virgolette speciali): Funziona perché PHP tenterà di eseguire qualunque cosa si trovi tra quelle "virgolette speciali" (apici inversi) come comando di shell e restituirà l'output risultante.

gethostbyname(trim(`hostname`));

È molto simile (ma molto più efficiente) rispetto a:

$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: a causa delle virgolette speciali, quando usi le virgolette normali non funziona per qualche motivo e quando rimuovi il comando trim non funziona nemmeno. Suona strano, lo so. Non è bello sottovalutare la risposta per questo. Leggi la risposta.
Codebeat

2
I backtick (`) sono chiamati l'operatore di esecuzione in PHP. Quello che stai facendo nel primo blocco di codice è quasi lo stesso del comando exec. Vedere PHP: Execution Operators - Manual
Christiaan

2
Non proprio l'idea migliore. È possibile e valido per gethostbynamerestituire un IP di loopback (es. 127.0.0.1) per la macchina host.
nessuno

2
Questo mi aiuta molto, ho pensato che ci sarebbe stata una semplice funzione PHP come $ _SERVER ['REMOTE_ADDR']; che non ha funzionato, ma questa soluzione ha funzionato per me !!!
Pini Cheyni

24

prova questo (se il tuo server è Linux):

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

9
Non perfettamente corretto. Non vi è alcuna garanzia che eth0l'interfaccia appropriata.
nessuno

Grazie, ha funzionato perfettamente per me. Essere in grado di impostare l'interfaccia ha aiutato!
Rahim Khoja

Nel mio caso (IP locale nella rete locale WiFi) ho dovuto specificare al wlan0posto di eth0e sostituire 'inet addr:'con 'inet adr:', forse a causa della locale utilizzata sul mio sistema (fr_FR). Oltre a questo, questa risposta era la soluzione che stavo cercando. Grazie!
Niavlys

In realtà 'inet adr:'funzionava bene nel mio terminale (locale francese), ma nello script PHP 'inet addr:'era il valore corretto (locale inglese, immagino).
Niavlys

20

L'indirizzo IP esterno predefinito della macchina locale può essere ottenuto in questo modo:

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

Come funziona:

Poiché questo è UDP, socket_connectnon esce sulla rete. Assegna solo un indirizzo locale e una porta al socket. Questo ci permette di ottenere l'indirizzo locale.

Questa soluzione funziona senza alcun traffico di rete, DNS o esecuzione di comandi.

Potrebbe non funzionare se non esiste un percorso verso 8.8.8.8(ad esempio, non si dispone di una connessione Internet).


3
Questa risposta è MOLTO migliore delle altre. Qualsiasi dipendenza dall'array $ _SERVER dipende da questo in esecuzione in Apache. Questa idea funziona anche su un cron job. Lo sto usando per eseguire solo determinate funzioni se un server è in esecuzione sulla LAN di staging o di produzione. Perfetto!
Per

Questa è una risposta elegante. L'ho adattato in uno script che gestisce i container docker per ottenere l'ip del mio host sulla rete $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
docker

È più portatile immagino. Inoltre, è importante menzionare che il socketsmodulo deve essere installato e abilitato su PHP.
Fabio Montefuscolo

sì, grazie mille @Arnaud Le Blanc, è molto utile per me, ho ottenuto il mio indirizzo IP con questa tecnica
Abid Ali

questo è quello che sto cercando. Grazie!
Jorz,

15

Dipende da cosa intendi per locale:

Se per locale intendi l'indirizzo del server / sistema che esegue il codice PHP, ci sono ancora due strade da discutere. Se PHP viene eseguito tramite un server Web, è possibile ottenere l'indirizzo del server leggendo $_SERVER['SERVER_ADDR']. Se PHP viene eseguito tramite un'interfaccia a riga di comando, è probabile che sia necessario eseguire la shell ipconfig(Windows) /ifconfig (* nix) e estrarre l'indirizzo.

Se per locale intendi l'indirizzo remoto del visitatore del sito web, ma non il suo indirizzo IP esterno (dato che hai detto specificamente 192. *), allora sei sfortunato. Lo scopo del routing NAT è nascondere quell'indirizzo. Non è possibile identificare gli indirizzi locali dei singoli computer dietro un indirizzo IP, ma ci sono alcuni trucchi (agente utente, possibilmente indirizzo mac) che possono aiutare a distinguere se ci sono più computer che accedono dallo stesso IP.


1
E, ultimo ma non meno importante, ipconfig / ifconfig molto probabilmente restituirà diversi indirizzi IP: perché un computer normalmente non ha un unico indirizzo. Bella risposta.
Álvaro González

sì, l'intero punto del NAT è nascondere l'IP locale ora controlla whatismyip.com conoscono il tuo indirizzo IP interno, apri anche questo sito Web utilizzando il tuo cellulare, conoscono anche l'indirizzo IP locale del tuo cellulare. EDIT: Sto usando JioFi Router, su cellulare im usando dati mobili su Android 9 AOSP basato rom
Rishabh Gusain

10

hostname (1) può dire l'indirizzo IP:, hostname --ip-addresso come dice man, è meglio usarehostname --all-ip-addresses


6

Puoi provare questo come utente normale nella CLI sull'host 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);

Produzione:

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', )Ho capito. Ho aggiunto questo codice nel file php,
Cappello di paglia

Buona risposta, grazie. split()la funzione è stata DEPRECATA a partire da PHP 5.3.0. quindi suggerisci di usare explode()invece
Thanu

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

Ho provato su PC Windows e ha funzionato e penso anche che funzionerà su Linux.


4

È molto semplice e soprattutto le risposte complicano le cose. Semplicemente puoi ottenere indirizzi IP sia locali che pubblici usando questo metodo.

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

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

?>

2

È facile. Puoi ottenere il nome host con questo semplice codice.

$ip = getHostByName(getHostName());

Oppure puoi anche usare $_SERVER['HTTP_HOST']per ottenere il nome host.


1

Ho giocherellato con questa domanda per un php lato server (in esecuzione dal terminale Linux)

Ho esploso "ifconfig" e l'ho ridotto all'indirizzo IP.

Ecco qui:

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

E ovviamente cambia "wlan0" nel dispositivo di rete desiderato.

Il mio output è:

192.168.1.5

0

Se ti trovi in ​​un ambiente di sviluppo su OS X, connesso tramite Wifi:

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

0
$_SERVER['SERVER_NAME']

Ha funzionato per me.


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF Restituisce il nome del file dello script corrente con il percorso relativo alla radice

  • SERVER_PROTOCOL Restituisce il nome e la revisione del protocollo richiesto dalla pagina

  • REQUEST_METHOD Restituisce il metodo di richiesta utilizzato per accedere alla pagina

  • DOCUMENT_ROOT Restituisce la directory principale in cui viene eseguito lo script corrente


Tutto vero, ma anche del tutto irrilevante rispetto alla domanda che veniva posta. -1.
Mark Amery

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.