php - Web本地应用程序Apache:运行Shell脚本

标签 php linux shell

我已经开发了一个shell脚本,我想用它创建一个UI。我决定使用一个带有本地服务器的web界面,因为我对HTML/PHP的了解很少,比QT或Java还多。我只希望我的html可以在我的计算机上运行shell脚本。
我有一个Apache php服务器,我用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)相同的结果。
一。CGI公司
CGI代表公共网关接口。它允许web服务器执行在主机上可执行的程序,并与web服务器接口。这本身就是一个协议,CGI不仅可以用来执行程序,还可以用来创建动态站点。你可以用任何语言编程一个动态网站,只要可执行文件被编程成通过stdin从服务器接收数据并解释头文件,正确解码任何内容,并且程序可以通过stdout向服务器返回正确的动态数据,具有正确的头文件、内容类型等。
有一些库可以帮助许多语言完成此任务(对于C,Perl在is核心模块中有一个CGI模块,等等,甚至对于Bash)。
在Linux上,要在Apache2中使用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/"

您将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命令,这也应该有效,只是你得到了一个状态码作为响应,而不是程序输出。
如果您的执行命令根本不起作用,这可能是因为权限、所有权或执行环境问题。
三。权限、所有权和执行环境
查看您的Apache日志,查看execshell_exec命令产生的错误。
脚本需要具有执行权限,并且需要可读并由web服务器执行。
例如,在Debian上,Apache web服务器作为用户www数据运行,因此脚本需要由该用户拥有和执行:
chown www-data:www-data test.sh
chmod u+x test.sh

通过检查(以根用户身份)以下结果,可以找到Apache日志的位置以及web服务器在Apache配置文件中运行时所使用的用户和组:
apachectl -S

另一个可能的问题是Apache运行脚本的环境该环境可能包含相同的环境变量,也可能不包含在控制台上执行相同脚本的“普通”用户可用的所有目录。
再次检查日志中的错误。
最常见的失败原因是找不到Bash命令,因为它不在Apache进程的$PATH中。然后,快速修复方法是更改脚本,以命令的完整路径作为前缀。
因此,例如,如果您的test.sh使用一个名为validjson的程序,请以用户身份打开您的终端,该用户可以无错误地执行脚本,并检查脚本的位置:
$ which validjson
validjson: /usr/local/bin/validjson

而不是假设脚本中的validjson位于$PATH中,而是使用which命令报告的完整路径/usr/local/bin/validjson调用它。
如果您正在调用其他脚本或程序,它们可能有相同的问题,请检查,直到您调试了脚本的执行。

关于php - Web本地应用程序Apache:运行Shell脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44529612/

相关文章:

php - 基于时间的 PHP 问候语

android - Gradle - 默认构建类型总是调试

linux - 将 -rdynamic 链接器选项添加到 gcc/g++ 会影响性能吗?

python - 如何在 x 时间后重新启动 python 脚本?

grep -E 中的正则表达式未按预期工作

php - 为什么javascript无法识别php代码?

php - 使用 PHP 的表单输入存储在 MySQL 中并返回输入的值

php - 使用 Graph API 更改旧 Facebook 帖子的隐私

linux - 如何更改top命令的工作方式

linux - 使用 grep 从停用词文件中过滤掉单词