PHP 시스템의 로컬 IP를 얻는 방법


96

192. * ....와 같은 컴퓨터의 로컬 IP를 얻어야합니다. PHP로 가능합니까?

스크립트를 실행하는 시스템의 IP 주소가 필요하지만 외부 IP는 필요하지 않으며 로컬 네트워크 카드 주소가 필요합니다.

답변:


111

CLI에서

PHP 5.3.0 미만

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
이것은 나를 위해 일했으며 쉘, 운영 체제 명령 및 보안 허점을 열거 나 나중에 이상한 문제를 일으킬 수있는 모든 종류의 항목을 호출하지 않는 솔루션입니다.
Dario Fumagalli

1
최상의 응답은 일반적으로 단순함과 함께 제공됩니다. 그렇게.
m3nda 2014

1
@ andras.tim 나는 간단한 대답을 좋아하지만 스크립트를 실행하면 내 컴퓨터의 IP 주소가 반환되지 않고 내 가상 컴퓨터에서 사용 된 IP 주소가 반환됩니다. 그래도 문제가 무엇일까요?
Scarl

이 접근 방식은 DNS에 의존하여 시스템의 호스트 이름이 설정된 모든 것을 올바르게 확인합니다. 항상 그런 것은 아닙니다.
Justin McAleer jul.

3
클라우드 호스팅 환경에서는 예상 한 결과가 반환되지 않을 수 있습니다. 모든 호스트에는 2 개 이상의 IP가 있기 때문입니다.
UnixAgain 2016 년

60
$_SERVER['SERVER_ADDR']

13
설명 : 컴퓨터는 여러 IP 주소를 가질 수 있습니다. 이 변수는 HTTP 전용이며 가상 호스트가 실행중인 IP 주소를 포함합니다. 질문이 얼마나 모호한 지 감안할 때 이것이 예상되는 대답인지 말하기는 어렵습니다.
Álvaro González

나는 이것이 정확하다고 생각합니다. 왜냐하면 당신은 항상 asigned ip가 필요하기 때문입니다. 그렇지 않은 경우 @ andras.tim의 asnwers를 사용해야합니다. 시스템의 주요 IP를 알려주기 때문입니다.
m3nda 2014

내 서버가로드 밸런서 뒤에 있으므로 getHostName사이트 도메인 이름을 반환하지 않기 때문에 이것은 정확히 내가 원했던 것 입니다.
Yep_It's_Me

당신이 고정 표시기 컨테이너 내부에서 실행중인 경우이 작동하지 않습니다
Freedo

30

이것은 오래된 게시물이지만 다음과 같이 얻으십시오.

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

예를 들면 :

die( getLocalIp() );

다른 사이트에서 찾은 경우 trim 명령을 제거하지 마십시오. 그렇지 않으면 컴퓨터 이름을 얻게됩니다.

BACKTICKS (특수 따옴표) : PHP가 "특수 따옴표"(백틱) 사이에있는 모든 것을 쉘 명령으로 실행하고 결과 출력을 반환하기 때문에 작동합니다.

gethostbyname(trim(`hostname`));

다음을 수행하는 것과 매우 유사하지만 훨씬 더 효율적입니다.

$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 : 특수 따옴표로 인해 일반 따옴표를 사용하면 어떤 이유로 작동하지 않으며 trim 명령을 제거해도 작동하지 않습니다. 내가 아는 것이 이상하게 들린다. 그에 대한 대답에 반대표를 던지는 것은 좋지 않습니다. 답을 읽으십시오.
Codebeat 2013

