2012-07-26 133 views
1

我在socket/telnet控制檯上執行命令(fputs),並通過下面的代碼獲取輸出/結果(fread),它工作得很好。如何連續捕獲telnet會話/ scoket輸出(fread)?

//open socket let's say ip = 192.168.10.5 and port = 21 
$this->socketResource = fsockopen($this->nodeIp,$this->portNumber); 
//execute some commands, for example "ipconfig" 
fputs($this->socketResource,$command); 
//get output string 
$output = fread($this->socketResource,30000); 

現在我的要求是獲得所有控制檯/套接字輸出,而不執行fputs的任何命令。例如,Cisco路由器在telnet控制檯/套接字上提供連續的調試消息/打印,而不執行fput的任何命令。

如何在一段時間內連續捕獲(fread)任何telnet會話輸出而不執行任何命令(fputs)?

如果我像每x秒一樣以離散的方式捕捉,我肯定會錯過一些控制檯輸出。

回答

1

爲此,我會切換到stream_*系列。試圖通過性能和擴展來實現上述目標時有一個巨大的改進。

$stream = stream_socket_client("tcp://10.1.1.1:23", $errno, $errstr, 30); 
if (!$stream) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    fwrite($stream , "sh run" . PHP_EOL); 

    // Set Blocking Mode - Wait For A Response On The Stream 
    stream_set_blocking($stream , true); 
    while(true){ 

     // This is your response 
     echo stream_get_contents($stream); 
    } 

} 

您將需要添加上述東西打破while(true)循環,或腳本將永遠運行下去,但是這是一個方法,我用做類似的事情。

+0

非常感謝。阻塞意味着tcp流將永久保持打開狀態。我寫信嗎? – 2012-07-26 15:43:15

+0

感謝讓我嘗試...很大的幫助 – 2012-07-26 16:18:14

+0

設置塊模式後,一個回聲stream_get_contents($流)的調用需要這麼多時間,超過一分鐘的小緩衝內容。你知道如何最小化,以便多次通話不會花費太多時間.. – 2012-07-26 17:03:48