PHP cara mendapatkan IP lokal sistem


96

Saya perlu mendapatkan IP lokal komputer seperti 192. * .... Apakah ini mungkin dengan PHP?

Saya perlu alamat IP sistem menjalankan skrip, tetapi saya tidak memerlukan IP eksternal, saya memerlukan alamat kartu jaringan lokalnya.

Jawaban:


111

Dari CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
Ini adalah solusi yang berhasil untuk saya dan yang menghindari shell panggilan, perintah sistem operasi, dan segala macam hal yang dapat membuka lubang keamanan atau menimbulkan masalah aneh nanti.
Dario Fumagalli

1
Tanggapan terbaik biasanya datang dengan kesederhanaan. Seperti itu.
m3nda

1
@ andras.tim Saya suka jawaban sederhana, namun ketika saya menjalankan skrip Anda, skrip tidak mengembalikan alamat IP mesin saya, tetapi mengembalikan alamat IP yang digunakan di mesin virtual saya .. apa masalahnya?
Scarl

perlu diketahui, pendekatan ini bergantung pada DNS yang menyelesaikan dengan benar apa pun nama host sistem yang disetel. itu tidak akan selalu terjadi.
Justin McAleer

3
Di lingkungan cloud hosting, ini mungkin tidak memberikan hasil yang diharapkan. Karena setiap host memiliki lebih dari 2 IP.
UnixAgain

60
$_SERVER['SERVER_ADDR']

13
Klarifikasi: sebuah komputer dapat memiliki beberapa alamat IP. Variabel ini hanya untuk HTTP dan berisi alamat IP tempat host virtual dijalankan. Mengingat betapa samar pertanyaannya, sulit untuk mengatakan apakah ini jawaban yang diharapkan.
Álvaro González

Saya pikir ini benar, karena Anda selalu membutuhkan ip yang diberi tanda, yang merespons Anda. Jika tidak, Anda harus menggunakan jawaban @ andras.tim, karena memberi tahu Anda ip utama sistem.
m3nda

Inilah yang saya inginkan, karena server saya berada di belakang penyeimbang beban sehingga getHostNametidak mengembalikan nama domain situs.
Yap_It's_Me

Ini tidak bekerja jika Anda menjalankan di dalam kontainer buruh pelabuhan
Freedo

30

Ini adalah posting lama, tapi dapatkan dengan ini:

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

Sebagai contoh:

die( getLocalIp() );

Ditemukan di situs lain, jangan hapus perintah trim karena jika tidak Anda akan mendapatkan nama komputer.

BACKTICKS (Tanda kutip khusus): Ini berfungsi karena PHP akan mencoba menjalankan apa pun di antara "tanda kutip khusus" (tanda kutip) itu sebagai perintah shell dan mengembalikan keluaran yang dihasilkan.

gethostbyname(trim(`hostname`));

Sangat mirip (tetapi jauh lebih efisien) daripada melakukan:

$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: Karena tanda kutip khusus, ketika Anda menggunakan tanda kutip normal, itu tidak berfungsi karena beberapa alasan dan ketika Anda menghapus perintah potong itu bahkan tidak berfungsi. Kedengarannya aneh, saya tahu. Tidak baik meremehkan jawaban untuk itu. Baca jawabannya.
Codebeat

