You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PHP实现Telnet路由器并实时显示Traceroute结果的GUI开发需求

PHP实现Telnet连接路由器并实时显示Traceroute结果

针对你的需求,我帮你优化了现有代码,解决了原代码中固定等待时间导致的交互不稳定问题,同时实现了真正的实时输出效果,还优化了界面可读性。

需求回顾

使用PHP开发一个GUI界面,通过Telnet协议连接路由器,对目标IP执行traceroute命令,并在HTML页面上实时显示命令输出结果。

原代码的主要问题

  1. 固定的sleep(1)无法适配不同响应速度的路由器,容易导致用户名/密码或命令输入时机错误
  2. 输出缓冲处理不完善,难以实现真正的实时刷新
  3. 没有过滤路由器的提示符和登录冗余信息,输出可读性差

改进后的完整代码

<!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>

关键改进说明

  1. 智能等待提示符:不再用固定sleep,而是检测路由器的Username:、Password:和命令提示符(#/>)来触发下一步操作,适配不同响应速度的设备
  2. 实时输出优化:通过ob_implicit_flush(true)和手动flush()确保每一段输出都能立即显示在页面上,实现真正的实时效果
  3. 界面美化:添加了CSS样式,区分系统提示、命令操作和错误信息,输出区域带滚动条,提升可读性
  4. 安全与兼容性:用htmlspecialchars()转义输出内容,避免HTML注入;适配不同路由器的登录提示字符串
  5. 异常处理:增加feof()检测,防止连接异常时无限等待

使用注意事项

  • 如果你的路由器Telnet提示符不是#或>,需要修改代码中检测提示符的字符串
  • 部分路由器的traceroute命令可能是tracert(比如部分国产设备),请根据实际设备调整命令
  • 生产环境中不要硬编码用户名和密码,建议改成表单输入,并添加输入验证和安全过滤
  • 确保PHP环境开启了allow_url_fopen配置(默认开启)

内容的提问来源于stack exchange,提问作者B.Nim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:58:13