2013-07-06 2 views
0

telnet 명령을 통해 내 라우터에서 WAN IP를 가져 오기 위해 PHPTelnet.php 클래스 (http://www.geckotribe.com/php-telnet/)를 사용하고 있습니다. 그것은 이렇게 간다 :PHP를 사용하는 텔넷 - echo와 함께 작동합니까?

require_once "PHPTelnet.php"; 

$telnet = new PHPTelnet(); 
$telnet->show_connect_error=0; 

$result = $telnet->Connect('192.168.0.1','username','password'); 

switch ($result) { 
case 0: 
$telnet->DoCommand('sys ddns display', $result); 
echo $result; 
$telnet->DoCommand('exit', $exit); 
echo $exit; 
$telnet->Disconnect(); 
break; 

그것은 작동한다. 내가 $ 결과를 echo 할 때 다음과 같은 많은 설정을 볼 수있다.

sys ddns display DDNS 상태 state = 0, flags = 1 pauseTime = 0, timerID = 0 startcnt = 2, stopcnt = 1 retrycnt = 0, eventqcnt = 0 socketID = -1 DomainName = 전자 메일 주소 = 업데이트 IP = XXX.XXX.XXX.XXX 업데이트 시간 = 00:00:00 1월 1일, 내가 XXX.XXX.XXX.XXX (WAN IP)을 받고 만에 intrested 해요 때문에

좋은 1970 RETCODE = 나는 $ 결과에서 IP를 얻을 수는 preg_match을한다. 여기에 문제가 온다. 나는 항상이 오류가 발생한다.

기본적으로 preg_match는 일치하는 것을 찾을 수 없다. 이 코드를 사용하여 IP와 일치시킵니다 :

$regex = '/\IP = ([^\"]*?)\ /'; 
preg_match($regex, $result, $matches); 

IP를 정확하게 일치시킵니다. 사실 나는 이것과 같은 것을 시도해도 효과가있다.

$result = "sys ddns display DDNS Status state = 0, flags = 1 pauseTime = 0, timerID = 0 startcnt = 2, stopcnt = 1 retrycnt = 0, eventqcnt = 0 socketID = -1 DomainName = eMail Address = update IP = XXX.XXX.XXX.XXX update time = 00:00:00 Thu. Jan. 01, 1970 retCode = good tc> "; 
$regex = '/\IP = ([^\"]*?)\ /'; 
preg_match($regex, $result, $matches); 
print_r($matches); 

문제는 보인다 $ telnet-> DoCommand ('SYS DDNS 디스플레이', $ 결과)에서 직접 제공되는 $ 결과;은 에코 만 가능하지만 문자열로는 사용할 수 없습니다. 왜? 이것의 핵심은 무엇입니까? 실제 텔넷 응답을 어떻게 얻을 수 있습니까?

+0

첫째로'[^ \ "]'은 검색하는 데이터와 관련이 없습니다. (표시되는 문자열에 이중 따옴표가 없습니다. 무엇이든 일치), 두 번째로 정규 표현식의 선두 백 슬래시도 의미가 없으며 (이스케이프 할 것이 없습니다) 셋째, http://whatismyipaddress.com과 같은 것을 사용할 수있을 때 공용 IP를 찾기 위해 불필요하게 복잡한 방법 인 것처럼 보입니다./api (무료로 동일한 기능을 제공하는 수많은 서비스가 있습니다) – DaveRandom

+0

정규 표현식이 잘못 작성되었음을 알고 있습니다. 스크립트를 실제로 작동시킬 수 있는지 빨리 이해할 수 있도록 테스트 용으로 재활용했습니다. 내 공개 IP : D 내가하고있는 일은 더 복잡한 일이다. 나는 동적 인 IP하에 홈 서버를 가지고있다. 매 60 초마다 텔넷을 통해 ds 스크립트는 현재 공개 IP를 얻고, 변경된 경우 API를 통해 등록 기관과 연결된 실제 도메인의 A 레코드도 업데이트합니다. 이 방법으로 나는 home.mydomain.com을 방문하여 항상 내 홈 서버, 모든 PC 및 심지어 휴대폰에 액세스 할 수 있습니다. – user1274113

답변

0

수정 됨. 그것은 나의 게으른 regex에 대한 문제였다. 이것은 다음과 같이 작동합니다 :

function GetIP($string) 
{ 
    preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $string, $matches); 
    $ip = $matches[0]; 
    return $ip; 
} 
관련 문제