PHP como obtener la IP local del sistema


96

Necesito obtener la IP local de una computadora como 192. * .... ¿Es esto posible con PHP?

Necesito la dirección IP del sistema que ejecuta el script, pero no necesito la IP externa, necesito la dirección de su tarjeta de red local.

Respuestas:


111

Desde CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
Esta es la solución que funcionó para mí y que evita llamar shells, comandos del sistema operativo y todo tipo de cosas que pueden abrir agujeros de seguridad o plantear problemas extraños más adelante.
Dario Fumagalli

1
La mejor respuesta suele venir con simplicidad. Como eso.
m3nda

1
@ andras.tim Me gustan las respuestas simples, sin embargo, cuando ejecuté su script, no devuelve la dirección IP de mi máquina, está devolviendo la dirección IP utilizada en mi máquina virtual ... ¿Cuál podría ser el problema?
Scarl

solo tenga en cuenta que este enfoque se basa en que el DNS resuelva correctamente cualquiera que sea el nombre de host del sistema. ese no siempre será el caso.
Justin McAleer

3
En un entorno de alojamiento en la nube, es posible que esto no devuelva el resultado esperado. Porque cada host tiene más de 2 IP.
UnixAgain

60
$_SERVER['SERVER_ADDR']

13
Aclaración: una computadora puede tener varias direcciones IP. Esta variable es solo HTTP y contiene la dirección IP en la que se ejecuta el host virtual. Dado lo vaga que es la pregunta, es difícil decir si esta es la respuesta esperada.
Álvaro González

Creo que esto es correcto, porque siempre necesitas la ip asignada, la que te está respondiendo. Si no es así, debes usar las respuestas de @ andras.tim, porque te dice la ip principal del sistema.
m3nda

Esto es exactamente lo que quería, porque mis servidores están detrás de un equilibrador de carga, por lo getHostNameque no devuelve el nombre de dominio del sitio.
Yep_It's_Me

Esto no funciona si está ejecutando dentro de un contenedor
Docker

30

Esta es una publicación antigua, pero consígala con esto:

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

Por ejemplo:

die( getLocalIp() );

Lo encontré en otro sitio, no elimine el comando de recorte porque de lo contrario obtendrá el nombre de la computadora.

BACKTICKS (Las comillas especiales): funciona porque PHP intentará ejecutar lo que sea que esté entre esas "comillas especiales" (comillas inversas) como un comando de shell y devuelve la salida resultante.

gethostbyname(trim(`hostname`));

Es muy similar (pero mucho más eficiente) que hacer:

$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: Debido a las comillas especiales, cuando usa comillas normales, no funciona por alguna razón y cuando elimina el comando trim, ni siquiera funciona. Suena raro, lo sé. No es bueno rechazar la respuesta a eso. Lee la respuesta.
Codebeat

