【问题标题】:Execute a shell script from HTML page with PHP使用 PHP 从 HTML 页面执行 shell 脚本
【发布时间】:2021-12-06 15:04:26
【问题描述】:

我正在尝试使用 PHP 从 HTML 页面执行 shell 脚本。我找到了一个之前的示例here,我一直在尝试遵循该示例,但我遇到了问题。我不确定原因是什么,但没有返回错误,也没有从 bash 脚本创建文件。

index.php:

<!DOCTYPE html>
<html>
<head>
<style></style>
</head>
<body>
<form action="./test.php">
    <input type="submit" value="Open Script">
</form>
</body>
</html>

test.php

<?php
    exec("./bash_script.sh");
    header('Location: http://local.server.edu/ABC/abc_test/');
?>

bash_script.sh

#!/bin/bash
touch ./test_file.txt

我注意到可能导致问题的一件事是本地服务器上的路径似乎与文件系统不完全匹配。

如果我将脚本中的所有相对路径切换为绝对路径,例如: /local/sequence/temp/abc_test/file.exe

然后单击按钮运行脚本后,我收到一条错误消息: The requested URL /local/sequence/temp/abc_test/test.php was not found on this server

编辑: 这三个文件位于/local/sequence/temp/abc_test 并且有一个符号链接指向该目录/export/www/htdocs/ABC

【问题讨论】:

  • “请求的 URL”?这听起来不对。您是否尝试过从命令行执行 bash_script.sh?在添加 php 的额外变量之前确保它按预期工作
  • 是的,我已经在命令行上测试过了,它可以工作。现在它所做的只是触摸一个文件,而不是一个非常复杂的 bash 脚本。
  • 同意,只是消除了一个混淆变量。我注意到的下一件事是不同的文件名。该错误表明它找不到 test.php 脚本。所以 bash 脚本中的绝对路径甚至没有发挥作用。是不是不小心把test.php的名字或者位置改了?
  • 我根本没有更改名称或位置,但也许他们不在正确的位置开始?它们位于/local/sequence/temp/abc_test 并且有一个符号链接指向该目录/export/www/htdocs/ABC
  • 在您的表单操作中,我将使用“/test.php”并确保 test.php 在您服务器的文档根目录中(与 index.php 相同)。或者更好的是,省略操作值 snd 只需使用 index.php 来运行 bash 脚本。 (如果有帮助,我会在答案中解释)

标签: php bash


【解决方案1】:

错误消息似乎表明未找到 test.php。如所写,它需要与 index.php 位于同一目录中

您已经测试了实际的 bash 脚本,因此我们可以继续假设它正在执行接收提交的脚本。

我建议将所有网络内容放在一个页面中,因为您可以测试发送和接收输入。

<?php
// for testing
// exec("./bash_script.sh");

// check for POST submission (this is not just reading data)
if(isset($_POST['runScript'])) {
     // die('Request received');

    exec("./bash_script.sh");

    // It’s always proper to redirect after post :)
    header('Location: http://local.server.edu/ABC/abc_test/');
    die;
}

// finished with logic; show form
?>

<!DOCTYPE html>
<html>
<head>
<style></style>
</head>
<body>
<form method="POST">
    <input type="submit" name="runScript" value="Open Script">
</form>
</body>
</html>

注意,我在提交按钮中添加了name属性,并让表单在提交到调用页面时使用POST方法(没有动作意味着提交给自己)。

如有必要,我还留下了一些注释操作以帮助调试

您可能需要调整 bash 脚本的路径。目前它会在与 index.php 相同的目录中查找,这不是您想要在生产中执行的操作。

【讨论】:

    【解决方案2】:

    您将能够以某种方式做到这一点,但允许从 php 页面执行此类操作总是非常冒险。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2013-06-13
      • 2012-03-29
      • 2016-07-02
      • 1970-01-01
      • 2013-02-10
      • 2015-12-01
      相关资源
      最近更新 更多