PHP yerel sistem IP'si nasıl alınır


96

192. * Gibi bir bilgisayarın yerel IP'sini almam gerekiyor .... Bu PHP ile mümkün mü?

Betiği çalıştıran sistemin IP adresine ihtiyacım var, ancak harici IP'ye ihtiyacım yok, yerel ağ kartı adresine ihtiyacım var.

Yanıtlar:


112

CLI'den

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
Bu, benim için işe yarayan ve mermileri, işletim sistemi komutlarını ve güvenlik açıklarını açabilecek veya daha sonra tuhaf sorunları ortaya çıkarabilecek her türlü şeyi çağırmaktan kaçınan çözümdür.
Dario Fumagalli

1
En iyi yanıt genellikle basitlikle gelir. Bunun gibi.
m3nda

1
@ andras.tim Basit cevapları severim, ancak betiğinizi çalıştırdığımda makinemin IP adresini döndürmüyor, sanal makinemde kullanılan IP adresini döndürüyor ... Yine de sorun ne olabilir?
Scarl

sadece unutmayın, bu yaklaşım DNS'nin sistemin ana bilgisayar adı ne ayarlanmışsa onu doğru şekilde çözmesine dayanır. bu her zaman böyle olmayacak.
Justin McAleer

3
Bulut barındırma ortamında bu, beklenen sonucu vermeyebilir. Çünkü her ana bilgisayarın 2'den fazla IP'si vardır.
UnixAgain

60
$_SERVER['SERVER_ADDR']

13
Açıklama: bir bilgisayarın birkaç IP adresi olabilir. Bu değişken yalnızca HTTP'dir ve sanal ana bilgisayarın çalıştığı IP adresini içerir. Sorunun ne kadar belirsiz olduğu düşünüldüğünde, beklenen cevabın bu olup olmadığını söylemek zor.
Álvaro González

Bunun doğru olduğunu düşünüyorum, çünkü her zaman atanmış ip'e ihtiyacınız var, biri size cevap veriyor. Değilse, @ andras.tim'in asnwers'ını kullanmalısınız, çünkü size sistemin ana ipini söyler.
m3nda

Bu tam olarak istediğim şeydi, çünkü sunucularım bir yük dengeleyicinin arkasında getHostNameolduğundan sitelerin alan adını döndürmüyor.
Yep_It's_Me

Docker container içinde çalışıyorsanız bu işe yaramaz
Freedo

31

Bu eski bir gönderi, ancak şununla anla:

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

Örneğin:

die( getLocalIp() );

Başka bir sitede buldunuz, trim komutunu kaldırmayın, aksi takdirde bilgisayar adını alırsınız.

BACKTICKS (Özel tırnaklar): PHP bu "özel tırnaklar" (ters işaretler) arasındaki her şeyi bir kabuk komutu olarak çalıştırmaya çalıştığı ve sonuçta ortaya çıkan çıktıyı döndürdüğü için çalışır.

gethostbyname(trim(`hostname`));

Aşağıdakileri yapmaktan çok benzer (ancak çok daha etkilidir):

$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: Özel tırnaklar nedeniyle, normal tırnak kullandığınızda herhangi bir nedenle çalışmıyor ve trim komutunu kaldırdığınızda bile çalışmıyor. Kulağa garip geliyor biliyorum. Bunun cevabını olumsuz olarak değerlendirmek hoş değil. Cevabı okuyun.
Codebeat

