Web 本地应用程序 Apache:运行 shell 脚本

elp*_*a01 3 php linux shell

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

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

在 /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>
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的帮助

Tar*_*dis 6

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

1.电脑动画

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

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

在 Linux 上,要在 Apache 2 中使用 CGI,您需要确保您的 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/"
Run Code Online (Sandbox Code Playgroud)

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

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

Content-type: text/html
Run Code Online (Sandbox Code Playgroud)

然后是您想要生成的任何动态 html。

2. PHP

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

在这种情况下,shell_exec()命令或反引号运算符将允许您运行 Bash 脚本并在 Php 变量中获取其输出,并在 Php 中执行任何您想做的事情。

你说你已经尝试过使用exec命令,它应该也可以工作,除了你得到一个状态代码作为响应,而不是程序输出。

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

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

查看 Apache 日志以了解execorshell_exec命令产生的错误。

该脚本需要具有执行权限,并且需要能够被 Web 服务器读取和执行。

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

chown www-data:www-data test.sh
chmod u+x test.sh
Run Code Online (Sandbox Code Playgroud)

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

apachectl -S
Run Code Online (Sandbox Code Playgroud)

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

再次检查日志中的错误。

失败的最常见原因是找不到 Bash 命令,因为它不在 Apache 进程的 $PATH 中。然后快速修复是更改脚本以使用其完整路径作为命令的前缀。

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

$ which validjson
validjson: /usr/local/bin/validjson
Run Code Online (Sandbox Code Playgroud)

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

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