正如一些评论员所建议的,您可以使用 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 日志,了解 exec 或 shell_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 调用它。
如果您正在调用其他脚本或程序,它们可能会遇到同样的问题,请检查直到您调试了脚本的执行。