我开发了一个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命令的输出,但它不作为标准脚本在终端上执行(如果脚本没有在服务器端执行)。
我希望从终端开始执行此脚本。
感谢您的帮助
答案 0 :(得分:1)
根据一些评论员的建议,您可以使用Apache cgi功能直接执行test.sh文件( 1 ),但是因为您说您使用的是启用Php的Apache服务器,你有一个替代的,更容易的选择Php,你已部分尝试过( 2 )。在这两种情况下,您都需要处理bash脚本的权限和所有权,以及它的执行环境,以产生与命令行相同的结果( 3 )。
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。
因为您说您使用启用Php的Apache服务器,并且您可能不希望Bash脚本直接将html发送到浏览器,所以这些并发症可能没有必要。
在这种情况下,shell_exec()命令或backticks operator将允许您运行Bash脚本并在Php变量中获取其输出,并在Php中执行您想要执行的任何操作。
您说您已尝试使用exec命令,该命令也可以使用,除了您获得状态代码作为响应,而不是程序输出。
如果执行命令根本不起作用,可能是因为权限,所有权或执行环境问题。
查看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
而不是在脚本中调用validjson
,假设它在$ PATH中,而是使用which命令报告的完整路径/usr/local/bin/validjson
来调用它。
如果您正在调用其他脚本或程序,它们可能会遇到相同的问题,请在调试脚本执行之前进行检查。