2
Backticks (`) disebut operator eksekusi di PHP. Apa yang Anda lakukan di blok kode pertama hampir sama dengan perintah exec. Lihat PHP: Operator Eksekusi - Manual
Christiaan

2
Bukan ide terbaik. Dimungkinkan dan valid untuk gethostbynamemengembalikan IP loopback (misalnya 127.0.0.1) untuk mesin host.
tidak ada orang

2
Ini sangat membantu saya, saya pikir akan ada fungsi PHP sederhana seperti $ _SERVER ['REMOTE_ADDR']; yang tidak berhasil, tetapi solusi ini berhasil untuk saya !!!
Pini Cheyni

24

coba ini (jika server Anda adalah Linux):

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

9
Tidak sepenuhnya benar. Tidak ada jaminan eth0apakah antarmuka yang sesuai.
tidak ada orang

Terima kasih, ini bekerja dengan sempurna untuk saya. Mampu mengatur antarmuka membantu!
Rahim Khoja

Dalam kasus saya (IP lokal dalam jaringan lokal WiFi) saya harus menentukan wlan0bukannya eth0dan mengganti 'inet addr:'dengan 'inet adr:', mungkin karena lokal yang digunakan pada sistem saya (fr_FR). Selain itu, jawaban ini adalah solusi yang saya cari. Terima kasih!
Niavlys

Sebenarnya 'inet adr:'bekerja di terminal saya (lokal perancis), tetapi dalam skrip PHP 'inet addr:'adalah nilai yang benar (lokal bahasa Inggris, saya kira).
Niavlys

21

Alamat IP eksternal default dari mesin lokal dapat diperoleh seperti ini:

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

Bagaimana itu bekerja:

Karena ini UDP, socket_connecttidak keluar di jaringan. Ini hanya memberikan alamat lokal dan port ke soket. Ini memungkinkan kami untuk mendapatkan alamat lokal.

Solusi ini bekerja tanpa lalu lintas jaringan, DNS, atau eksekusi perintah.

Ini mungkin tidak berfungsi jika tidak ada rute ke 8.8.8.8(mis. Anda tidak memiliki koneksi internet).


3
Jawaban ini JAUH lebih baik dari yang lain. Ketergantungan apa pun pada array $ _SERVER bergantung pada operasi ini di bawah Apache. Ide ini juga berfungsi pada pekerjaan cron. Saya menggunakannya untuk hanya menjalankan fungsi tertentu jika server berjalan pada pementasan atau LAN produksi. Sempurna!
Per

Ini adalah jawaban yang bagus. Saya mengadaptasinya dalam skrip yang mengelola kontainer buruh pelabuhan untuk mendapatkan ip host saya di jaringan buruh pelabuhan:$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
FatherShawn

Sepertinya lebih portabel. Juga, penting untuk menyebutkan socketsmodul harus diinstal dan diaktifkan di PHP.
Fabio Montefuscolo

ya, terima kasih banyak @Arnaud Le Blanc, sangat membantu saya, saya mendapatkan alamat IP saya dengan teknik ini
Abid Ali

15

Tergantung apa yang Anda maksud dengan lokal:

Jika yang Anda maksud dengan lokal adalah alamat server / sistem yang menjalankan kode PHP, maka masih ada dua cara untuk didiskusikan. Jika PHP dijalankan melalui server web, Anda bisa mendapatkan alamat server dengan membaca $_SERVER['SERVER_ADDR']. Jika PHP dijalankan melalui antarmuka baris perintah, maka Anda mungkin harus menjalankan shell ipconfig(Windows) / ifconfig(* nix) dan menghapus alamatnya.

Jika yang Anda maksud dengan lokal adalah alamat jarak jauh pengunjung situs web, tetapi bukan alamat IP eksternal mereka (karena Anda secara khusus mengatakan 192. *), maka Anda kurang beruntung. Inti dari perutean NAT adalah menyembunyikan alamat itu. Anda tidak dapat mengidentifikasi alamat lokal masing-masing komputer di belakang alamat IP, tetapi ada beberapa trik (agen pengguna, mungkin alamat mac) yang dapat membantu membedakan jika ada beberapa komputer yang mengakses dari IP yang sama.


1
Dan yang tak kalah pentingnya, ipconfig / ifconfig kemungkinan besar akan mengembalikan beberapa alamat IP: karena komputer biasanya tidak memiliki satu alamat tunggal. Jawaban yang bagus.
Álvaro González

ya, inti dari NAT adalah untuk menyembunyikan IP lokal sekarang periksa whatismyip.com mereka tahu alamat ip internal Anda, juga buka situs web ini menggunakan ponsel Anda, mereka tahu alamat ip lokal ponsel Anda juga. EDIT: Saya menggunakan JioFi Router, di ponsel saya menggunakan data seluler pada rom berbasis Android 9 AOSP
Rishabh Gusain

10

hostname (1) dapat mengetahui alamat IP:, hostname --ip-addressatau seperti kata pria, lebih baik digunakanhostname --all-ip-addresses


6

Anda dapat mencoba ini sebagai pengguna biasa di CLI pada 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);

Keluaran:

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', )Saya mengerti. Saya menambahkan kode ini dalam file php,
Straw Hat

Jawaban yang bagus, terima kasih. split()fungsi telah DIHENTIKAN pada PHP 5.3.0. jadi sarankan untuk menggunakan explode()sebagai gantinya
Thanu

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

Saya mencoba di pc Windows dan itu berhasil dan juga berpikir bahwa akan bekerja di Linux.


4

Ini sangat sederhana dan jawaban di atas adalah hal-hal yang memperumit. Cukup Anda bisa mendapatkan alamat ip lokal dan publik menggunakan metode ini.

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

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

?>

2

Itu mudah. Anda bisa mendapatkan nama host dengan kode sederhana ini.

$ip = getHostByName(getHostName());

Atau Anda juga bisa menggunakan $_SERVER['HTTP_HOST']untuk mendapatkan nama host.


1

Saya mengotak-atik pertanyaan ini untuk php sisi server (berjalan dari terminal Linux)

Saya meledakkan 'ifconfig' dan memangkasnya ke alamat IP.

Ini dia:

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

Dan tentu saja ubah 'wlan0' ke perangkat jaringan yang Anda inginkan.

Output saya adalah:

192.168.1.5

0

Jika Anda berada dalam lingkungan pengembang di OS X, terhubung melalui Wifi:

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

0
$_SERVER['SERVER_NAME']

Itu berhasil untuk saya.


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF Mengembalikan nama file dari skrip saat ini dengan jalur yang berhubungan dengan root

  • SERVER_PROTOCOL Menampilkan nama dan revisi protokol yang diminta halaman

  • REQUEST_METHOD Mengembalikan metode permintaan yang digunakan untuk mengakses halaman

  • DOCUMENT_ROOT Mengembalikan direktori root tempat skrip saat ini dijalankan


Semua benar, tetapi juga semuanya sama sekali tidak relevan dengan pertanyaan yang ditanyakan. -1.
Mark Amery

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.