2
Las comillas invertidas (`) se denominan operador de ejecución en PHP. Lo que haces en el primer bloque de código es casi lo mismo que con el comando exec. Ver PHP: Operadores de ejecución - Manual
Christiaan

2
Realmente no es la mejor idea. Es posible y válido para gethostbynamedevolver una IP de bucle invertido (por ejemplo, 127.0.0.1) para la máquina host.
nadie

2
Esto me ayudó mucho, pensé que habría una función PHP simple como $ _SERVER ['REMOTE_ADDR']; que no funcionó, pero esta solución funcionó para mí !!!
Pini Cheyni

24

intente esto (si su servidor es Linux):

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

9
No del todo correcto. No hay garantía de que eth0sea ​​la interfaz adecuada.
nadie

Gracias, esto funcionó perfectamente para mí. ¡Poder configurar la interfaz ayudó!
Rahim Khoja

En mi caso (IP local en la red local WiFi) tuve que especificar en wlan0lugar de eth0y reemplazar 'inet addr:'con 'inet adr:', posiblemente debido a la configuración regional utilizada en mi sistema (fr_FR). Aparte de eso, esta respuesta fue la solución que estaba buscando. ¡Gracias!
Niavlys

Bueno, en realidad 'inet adr:'funcionó en mi terminal (configuración regional francesa), pero en el script PHP 'inet addr:'estaba el valor correcto (configuración regional en inglés, supongo).
Niavlys

20

La dirección IP externa predeterminada de la máquina local se puede obtener así:

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

Cómo funciona:

Dado que es UDP, socket_connectno se conecta a la red. Solo asigna una dirección local y un puerto al socket. Esto nos permite obtener la dirección local.

Esta solución funciona sin tráfico de red, DNS o ejecución de comandos.

Puede que no funcione si no hay una ruta hacia 8.8.8.8(por ejemplo, no tiene conexión a Internet).


3
Esta respuesta es MUCHO mejor que las demás. Cualquier dependencia de la matriz $ _SERVER depende de que se ejecute en Apache. Esta idea también funciona en un trabajo cron. Lo estoy usando para ejecutar solo ciertas funciones si un servidor se está ejecutando en la fase de prueba o en la LAN de producción. ¡Perfecto!
Per

Esta es una respuesta elegent. Lo $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
adapté

Es más portátil, supongo. Además, es importante mencionar que el socketsmódulo debe estar instalado y habilitado en PHP.
Fabio Montefuscolo

sí, muchas gracias @Arnaud Le Blanc, es muy útil para mí, obtuve mi dirección IP con esta técnica
Abid Ali

esto es lo que estoy buscando. ¡Gracias!
Jorz

15

Depende de lo que quieras decir con local:

Si por local te refieres a la dirección del servidor / sistema que ejecuta el código PHP, aún quedan dos vías por discutir. Si PHP se ejecuta a través de un servidor web, puede obtener la dirección del servidor leyendo $_SERVER['SERVER_ADDR']. Si PHP se está ejecutando a través de una interfaz de línea de comandos, entonces probablemente tendrá que ejecutar shell ipconfig(Windows) / ifconfig(* nix) y extraer la dirección.

Si por local te refieres a la dirección remota del visitante del sitio web, pero no a su dirección IP externa (ya que dijiste específicamente 192. *), entonces no tienes suerte. El objetivo del enrutamiento NAT es ocultar esa dirección. No puede identificar las direcciones locales de computadoras individuales detrás de una dirección IP, pero hay algunos trucos (agente de usuario, posiblemente dirección mac) que pueden ayudar a diferenciar si hay varias computadoras accediendo desde la misma IP.


1
Y por último, pero no menos importante, ipconfig / ifconfig probablemente devolverá varias direcciones IP: porque una computadora normalmente no tiene una sola dirección. Gran respuesta.
Álvaro González

sí, el objetivo de NAT es ocultar la IP local, ahora echa un vistazo a whatismyip.com. Ellos conocen tu dirección IP interna, también abren este sitio web usando tu móvil. Ellos también conocen la dirección IP local de tu móvil. EDITAR: Estoy usando el enrutador JioFi, en el móvil estoy usando datos móviles en la rom basada en Android 9 AOSP
Rishabh Gusain

10

hostname (1) puede indicar la dirección IP:, hostname --ip-addresso como dice el hombre, es mejor usarhostname --all-ip-addresses


6

Puede intentar esto como usuario habitual en CLI en un 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);

Salida:

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', )Tengo esto. Agregué este código en un archivo php,
Straw Hat

Buena respuesta, gracias. split()La función ha sido DEPRECADA a partir de PHP 5.3.0. sugiera usar en su explode()lugar
Thanu

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

Lo intenté en una PC con Windows y funcionó y también creo que funcionará en Linux.


4

Es muy simple y las respuestas anteriores están complicando las cosas. Simplemente puede obtener direcciones IP locales y públicas utilizando este método.

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

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

?>

2

Es fácil. Puede obtener el nombre de host con este simple código.

$ip = getHostByName(getHostName());

O también puede usar $_SERVER['HTTP_HOST']para obtener el nombre de host.


1

Jugué con esta pregunta para un php del lado del servidor (que se ejecuta desde la terminal de Linux)

Exploté 'ifconfig' y lo reduje a la dirección IP.

Aquí está:

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

Y, por supuesto, cambie 'wlan0' a su dispositivo de red deseado.

Mi salida es:

192.168.1.5

0

Si está en un entorno de desarrollo en OS X, conectado a través de Wifi:

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


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF Devuelve el nombre de archivo del script actual con la ruta relativa a la raíz

  • SERVER_PROTOCOL Devuelve el nombre y la revisión del protocolo solicitado por la página.

  • REQUEST_METHOD Devuelve el método de solicitud utilizado para acceder a la página.

  • DOCUMENT_ROOT Devuelve el directorio raíz en el que se está ejecutando el script actual.


Todo cierto, pero también completamente irrelevante para la pregunta que se hizo. -1.
Mark Amery

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.