2
Ters işaretler (`) PHP'de yürütme operatörü olarak adlandırılır. İlk kod bloğunda yaptığınız şey, exec komutuyla neredeyse aynıdır. Bkz. PHP: Yürütme Operatörleri - Kılavuz
Christiaan

2
Pek iyi fikir değil. gethostbynameAna makine için bir geri döngü IP'si (ör. 127.0.0.1) döndürmek mümkündür ve geçerlidir .
kimse

2
Bu bana çok yardımcı oldu, $ _SERVER ['REMOTE_ADDR'] gibi basit bir PHP işlevi olacağını düşündüm ; bu işe yaramadı, ancak bu çözüm benim için çalıştı !!!
Pini Cheyni

24

bunu deneyin (sunucunuz Linux ise):

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

9
Kesinlikle doğru değil. eth0Uygun arayüzün garantisi yoktur .
kimse

Teşekkürler, bu benim için mükemmel çalıştı. Arayüzü ayarlayabilmek yardımcı oldu!
Rahim Hoca

(Yerel IP WiFi yerel ağda) Benim durumumda ben belirtmek zorunda wlan0yerine eth0ve yerine 'inet addr:'birlikte 'inet adr:'muhtemelen sistemimde (fr_FR) üzerinde kullanılan yerele. Onun dışında aradığım çözüm bu cevaptı. Teşekkürler!
Niavlys

Aslında 'inet adr:'benim terminalimde (fransızca yerel ayarı) çalıştı, ancak PHP betiğinde 'inet addr:'doğru değer vardı (İngilizce yerel ayarı, sanırım).
Niavlys

22

Yerel makinenin varsayılan harici IP adresi şu şekilde elde edilebilir:

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

Nasıl çalışır:

Bu UDP olduğu socket_connectiçin ağa çıkmaz. Sokete yalnızca yerel bir adres ve bağlantı noktası atar. Bu, yerel adresi almamızı sağlar.

Bu çözüm, herhangi bir ağ trafiği, DNS veya komut yürütme olmadan çalışır.

Giden yol yoksa çalışmayabilir 8.8.8.8(örneğin internet bağlantınız yok).


3
Bu cevap diğerlerinden ÇOK daha iyidir. $ _SERVER dizisine herhangi bir bağımlılık, bunun Apache altında çalışmasına bağlıdır. Bu fikir aynı zamanda bir cron işinde de işe yarar. Bunu yalnızca bir sunucu aşamalandırma veya üretim LAN'ı üzerinde çalışıyorsa belirli işlevleri yürütmek için kullanıyorum. Mükemmel!
Başına

Bu zarif bir cevap. $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
Docker

Sanırım daha taşınabilir. Ayrıca, socketsmodülün PHP'ye yüklenmesi ve etkinleştirilmesi gerektiğini belirtmek önemlidir .
Fabio Montefuscolo

evet, çok teşekkür ederim @Arnaud Le Blanc, benim için çok yararlı, bu teknikle IP adresimi aldım
Abid Ali

15

Yerel derken ne demek istediğine bağlı:

Yerel derken PHP kodunu çalıştıran sunucunun / sistemin adresini kastediyorsanız, o zaman tartışılacak iki yol vardır. PHP bir web sunucusu üzerinden çalıştırılıyorsa, okuyarak sunucu adresini alabilirsiniz $_SERVER['SERVER_ADDR']. PHP bir komut satırı arabirimi üzerinden çalıştırılıyorsa, muhtemelen kabuğu çalıştırmanız ipconfig(Windows) / ifconfig(* nix) ve adresi grep etmeniz gerekir .

Yerel derken web sitesi ziyaretçisinin uzak adresini kastediyorsanız, ancak harici IP adresini değil (özellikle 192. * dediğinizden beri), o zaman şansınız yok demektir. NAT yönlendirmesinin tüm amacı bu adresi gizlemektir. Bir IP adresinin arkasındaki bireysel bilgisayarların yerel adreslerini tanımlayamazsınız, ancak aynı IP'den erişen birden fazla bilgisayar olup olmadığını ayırt etmeye yardımcı olabilecek bazı hileler (kullanıcı aracısı, muhtemelen mac adresi) vardır.


1
Son olarak, ipconfig / ifconfig, büyük olasılıkla birkaç IP adresi döndürecektir: çünkü normalde bir bilgisayarın tek bir adresi yoktur. Mükemmel cevap.
Álvaro González

evet NAT'ın tüm amacı yerel IP'yi gizlemek şimdi whatismyip.com'a bakın dahili ip adresinizi biliyorlar, ayrıca bu web sitesini cep telefonunuzla açıyorlar, cep telefonunuzun yerel ip adresini de biliyorlar. DÜZENLEME: Android 9 AOSP Tabanlı rom'da mobil verileri kullanarak mobil imde JioFi Router kullanıyorum
Rishabh Gusain

10

hostname (1) IP adresini söyleyebilir: hostname --ip-addressveya adamın dediği gibi, kullanmak daha iyidirhostname --all-ip-addresses


6

Bunu Linux ana bilgisayarında CLI'de normal kullanıcı olarak deneyebilirsiniz:

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

Çıktı:

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', )Bunu anladım. Bu kodu php dosyasına ekledim
Straw Hat

Güzel cevap, teşekkürler. split()işlev PHP 5.3.0'dan itibaren KULLANIMDAN KALDIRILMIŞTIR. explode()onun yerine kullanmayı önerin
Thanu

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

Windows pc'de denedim ve çalıştı ve ayrıca Linux üzerinde çalışacağını düşünüyorum.


4

Çok basit ve yukarıdaki cevaplar işleri karmaşıklaştırıyor. Basitçe bu yöntemi kullanarak hem yerel hem de genel ip adreslerini alabilirsiniz.

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

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

?>

2

Kolay biridir. Ana bilgisayar adını bu basit kodla alabilirsiniz.

$ip = getHostByName(getHostName());

Veya $_SERVER['HTTP_HOST']ana bilgisayar adını almak için de kullanabilirsiniz .


1

Sunucu tarafı php için bu soruyla uğraştım (Linux terminalinden çalışan)

'İfconfig'i patlattım ve IP adresine indirdim.

İşte burada:

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

Ve tabii ki 'wlan0'ı istediğiniz ağ cihazına değiştirin.

Çıktım:

192.168.1.5

0

Wifi ile bağlı OS X üzerinde bir geliştirme ortamındaysanız:

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

0
$_SERVER['SERVER_NAME']

Benim için çalıştı.


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF Kök ile göreli yol ile mevcut betiğin dosya adını döndürür

  • SERVER_PROTOCOL Sayfanın talep ettiği protokolün adını ve revizyonunu verir

  • REQUEST_METHOD Sayfaya erişmek için kullanılan istek yöntemini döndürür

  • DOCUMENT_ROOT Geçerli betiğin altında çalıştığı kök dizini döndürür


Hepsi doğru, ama aynı zamanda sorulan soruyla tamamen alakasız. -1.
Mark Amery

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.