2
백틱 (`)은 PHP에서 실행 연산자라고합니다. 첫 번째 코드 블록에서 수행하는 작업은 exec 명령과 거의 동일합니다. 참조 PHP : Execution Operators-Manual
Christiaan

2
정말 좋은 생각은 아닙니다. gethostbyname호스트 시스템에 대해 루프백 IP (예 : 127.0.0.1)를 반환하는 것이 가능하고 유효 합니다.
아무도

2
이것은 저에게 많은 도움이됩니다. $ _SERVER [ 'REMOTE_ADDR'] 과 같은 간단한 PHP 함수가있을 것이라고 생각했습니다 . 작동하지 않았지만이 솔루션은 저에게 효과적이었습니다 !!!
Pini Cheyni

24

이것을 시도하십시오 (서버가 Linux 인 경우) :

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

9
절대적으로 옳지 않습니다. eth0적절한 인터페이스라는 보장은 없습니다 .
아무도

고마워, 이것은 나를 위해 완벽하게 작동했습니다. 인터페이스를 설정할 수 있다는 것이 도움이되었습니다!
Rahim Khoja

필자의 경우 (WiFi 로컬 네트워크의 로컬 IP) wlan0대신에 지정 eth0하고으로 대체 'inet addr:'해야했습니다 'inet adr:'. 아마도 시스템에서 사용되는 로케일 (fr_FR) 때문일 수 있습니다. 그 외에는이 답변이 제가 찾던 해결책이었습니다. 감사!
Niavlys

실제로 'inet adr:'내 터미널 (프랑스어 로케일)에서 잘 작동했지만 PHP 스크립트 'inet addr:'에서는 올바른 값이었습니다 (영어 로케일, 제 생각에).
Niavlys

21

로컬 컴퓨터의 기본 외부 IP 주소는 다음과 같이 얻을 수 있습니다.

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

작동 원리 :

이것은 UDP이므로 socket_connect네트워크로 나가지 않습니다. 소켓에 로컬 주소와 포트만 할당합니다. 이를 통해 로컬 주소를 얻을 수 있습니다.

이 솔루션은 네트워크 트래픽, DNS 또는 명령 실행없이 작동합니다.

경로가 없으면 작동하지 않을 수 있습니다 8.8.8.8(예 : 인터넷에 연결되어 있지 않음).


3
이 답변은 다른 답변보다 낫습니다. $ _SERVER 배열에 대한 의존성은 Apache에서 실행되는 것에 의존합니다. 이 아이디어는 크론 작업에서도 작동합니다. 서버가 스테이징 또는 프로덕션 LAN에서 실행중인 경우에만 특정 기능을 실행하는 데 사용하고 있습니다. 완전한!

이것은 elegent 대답입니다. 도커 네트워크에서 내 호스트의 IP를 얻기 위해 도커 컨테이너를 관리하는 스크립트에서 수정했습니다.$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
FatherShawn

내가 생각하기에 더 휴대 성이 좋습니다. 또한 sockets모듈이 PHP에 설치되고 활성화되어야한다는 점 을 언급하는 것이 중요합니다 .
Fabio Montefuscolo

네, 감사합니다 나를위한 매우 도움이 @Arnaud 르 블랑 아주 많이, 나는이 기술 내 IP 주소를 가지고
아비드 알리

15

지역의 의미에 따라 다릅니다.

로컬로 PHP 코드를 실행하는 서버 / 시스템의 주소를 의미하는 경우 여전히 논의 할 두 가지 방법이 있습니다. PHP가 웹 서버를 통해 실행되는 경우을 읽어 서버 주소를 얻을 수 있습니다 $_SERVER['SERVER_ADDR']. PHP가 명령 줄 인터페이스를 통해 실행되는 경우 쉘을 실행 ipconfig(Windows) / ifconfig(* nix)하고 주소를 grep해야합니다.

로컬로 웹 사이트 방문자의 원격 주소를 의미하지만 외부 IP 주소가 아닌 경우 (구체적으로 192. *라고 말 했으므로) 운이 좋지 않은 것입니다. NAT 라우팅의 요점은 해당 주소를 숨기는 것입니다. IP 주소 뒤에있는 개별 컴퓨터의 로컬 주소를 식별 할 수는 없지만 동일한 IP에서 액세스하는 여러 컴퓨터가 있는지 구별하는 데 도움이되는 몇 가지 트릭 (사용자 에이전트, 아마도 Mac 주소)이 있습니다.


1
마지막으로 ipconfig / ifconfig는 대개 여러 IP 주소를 반환합니다. 컴퓨터에는 일반적으로 단일 주소가 없기 때문입니다. 좋은 대답입니다.
Álvaro González

예, NAT의 요점은 로컬 IP를 숨기는 것입니다. 이제 whatismyip.com에서 내부 IP 주소를 알고 있는지 확인하고 , 모바일을 사용하여이 웹 사이트를 엽니 다. 또한 모바일 로컬 IP 주소도 알고 있습니다. 편집 : JioFi 라우터를 사용하는 메신저, Android 9 AOSP 기반 롬에서 모바일 데이터를 사용하는 모바일 메신저
Rishabh Gusain

10

hostname (1)은 IP 주소를 알 수 있습니다. hostname --ip-address또는 사람이 말했듯이 사용하는 것이 좋습니다.hostname --all-ip-addresses


6

Linux 호스트의 CLI에서 일반 사용자로 이것을 시도 할 수 있습니다.

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

산출:

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', )알 겠어. 나는 PHP 파일에이 코드를 추가
밀짚 모자를

좋은 대답, 고맙습니다. split()함수는 PHP 5.3.0부터 지원 중단되었습니다. 그래서 사용하는 것이 좋습니다 explode()대신
Thanu

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

나는 Windows PC에서 시도해 보았고 작동했으며 Linux에서도 작동한다고 생각합니다.


4

매우 간단하고 위의 답변은 복잡한 것입니다. 이 방법을 사용하여 로컬 및 공용 IP 주소를 모두 얻을 수 있습니다.

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

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

?>

2

쉬운 것입니다. 이 간단한 코드로 호스트 이름을 얻을 수 있습니다.

$ip = getHostByName(getHostName());

또는을 사용 $_SERVER['HTTP_HOST']하여 호스트 이름을 가져올 수도 있습니다 .


1

나는 서버 측 PHP (Linux 터미널에서 실행)에 대해이 질문을 던졌습니다.

나는 'ifconfig'를 분해하여 IP 주소로 줄였습니다.

여기있어:

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

물론 'wlan0'을 원하는 네트워크 장치로 변경하십시오.

내 결과는 다음과 같습니다.

192.168.1.5

0

Wi-Fi를 통해 연결된 OS X의 개발 환경에있는 경우 :

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

0
$_SERVER['SERVER_NAME']

그것은 나를 위해 일했습니다.


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF 루트에 상대적인 경로로 현재 스크립트의 파일 이름을 반환합니다.

  • SERVER_PROTOCOL 페이지 요청 프로토콜의 이름과 개정판을 반환합니다.

  • REQUEST_METHOD 페이지에 액세스하는 데 사용되는 요청 방법을 반환합니다.

  • DOCUMENT_ROOT 현재 스크립트가 실행되고있는 루트 디렉터리를 반환합니다.


모두 사실이지만 질문 한 질문과 완전히 관련이 없습니다. -1.
마크 Amery

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.