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

时间:2017-06-13 19:03:30

标签: php linux shell

我开发了一个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>

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

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

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

1。 CGI

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

有许多语言可以帮助完成这项任务(对于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脚本发送的第一个echo应该是以下输出:

Content-type: text/html

后面跟着你要生成的动态html。

2。腓

因为您说您使用启用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

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

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