Lighttpd服务器C语言CGI程序执行失败排查

发布于:2025-06-08 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

引言

问题现象

解决方法

结束语


引言

前几天的博客介绍了lighttpd下配置CGI程序的方法:Lighttpd CGI配置:404错误排查实录-CSDN博客。学生在实践中又遇到一个问题,就是用C语言编写的CGI程序不知道为什么总是不能执行。

问题现象

我编写了一个最简单的CGI程序来说明问题。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("Content-Type: text\r\n\r\n");
	printf("Hello from cgi program\r\n");
	return 0;
}

 使用下面的命令行进行编译:

arm-none-linux-gnueabi-gcc -o hello.cgi hello.c

然后在开发板上部署这个程序,可以现在命令行运行一下。

 

程序可以正常运行。

然后在浏览器中访问CGI程序就没有任何反应了。用Wireshark抓包,可以看到lighttpd返回200 OK,但是没有任何内容。

从返回的Content-length看出是0。 

解决方法

在上一篇博文提到,修改/var/lighttpd/config/conf.d/cgi.conf文件,以指定 Bash 脚本作为 CGI 处理程序。

#######################################################################
##
##  CGI modules
## ---------------
##
## http://www.lighttpd.net/documentation/cgi.html
##
server.modules += ( "mod_cgi" )
 
##
## Plain old CGI handling
##
## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
##
cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
                               ".cgi" => "/bin/bash",
                               ".rb"  => "/usr/bin/ruby",
                               ".erb" => "/usr/bin/eruby",
                               ".py"  => "/usr/bin/python" )

上一个例子和此次有点不同。上次是用Shell脚本写了cgi程序,在脚本中调用的C语言生成的可执行文件,而这次是直接用C语言生成了可执行文件。如果 还用这个配置文件,就意味着C语言生成的可执行程序被当做shell脚本运行,所以不会返回预期的结果。

所以要修改一下配置文件,增加一行:

cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
                               ".cgi" => "/bin/bash",
			       ".prg" => "",
                               ".rb"  => "/usr/bin/ruby",
                               ".erb" => "/usr/bin/eruby",
                               ".py"  => "/usr/bin/python" )

增加的这一行意思是对于扩展名为.prg的cgi程序,直接当做可执行程序运行。然后把cgi程序改为hello.prg,再执行就对了。

 

结束语

希望这些内容能为您带来启发或帮助。如果您有任何疑问或想法,欢迎在评论区交流分享。

感谢阅读,期待下次与您相遇!