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

PHP执行后端命令后如何通过Javascript在iframe加载ttyd实时终端地址?

问题根源

你当前的代码使用passthru()执行ttyd命令时,PHP默认会进入同步阻塞状态,等待命令执行完成后才会运行后续逻辑。而ttyd启动后会持续监听端口不会主动退出,因此PHP脚本会一直卡在命令执行步骤,无法执行重定向或返回响应的逻辑,这就是你之前所有尝试失败的核心原因,PHP本身完全支持多步操作,只是你使用了错误的命令执行方式。

解决方案

1. PHP端修改(核心调整)

将ttyd命令改为后台异步执行,避免阻塞PHP主进程,等待ttyd启动完成后再返回重定向响应即可:

// 仅展示需要修改的tool selector逻辑块,其余代码保持不变
if (isset($_POST["search"])) {
    $term = securize($_POST["search"]);
    if (!empty($term)) {
        $port = rand(5000, 6000);
        if ($_POST["tool"] == "ghunt") { 
            if (mailValidate($term)) {
                $tool = "python3 ghunt.py email";
                $cli = craft($tool, $term, $port);
                // 新增:将命令输出重定向到空,放到后台执行,不阻塞PHP
                $cli .= ' > /dev/null 2>&1 &';
                exec($cli);
                // 新增:等待1秒保证ttyd服务启动完成,可根据服务器性能调整时长
                sleep(1);
                // 替换为你自己的服务器IP或域名
                header("Location: http://你的服务器实际地址:$port/");
                exit();
            } else {
                echo "<script type='text/javascript'>alert('$term n\'est pas une adresse mail valide');</script>";
                die();
            }
        }
    }
}

2. 配套优化建议

  • 确认服务器防火墙放开了5000-6000端口的入站规则,否则前端iframe无法访问ttyd服务
  • 增加端口占用检测逻辑,避免随机到已被占用的端口导致启动失败
  • 新增ttyd进程回收机制:可以给ttyd命令增加超时参数,或者定时清理运行超过指定时长的ttyd进程,避免端口和系统资源被长期占用
  • 不要用root权限运行PHP和ttyd服务,降低安全风险

你当前的前端代码已经将表单提交目标设置为iframe,PHP返回的重定向响应会直接在iframe内加载ttyd的实时终端界面,完全符合你预期的流程。

内容的提问来源于stack exchange,提问作者MrNonoss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:51:00