perl - 从 Perl CGI 脚本执行 Perl 脚本
问题描述
我想从 Apache Perl CGI 脚本执行 Perl 脚本。
CGI 完美地显示了 HTML 文本,但是当我尝试使用它执行另一个脚本时qx//
它不起作用。
HTML
<!DOCTYPE HTML>
<html>
<head>
<title>SUMAR</title>
</head>
<body>
<center>
<h1>Registro de usuario</h1>
<form method="get" action="cgi-bin/index.cgi">
Nombre <input type="text" name="name">
<br>
<br>
Usuario <input type="text" name="user">
<br>
<br>
Contraseña <input type="text" name="pass">
<br>
<br>
Correo electronico <input type="text" name="email">
<br>
<br>
<input type="submit" value="Enviar">
</form>
</center>
</body>
</html>
Perl CGI
#!/usr/bin/perl
use Unix::Passwd::File;
use File::Path;
use CGI;
use strict;
my $cgi = new CGI;
my $name = $cgi->param("name");
my $user = $cgi->param("user");
my $pass = $cgi->param("pass");
my $email = $cgi->param("email");
print "Content-type: text/html\n\n";
print "<html>\n<body>\n";
print $name . $user . $pass . $email;
print "\n</body>\n</html>";
qx(perl index.pl);
当我从命令行执行 CGI 时,调用index.pl
完美,但是当我通过 web 尝试时它不起作用。
编辑:::::::::::::::。
apache2/error.log
.....
[Mon May 07 12:31:41.070830 2018] [cgid:error] [pid 6039:tid 139761641543424] [client 172.28.200.230:59210] End of script output before headers: index.cgi, referer: http://172.20.3.107/
[Mon May 07 12:50:14.129598 2018] [cgid:error] [pid 6523:tid 139761926846336] (13)Permission denied: AH01241: exec of '/usr/lib/cgi-bin/index.pl' failed
[Mon May 07 12:50:14.130080 2018] [cgid:error] [pid 6040:tid 139761717077760] [client 172.28.200.230:59324] End of script output before headers: index.pl, referer: http://172.20.3.107/
mkdir /home/hgjhh: Permission denied at index.pl line 23.
mkdir /home/hgjhh: Permission denied at index.pl line 23.
[Mon May 07 13:15:25.420469 2018] [cgid:error] [pid 6040:tid 139761599579904] [client 172.28.200.230:59613] AH01264: script not found or unable to stat: /usr/lib/cgi-bin/index.pli
mkdir /home/hgjhh: Permission denied at /usr/lib/cgi-bin/index.pl line 23.
mkdir /home/hgjhh: Permission denied at /usr/lib/cgi-bin/index.pl line 23.
[Mon May 07 13:26:56.046889 2018] [mpm_event:notice] [pid 6035:tid 139761926846336] AH00491: caught SIGTERM, shutting down
[Mon May 07 18:22:57.342819 2018] [mpm_event:notice] [pid 534:tid 140120374777728] AH00489: Apache/2.4.10 (Debian) configured -- resuming normal operations
[Mon May 07 18:22:57.364426 2018] [core:notice] [pid 534:tid 140120374777728] AH00094: Command line: '/usr/sbin/apache2'
解决方案
您正在对可能不正确的当前工作目录做出假设。
如果index.pl
与 CGI 脚本在同一个目录中,
qx(perl index.pl);
应该
use FindBin qw( $RealBin );
use String::ShellQuote qw( shell_quote );
my $cmd = shell_quote("perl", "--", "$RealBin/index.pl");
qx($cmd);
或者
use FindBin qw( $RealBin );
use IPC::System::Simple qw( capturex );
capturex("perl", "--", "$RealBin/index.pl");
在这两种情况下,"perl", "--", "$RealBin/index.pl"
都可以简化为"$RealBin/index.pl"
ifindex.pl
是可执行的。
这可能是也可能不是您唯一的问题。在您告诉我们您遇到了什么问题(例如,告诉我们您遇到了什么错误)之前,我们无法提供进一步的帮助。
推荐阅读
- three.js - 将 DeviceOrientationControls 添加到 GLTF GLB 对象
- java - 为什么 System.getProperty("java.io.tmpdir") 在 Mac OS X Catalina 10.15 上返回只读目录
- python - 使用 BeautifulSoup 抓取 OSHA 网站
- python - 双曲曲线_拟合的预测区间 - SciPy
- php - 处理 PHP 多维数组以将键分配为值数组的父级
- r - stringr: how to recover sentences from a string that was derived from concatenating those sentences
- ios - How to convert a line of code from Objective-C to Swift in sorting array?
- php - 向 Stripe Checkout 会话添加免费的 0 美元商品
- system-verilog - 有没有办法将 SystemVerilog 分配模式转换为打包结构?
- php - PHP导航菜单中的活动类