【发布时间】:2016-08-29 07:11:48
【问题描述】:
问题的基础。我有一个大学作业要求我为电话簿编写一个基于 Perl/CGI 的网站。这部分很好,我很满意,但是,我在包装 cgi 文件时遇到了问题。我之前做过一次没有问题,但这次做同样的事情却无法复制成功。
显示用户 ID 的基本 Perl 文件:
#!/usr/bin/perl -w
use English;
print "Content-type: text/html";
print "\n";
print "\n";
print "\n";
print "<html>\n";
print "<head><title>IDS.CGI</title></head>\n";
print "<body>\n";
print "<p>\nMy User ID is $UID\n</p>";
print "<p>\nMy effective User ID is $EUID\n</p>";
print "<p>\nMy Group ID is $GID\n</p>";
print "<p>\nMy effective Group ID is $EGID\n</p>";
print "\n</body>\n";
print "</html>\n";
包装器.C:
#include <stdio.h>
#include <unistd.h>
#define REAL_PATH "ids.pl"
int
main()
{
execl( REAL_PATH, REAL_PATH, 0 );
printf( "You should never see this message!\n" );
}
这引发了内部服务器错误 500。我已尽力调试它,包括标题的间距等。它在终端中运行良好,但在 Web 浏览器中运行良好。服务器 httpd 错误日志显示“标题过早结束”的错误。但是,我看不出有什么过早的结束。
任何人都可以提供任何帮助将不胜感激。
【问题讨论】:
-
这种事情通常是因为 CGI 程序正在死去,而 "Premature end of headers" 只是意味着它没有打印任何东西。您是否检查过 C 可执行文件和 Perl 脚本都可以被系统执行?我不确定你为什么要为你的 CGI 运行 C 程序。您的服务器不会直接处理 Perl 代码吗?我建议您修改您的 C 程序以仅打印
"Content-type: text/plain\n\nTest succeeded\n";而不是尝试运行您的 Perl 程序。如果成功,那将消除 C 代码 -
在这里查看解决方案stackoverflow.com/questions/17583341/…,例如cgi 程序的权限位对吗?
-
是什么让你觉得你需要那个包装器?
-
绝对不是权限问题。需要 C Wrapper 才能使 CGI 在从 Web 服务器提供时作为文件的所有者执行,而不是作为“nobody”默认用户。
-
我猜这是路径问题,即 C 程序没有找到 Perl 程序。试试
#define REAL_PATH "/full/path/to/ids.pl"。