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

Php Web本地应用程序Apache:运行shell脚本,php,linux,shell,Php,Linux,Shell,我开发了一个shell脚本,我想用它创建一个UI。我决定在本地服务器上使用一个web界面,因为我对HTML/PHP的了解比QT或Java还少。我只是希望我的html可以在我的计算机上运行shell脚本 我有一个apachephp服务器,我用apachectl在localhost中启动它 在/var/www/html/I中有一个shell脚本和一个test_web.php文件,它们通过exec('/var/www/html/test.sh') 在我的html中,我有以下内容: <form m

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

我有一个apachephp服务器,我用apachectl在localhost中启动它

在/var/www/html/I中有一个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命令的输出,但它不会作为标准脚本在终端上执行(就像脚本没有在服务器端执行一样)

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


感谢您的帮助

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

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

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

在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
直接执行脚本。还有其他可能的配置,请参见此

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

Content-type: text/html
然后是您想要生成的任何动态html

2.Php 实际上,由于您说您使用的是支持Php的Apache服务器,而且您可能不希望Bash脚本将html直接发送到浏览器,所以所有这些复杂情况可能都没有必要

在这种情况下,命令or将允许您运行Bash脚本,并在Php变量中获取其输出,并在Php中执行您想对其执行的任何操作

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

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

3.权限、所有权和执行环境 查看Apache日志,查看由
exec
shell\u exec
命令产生的错误

该脚本需要具有执行权限,并且需要可读且可由web服务器执行

例如,在Debian上,Apache web服务器作为用户www数据运行,因此脚本需要由该用户拥有并可执行:

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
调用它


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

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