【问题标题】:Web local application Apache: run a shell scriptWeb 本地应用程序 Apache:运行 shell 脚本
【发布时间】:2017-11-15 17:03:49
【问题描述】:

我开发了一个 shell 脚本,我想用它创建一个 UI。我决定使用带有本地服务器的 Web 界面,因为我在 HTML/PHP 方面的知识很少,比 QT 或 Java 还要多。我只是希望我的 html 可以在我的计算机上运行 shell 脚本。

我有一个 Apache php 服务器,我在 localhost 中使用 apachectl 启动它。

在 /var/www/html/ 我有一个 shell 脚本和一个 test_web.php 文件,它们使用 exec('/var/www/html/test.sh') 执行这个脚本

在我的 html 中我有这个:

<form method="POST" action="test_web.php?"> 
<input type="submit" value="Execute" name="exec"> 
</form>

如果我单击“执行”,它会打开一个新页面,在该页面中我可以看到来自脚本的 echo 命令的输出,但它不会作为标准脚本在终端上执行(就像脚本没有在服务器端执行一样)。

我希望这个脚本从终端开始执行。

感谢您的帮助

【问题讨论】:

  • 我想说你想看看 apache http 服务器的“cgi”特性。
  • 您要获取服务器上的test.sh 文件,将其传输到客户端,然后在客户端上运行吗?
  • @arkascha 谢谢!我去看看。
  • @AlexHowansky 因为这是一个本地服务器,理论上我不在乎它是在服务器上还是在客户端上,因为这是同一台计算机,但如果它不是更复杂的话,我当然更喜欢在服务器上。请注意,我在 html 中有一些要传递给脚本的参数,但这应该不是问题。
  • 您肯定希望将事情保留在服务器端,否则您将不得不处理多平台情况。没有任何 shell 脚本可用。

标签: php linux shell


【解决方案1】:

正如一些评论员所建议的,您可以使用 Apache cgi 功能来直接执行您的 test.sh 文件 (1),但既然您说您使用的是启用了 Php 的 Apache 服务器,你有一个替代的和更简单的选择,你已经部分尝试了(2)。在这两种情况下,您都需要注意 bash 脚本的权限和所有权,以及它的执行环境,以便它产生与命令行相同的结果 (3)。

1。 CGI

CGI 代表通用网关接口。它允许 Web 服务器执行在主机上可执行的程序,并与 Web 服务器交互。这是一个本身的协议,CGI 不仅可以用于执行程序,还可以用于创建动态站点。您可以使用任何语言编写动态网站,前提是可执行文件被编程为通过标准输入从服务器接收数据并解释标头,正确解码任何内容,并且程序可以通过标准输出向服务器返回正确的动态数据,具有适当的标题、内容类型等。

对于许多语言,有一些库可以帮助完成这项任务(对于 C,Perl 在核心模块等中有一个 CGI 模块,甚至对于 Bash)。

在 Linux 上,要将 CGI 与 Apache 2 一起使用,您需要确保您的 Apache 配置加载了支持它所需的模块,并选择允许您的 Web 服务器执行程序的目录:

# uncomment or add the directive for the module
LoadModule cgid_module modules/mod_cgid.so

# one way to allow the server to execute cgi programs is to
# set a ScriptAlias directive to a directory dedicated to CGI programs
ScriptAlias "/cgi-bin/" "/var/www/html/cgi-bin/"

你把你的test.sh脚本放到/var/www/html/cgi-bin/,浏览器可以指向http://localhost/cgi-bin/test.sh直接执行脚本。还有其他可能的配置,请参阅Apache CGI tuturial

如果您需要执行 Bash 程序并希望您的 CGI 向浏览器发送任何内容,则 Bash 脚本发送的第一个回显应该是以下输出:

Content-type: text/html

接下来是您想要生成的任何动态 html。

2。 php

实际上所有这些复杂性可能都不是必需的,因为您说您使用的是启用了 Php 的 Apache 服务器,并且您可能不希望 Bash 脚本直接将 html 发送到浏览器。

在这种情况下,shell_exec() 命令或backticks operator 将允许您运行 Bash 脚本并在 Php 变量中获取其输出,然后在 Php 中执行任何您想做的操作。

您说您已尝试使用exec 命令,该命令也应该可以工作,只是您得到一个状态码作为响应,而不是程序输出。

如果您的执行命令根本不起作用,这可能是因为权限、所有权或执行环境问题。

3。权限、所有权和执行环境

查看您的 Apache 日志,了解 execshell_exec 命令产生的错误。

脚本需要有执行权限,需要web服务器可读可执行。

例如,在 Debian 上,Apache Web 服务器作为用户 www-data 运行,因此脚本需要由该用户拥有和执行:

chown www-data:www-data test.sh
chmod u+x test.sh

您可以通过(以 root 身份)检查以下结果,在 Apache 配置文件中找到 Apache 日志的位置以及运行 Web 服务器的用户和组:

apachectl -S

另一个可能的问题是 Apache 运行脚本的环境。该环境可能包含或不包含相同的环境变量,$PATH 会有所不同,并且可能不包含在控制台上执行相同脚本的“普通”用户可用的所有目录。

再次检查日志中的错误。

最常见的失败原因是找不到 Bash 命令,因为它不在 Apache 进程的 $PATH 中。快速解决方法是更改​​脚本以在命令前加上完整路径。

因此,例如,如果您的 test.sh 使用名为 validjson 的程序,请以可以无错误执行脚本的用户身份打开终端,然后检查它的位置:

$ which validjson
validjson: /usr/local/bin/validjson

假设它在 $PATH 中,而不是在脚本中调用 validjson,而是使用 which 命令报告的完整路径 /usr/local/bin/validjson 调用它。

如果您正在调用其他脚本或程序,它们可能会遇到同样的问题,请检查直到您调试了脚本的执行。

【讨论】:

  • 这是一个老问题,但对于那些浏览,您可能需要在 Apache 配置中启用 cgi 模块:sudo cp /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2018-07-30
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2023-01-30
相关资源
最近更新 更多