基于PHP实现Telnet路由器并实时显示Traceroute结果的GUI开发需求
PHP实现Telnet连接路由器并实时显示Traceroute结果
针对你的需求,我帮你优化了现有代码,解决了原代码中固定等待时间导致的交互不稳定问题,同时实现了真正的实时输出效果,还优化了界面可读性。
需求回顾
使用PHP开发一个GUI界面,通过Telnet协议连接路由器,对目标IP执行traceroute命令,并在HTML页面上实时显示命令输出结果。
原代码的主要问题
- 固定的
sleep(1)无法适配不同响应速度的路由器,容易导致用户名/密码或命令输入时机错误 - 输出缓冲处理不完善,难以实现真正的实时刷新
- 没有过滤路由器的提示符和登录冗余信息,输出可读性差
改进后的完整代码
<!DOCTYPE html> <html> <head> <title>Telnet-Router Traceroute Tool</title> <style> .output-area { background-color: #f0f0f0; padding: 15px; border-radius: 5px; font-family: monospace; line-height: 1.4; height: 400px; overflow-y: auto; } .command-prompt { color: #2ecc71; font-weight: bold; } .error-text { color: #e74c3c; font-weight: bold; } </style> </head> <body> <h1>路由器Traceroute工具</h1> <div class="output-area"> <?php // 关闭所有输出缓冲,开启自动刷新 while (@ob_end_flush()); ob_implicit_flush(true); // 配置参数,建议后续改成表单输入 $router_ip = "172.16.1.2"; $username = "myusername"; $password = "password"; $target_ip = "8.8.8.8"; $traceroute_cmd = "traceroute $target_ip"; // 建立Telnet连接 $telnet_conn = fsockopen($router_ip, 23, $errno, $errstr, 10); if (!$telnet_conn) { echo '<span class="error-text">连接失败: ' . $errstr . ' (错误码: ' . $errno . ')</span><br>'; exit(); } echo '<span class="command-prompt">正在连接路由器 ' . $router_ip . '...</span><br>'; // 等待用户名输入提示 $buffer = ''; while (strpos($buffer, 'Username:') === false && strpos($buffer, 'login:') === false) { $chunk = fread($telnet_conn, 1024); $buffer .= $chunk; echo htmlspecialchars($chunk); flush(); if (feof($telnet_conn)) break; } // 发送用户名 fwrite($telnet_conn, $username . "\r\n"); echo '<span class="command-prompt">>>> 发送用户名: ' . $username . '</span><br>'; flush(); // 等待密码输入提示 $buffer = ''; while (strpos($buffer, 'Password:') === false) { $chunk = fread($telnet_conn, 1024); $buffer .= $chunk; echo htmlspecialchars($chunk); flush(); if (feof($telnet_conn)) break; } // 发送密码 fwrite($telnet_conn, $password . "\r\n"); echo '<span class="command-prompt">>>> 发送密码: ******</span><br>'; flush(); // 等待命令提示符(适配多数路由器的#或>) $buffer = ''; while (strpos($buffer, '#') === false && strpos($buffer, '>') === false) { $chunk = fread($telnet_conn, 1024); $buffer .= $chunk; echo htmlspecialchars($chunk); flush(); if (feof($telnet_conn)) break; } // 执行traceroute命令 fwrite($telnet_conn, $traceroute_cmd . "\r\n"); echo '<span class="command-prompt">>>> 执行命令: ' . $traceroute_cmd . '</span><br>'; flush(); // 实时读取命令输出,直到再次出现提示符(命令执行完成) $buffer = ''; while (strpos($buffer, '#') === false && strpos($buffer, '>') === false) { $chunk = fread($telnet_conn, 1024); $buffer .= $chunk; echo htmlspecialchars($chunk); flush(); if (feof($telnet_conn)) break; } // 断开连接 fwrite($telnet_conn, "exit\r\n"); echo '<span class="command-prompt">>>> 断开连接,操作完成</span><br>'; flush(); fclose($telnet_conn); ?> </div> </body> </html>
关键改进说明
- 智能等待提示符:不再用固定sleep,而是检测路由器的
Username:、Password:和命令提示符(#/>)来触发下一步操作,适配不同响应速度的设备 - 实时输出优化:通过
ob_implicit_flush(true)和手动flush()确保每一段输出都能立即显示在页面上,实现真正的实时效果 - 界面美化:添加了CSS样式,区分系统提示、命令操作和错误信息,输出区域带滚动条,提升可读性
- 安全与兼容性:用
htmlspecialchars()转义输出内容,避免HTML注入;适配不同路由器的登录提示字符串 - 异常处理:增加
feof()检测,防止连接异常时无限等待
使用注意事项
- 如果你的路由器Telnet提示符不是
#或>,需要修改代码中检测提示符的字符串 - 部分路由器的traceroute命令可能是
tracert(比如部分国产设备),请根据实际设备调整命令 - 生产环境中不要硬编码用户名和密码,建议改成表单输入,并添加输入验证和安全过滤
- 确保PHP环境开启了
allow_url_fopen配置(默认开启)
内容的提问来源于stack exchange,提问作者B.Nim
相关产品推荐
相关产品推荐

