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.