PHP como obter IP local do sistema


96

Preciso obter o IP local de um computador como 192. * .... Isso é possível com o PHP?

Preciso do endereço IP do sistema executando o script, mas não preciso do IP externo, preciso do endereço da placa de rede local dele.

Respostas:


111

De CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
Esta é a solução que funcionou para mim e que evita chamar shells, comandos do sistema operacional e todo tipo de coisa que pode abrir brechas de segurança ou levantar problemas estranhos mais tarde.
Dario Fumagalli

1
A melhor resposta geralmente vem com simplicidade. Curtiu isso.
m3nda

1
@ andras.tim Gosto de respostas simples, no entanto, quando executei o seu script, ele não retornou o endereço IP da minha máquina, mas sim o endereço IP usado na minha máquina virtual ... mas qual poderia ser o problema?
Scarl

Esteja ciente de que essa abordagem depende de o DNS resolver corretamente qualquer que seja o nome do host do sistema definido. nem sempre será esse o caso.
Justin McAleer

3
No ambiente de hospedagem em nuvem, isso pode não retornar o resultado esperado. Porque cada host possui mais de 2 IPs.
UnixAgain

60
$_SERVER['SERVER_ADDR']

13
Esclarecimento: um computador pode ter vários endereços IP. Esta variável é apenas HTTP e contém o endereço IP em que o host virtual está sendo executado. Dado o quão vaga é a pergunta, é difícil dizer se esta é a resposta esperada.
Álvaro González

Acho que está correto, pois você precisa sempre do ip atribuído, aquele que está respondendo. Caso contrário, você deve usar asnwers de @andras.tim, porque informa o ip principal do sistema.
m3nda

Isso é exatamente o que eu queria, porque meus servidores estão atrás de um balanceador de carga, portanto getHostName, não retorna o nome de domínio do site.
Yep_It's_Me

Isso não funciona se você estiver executando dentro de um contêiner docker
Freedo

30

Esta é uma postagem antiga, mas comece assim:

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

Por exemplo:

die( getLocalIp() );

Encontrado em outro site, não remova o comando trim, pois caso contrário, você obterá o nome dos computadores.

BACKTICKS (as aspas especiais): Funciona porque o PHP tentará executar o que quer que esteja entre as "aspas especiais" (crases) como um comando shell e retorna a saída resultante.

gethostbyname(trim(`hostname`));

É muito semelhante (mas muito mais eficiente) do que fazer:

$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: Por causa das aspas especiais, quando você usa aspas normais, isso não funciona por algum motivo e quando você remove o comando trim, ele nem funciona. Parece estranho, eu sei. Não é legal rebaixar a resposta para isso. Leia a resposta.
Codebeat

