我正在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秒一样以离散的方式捕捉,我肯定会错过一些控制台输出。
答案 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)
循环,否则脚本将永远运行,但这是我用来做类似事情的方法。