【发布时间】:2021-11-02 11:32:03
【问题描述】:
尽管关键字 PHP // Javascript // 加载 // URL 在网络上显示了很多结果,但我无法在脑海中说清楚。我正在尝试通过真实案例研究来学习,但我现在有点迷茫。
我为一些命令行脚本构建了一个 Web 界面。
1 - 用户在 HTML 表单中输入单词,
2 - 表单提交到 PHP 脚本,
3 - 脚本在服务器上执行命令并在 HTML 页面中返回结果。
到目前为止一切顺利。
但是脚本可能需要很长时间来处理,所以我想改变结果的显示方式。
我想使用 [ttyd][1],这是一个终端共享实用程序,可以让我实时获得漂亮的结果:
1 - 用户输入HTML 表单中的一个词,
2 - 表单提交给 PHP 脚本,
3 - 脚本在服务器上执行命令,打开一个端口,然后等待 HTTP 连接,
4 - 建立 HTTP 连接,结果显示在 iframe 中。
并在 HTML 页面上返回结果。
这是我的 PHP 示例:
<?php
require __DIR__ . "/vendor/autoload.php";
ini_set("display_errors", "1");
ini_set("display_startup_errors", "1");
error_reporting(E_ALL);
//Securize user inputs
function securize($p)
{
$v = htmlspecialchars($p); //Convertir les caractères spéciaux
$v = trim($v); //Supprimer les espaces dans la requête
$v = rtrim($v); //Supprimer les espaces à la fin de la requête
$v = strtolower($v); //Tout mettre en minuscule
$v = strip_tags($v); //Supprimer les balises html dans la requête
$v = stripslashes($v); //Supprimer les slash dans la requête
$v = stripcslashes($v); //Supprimer les backslash dans la requête
$v = escapeshellcmd($v); //Protège les caractères spéciaux du Shell
return $v;
}
//Tool selector
if (isset($_POST["search"])) {
$term = securize($_POST["search"]);
if (!empty($term)) {
$port = rand(5000, 6000); //Get a random port for ttyd
if ($_POST["tool"] == "ghunt") {
if (mailValidate($term)) {
$tool = "python3 ghunt.py email";
$cli = (craft($tool, $term, $port));
passthru($cli);
die();
} else {
echo "<script type='text/javascript'>alert('$term n\'est pas une adresse mail valide');</script>";
die();
}
}
}
// Mail validation
// Takes user input
function mailValidate($p)
{
if (filter_var($p, FILTER_VALIDATE_EMAIL)) {
$v = true;
} else {
$v = false;
}
return $v;
}
// Command prep
// Takes command line + User input + port
function craft($tool, $term, $port)
{
$v = "ttyd -o -R -p $port $tool $term";
return $v;
}
?>
到目前为止,我所有的尝试都失败了。
我尝试设置 PHP 重定向 header("Location: http://ipadress:$port/")
但是 PHP 脚本似乎在执行命令后立即停止。
所以我也尝试用load()函数使用Javascript和Jquery,但是不知道该放哪里。
PHP 不能处理多个“动作”,例如执行和重定向吗?
这是我的 HTML 表单的示例:
<body>
<form method="POST" action="search.php" target="iframe">
<fieldset>
<legend>Recherchez un mail, un téléphone ou un pseudo...</legend>
<input type="search" placeholder="mail, téléphone ou pseudo" name="search">
<br>
<div class="fields">
<fieldset>
<legend>Email</legend>
<input type="radio" name="tool" value="ghunt">
<label for="ghunt"><b><div class="tooltip">Ghunt<span class="tooltiptext">Informations d'un compte google</span></div></b></label>
</fieldset>
</div>
<input class="button" type="submit" name="submit" value="Seek">
</fieldset>
</form>
<iframe id="ttyd" name="iframe"> </iframe>
</body>
非常感谢您的灯 [1]:https://github.com/tsl0922/ttyd
【问题讨论】:
-
一个 PHP 脚本运行,收集输出,然后完成。然后将输出作为服务器的响应发送到浏览器(并显示,除非使用 ajax 请求 URL)。然而,ttyd 创建了一个显示远程终端的 Web 服务器。要在您的网络应用程序中使用它,您需要选择一个固定端口,然后将 iframe src 设置为
yourserver:fixed_port。,该标题行重定向到 ttyd 服务器,因此理论上它应该可以工作;表单是如何发送到服务器的?你能显示表单的 HTML 吗? iframe 在这里有什么影响?你是用 jQuery 提交表单吗? -
感谢@ChrisG 的快速回复,我想避免一个固定的端口同时让多个用户。我将在第一篇文章中添加 HTML 表单。但是,如果我使用尚不存在的地址设置 iframe,它会显示错误,对吗?
-
是的,您会收到超时/无法连接错误。
-
发送该表单将使浏览器导航到结果。因此 iframe 消失了,浏览器只会显示 PHP 脚本的输出。它没有输出任何东西。您可能需要使用 ajax 发送请求,然后将 iframe src 设置为 ttyd 服务器 url。这需要知道 PHP 选择的端口。
-
不确定我是否理解。如果没有 TTYD “增强”,结果会正确显示在给定的 iframe 中。如果我需要使用ajax提交请求,为什么不能在这里定义随机端口?
标签: javascript php html jquery