2
Críticas (`) são chamadas de operador de execução em PHP. O que você faz no primeiro bloco de código é quase igual ao do comando exec. Veja PHP: Execution Operators - Manual
Christiaan

2
Não é realmente a melhor ideia. É possível e válido gethostbynameretornar um IP de loopback (por exemplo, 127.0.0.1) para a máquina host.
ninguém

2
Isso me ajudou muito, pensei que haveria uma função PHP simples como $ _SERVER ['REMOTE_ADDR']; que não funcionou, mas essa solução funcionou para mim !!!
Pini Cheyni de

24

tente isto (se o seu servidor for Linux):

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

9
Não está absolutamente certo. Não há garantia de que eth0é a interface apropriada.
ninguém

Obrigado, isso funcionou perfeitamente para mim. Ser capaz de configurar a interface ajudou!
Rahim Khoja

No meu caso (IP local na rede local WiFi), tive que especificar em wlan0vez de eth0e substituir 'inet addr:'por 'inet adr:', possivelmente devido ao local usado em meu sistema (fr_FR). Fora isso, essa resposta era a solução que eu procurava. Obrigado!
Niavlys

Na verdade, 'inet adr:'funcionou bem no meu terminal (localidade francesa), mas no script PHP 'inet addr:'estava o valor correto (localidade inglês, eu acho).
Niavlys

20

O endereço IP externo padrão da máquina local pode ser obtido desta forma:

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

Como funciona:

Por ser UDP, socket_connectnão sai da rede. Ele apenas atribui um endereço local e uma porta ao soquete. Isso nos permite obter o endereço local.

Esta solução funciona sem nenhum tráfego de rede, DNS ou execução de comandos.

Pode não funcionar se não houver rota para 8.8.8.8(por exemplo, você não tem conexão com a Internet).


3
Esta resposta é MUITO melhor do que as outras. Qualquer confiança no array $ _SERVER depende desta execução no Apache. Essa ideia também funciona em um cron job. Estou usando-o para executar apenas certas funções se um servidor estiver sendo executado no teste ou na LAN de produção. Perfeito!
Per

Esta é uma resposta elegante. Eu o adaptei em um script gerenciando contêineres do docker para obter o ip do meu host na rede do docker:$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
FatherShawn

Acho que é mais portátil. Além disso, é importante mencionar que o socketsmódulo deve ser instalado e ativado no PHP.
Fabio Montefuscolo de

sim, muito obrigado @Arnaud Le Blanc, é muito útil para mim, consegui meu endereço IP com esta técnica
Abid Ali

é isso que estou procurando. obrigado!
Jorz

15

Depende do que você entende por local:

Se por local você quer dizer o endereço do servidor / sistema que executa o código PHP, ainda há dois caminhos a serem discutidos. Se o PHP está sendo executado por meio de um servidor da web, você pode obter o endereço do servidor lendo $_SERVER['SERVER_ADDR']. Se o PHP estiver sendo executado por meio de uma interface de linha de comando, você provavelmente terá que executar o shell ipconfig(Windows) / ifconfig(* nix) e executar o grep no endereço.

Se por local você quer dizer o endereço remoto do visitante do site, mas não seu endereço IP externo (já que você disse especificamente 192. *), então você está sem sorte. O objetivo do roteamento NAT é ocultar esse endereço. Você não pode identificar os endereços locais de computadores individuais por trás de um endereço IP, mas existem alguns truques (agente do usuário, possivelmente endereço mac) que podem ajudar a diferenciar se houver vários computadores acessando a partir do mesmo IP.


1
E por último, mas não menos importante, ipconfig / ifconfig provavelmente retornará vários endereços IP: porque um computador normalmente não tem um único endereço. Ótima resposta.
Álvaro González

sim, todo o objetivo do NAT é esconder o IP local agora verifique whatismyip.com eles sabem seu endereço IP interno, também abra este site usando seu celular eles sabem o endereço IP local de seus celulares também. EDITAR: Estou usando o roteador JioFi, no celular estou usando dados móveis no Android 9 baseado em AOSP rom
Rishabh Gusain

10

hostname (1) pode dizer o endereço IP:, hostname --ip-addressou como diz o homem, é melhor usarhostname --all-ip-addresses


6

Você pode tentar isso como um usuário regular na CLI no 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);

Resultado:

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', )Eu tenho esse. Eu adicionei este código em um arquivo php,
Chapéu de Palha

Boa resposta, obrigado. split()função foi DESCONTINUADA a partir do PHP 5.3.0. por isso sugiro usar explode()vez
Thanu

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

Tentei no pc com Windows e funcionou e também acho que funcionará no Linux para.


4

É muito simples e as respostas acima complicam as coisas. Simplesmente você pode obter endereços IP locais e públicos usando este método.

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

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

?>

2

É fácil. Você pode obter o nome do host por este código simples.

$ip = getHostByName(getHostName());

Ou você também pode usar $_SERVER['HTTP_HOST']para obter o nome do host.


1

Eu brinquei com esta questão para um php do lado do servidor (executando a partir de um terminal Linux)

Explodi 'ifconfig' e reduzi para o endereço IP.

Aqui está:

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

E, claro, mude 'wlan0' para o dispositivo de rede desejado.

Minha saída é:

192.168.1.5

0

Se você estiver em um ambiente dev no OS X, conectado via Wifi:

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

0
$_SERVER['SERVER_NAME']

Funcionou para mim


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF Retorna o nome do arquivo do script atual com o caminho relativo à raiz

  • SERVER_PROTOCOL Retorna o nome e a revisão do protocolo solicitado pela página

  • REQUEST_METHOD Retorna o método de solicitação usado para acessar a página

  • DOCUMENT_ROOT Retorna o diretório raiz sob o qual o script atual está sendo executado


Tudo verdade, mas também totalmente irrelevante para a pergunta que foi feita. -1.
Mark Amery

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.