如何连续捕获telnet会话/套接字输出(fread)?

时间:2012-07-26 15:12:27

标签: php sockets

我正在socket / telnet控制台上执行命令(fputs),并通过下面的代码获取输出/结果(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 个答案:

答案 0 :(得分:2)

为此,我会切换到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)循环,否则脚本将永远运行,但这是我用来做类似事情的方法。