thttpd服务器与CGI的使用——解决CGI中不能使用system()函数的问题

一、thttpd服务器的下载与安装

1. 下载。

thttpd服务器的网站为http://www.acme.com/software/thttpd/,此网站上有thttpd的下载安装方法,即

cd /usr/src/redhat/SOURCES
wget http://www.acme.com/software/thttpd/thttpd-2.27.tar.gz
rpm -ta thttpd-2.27.tar.gz
rpm -i /usr/src/redhat/RPMS/i386/thttpd-2.27-1.i386.rpm

当然还有一种方法是,将下载的网址复制到迅雷下载源代码,对于Linux系统未装rpm服务的很适用。

2. 安装服务。

将代码解压后,根目录中有个configure文件,执行./configure生成Makefile,然后make一下即可生成thttpd可执行文件。若该程序要运行在嵌入式设备上,需要将Makefile文件中的编译器从默认的gcc改为适合该嵌入式设备的交叉编译器,需要改的Makefile文件有3个,即./Makefile、./cgi-src/Makefile和./extras/Makefile。对于某些thttpd版本,make可能会失败,提示getline函数与系统冲突,这里需要改一下./extras/htpasswd.c中的getline函数,将它重命名,以及将该文件内调用它的地方重命名,就行了。

二、运行thttpd服务器

1. 开启服务器

开启服务器要么用配置文件的方式,要么直接跟运行选项,我不太喜欢用配置文件,需要用配置文件的朋友可以搜相关资料。直接跟运行选项,可以像这样

./thttpd -d /usr/local/www/ -p 80 -c \* -u root -nor

其中-d后面跟的是服务器的根目录,-p后面跟的是绑定的端口,-c后面是跟的cgi文件。\*是取消通配符的意思,不然系统会自动用该目录下的所有文件代替"*",这样的意思就是根目录下的所有具有可执行权限的文件都为cgi文件。

如果要指定cgi文件,可以用"|"符号将它们串起来,但要用"\"转义。即

./thttpd -d /usr/local/www/ -p 80 -c cgiFile1\|cgiFile2 -u root -nor

如果开启服务失败,可以查看80端口是否被占用。如果服务开始成功,可以通过 ps aux | grep thttpd 查到。

像下面这样,就说明服务开启成功了

root     23773  0.0  0.1   3040  1056 ?        Ss   19:25   0:00 ./thttpd -d /usr/local/www/ -p 80 -c * -u root -nor
root     23775  0.0  0.0   5836   836 pts/0    S+   19:25   0:00 grep --color=auto thttpd

2. 访问主页

将index.html文件放到服务器的根目录,如例子所示的/usr/local/www/目录下,即可在浏览器中访问了。若服务器所在设备的IP地址为192.168.50.10
在浏览器中输入该IP地址即可,所显示的页面即为index.html。值得注意的是,index.html文件不能有可执行权限,若有,需要通过chmod -x index.html来将其可执行权限取消,否则服务器会认为它为CGI文件。

三、thttpd与CGI

1. CGI的格式

CGI文件并不要求是以.cgi或.CGI为后缀的文件,只要生成它的.c文件按照下面的格式来就行了。例test.c

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    printf("Content-type:text/html\n\n");
    printf("<html>\n");
    printf("<head><title>An html page from a cgi</title></head>\n");
    printf("<body>\n");
    printf("<h1>Board.Info</h1>\n");
    printf("</body>\n");
    printf("</html>\n");
    fflush(stdout);
    return 0;
}

以printf("Content-type:text/html\n\n");开始这是必须的,然后前后分别以printf("<html>\n");和printf("</html>\n");作为开始和结束,中间可嵌入我们自己处理的代码。

然后gcc test.c -o test就行了,生成的test就是cgi类型的。如果编出来的test没有可执行权限,需要执行chmod +x test,然后将此test放到服务器的根目录,如前面例子所示的/usr/local/www/目录,这样,就可以在浏览器中访问了,格式为 IP/test,如"192.168.50.10/test"。访问这个文件的效果如下图所示


2. 在CGI文件中执行shell命令

我们都很清楚,在C程序中执行shell命令,只需要用system()函数就行了,其原型为

#include <stdlib.h>
int system(const char *command);

很多人在CGI文件中使用system函数调用shell命令时会失败,那是因为system()能默认执行/bin/目录下的命令,如mkdir、cp、ls等,而有些命令在/sbin/目录下,有些在/usr/bin/目录下
对于常规的在/bin/目录下的命令,调用不会有问题,但不在/bin/目录下的命令就要加完整的路径了,如system("/usr/bin/loatate..."),怎么知道某个命令在哪一个目录下呢?
在终端使用 which [cmd] 命令即可。

另外,如果不是root用户登陆,要执行一些操作时权限不够,要用到sudo,那对应的system()函数调用时,应该是

system("echo \"你的密码\" | sudo + 命令")

3. 将按钮与CGI文件结合起来

前面已经说了,访问CGI文件可以通过[IP]/[CGI文件名]这种格式来实现,如果我们在主页(index.html)上点击某个按钮,它能从192.168.50.10跳转到192.168.50.10/test,即可把按钮与用C语言生成的CGI文件贯通起来。实现这一点的关键在于html中form表单中的action。如下例所示,action="test"

<html>
    <head>
        <title>Test Page</title>		
    </head>
    <body style="margin-left:480px">
        <h1>Test Button</h1>
        	<form enctype="application/x-www-form-urlencoded" action="test" method="post">
            	<input type="submit" value="Query">
        	</form>
    </body>
</html>

在此页面中,有一个名为Query的按键,点击下它,页面就会从192.168.50.10跳转到192.168.50.10/test,并在thttpd服务器的根目录/usr/local/www/找名为test的文件,查看它是否为cgi文件,如果是cgi文件,即执行它。


好的,我可以帮你实现这个功能。首先,我们需要明确一下 thttpd-cgi 接口是什么。thttpd 是一个非常轻量级的 HTTP 服务器,而 thttpd-cgi 则是用来处理 CGI 请求的模块。在 thttpd-cgi ,我们可以通过解析 HTTP 请求的参数和数据来处理 CGI 请求,并返回相应的响应。 为了实现清空网页内容的功能,我们可以编写一个简单的 CGI 程序,将其部署在 thttpd-cgi 。具体实现方式如下: 1. 编写 CGI 程序的源码,可以使用 C/C++、Python、Perl 等语言实现。下面是一个 Python 实现的示例代码: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- print("Content-type:text/html") print("") print(""" <html> <head> <title>清空网页内容</title> </head> <body> <script> document.body.innerHTML = ""; </script> <h1>网页内容已清空</h1> </body> </html> """) ``` 2. 将上述代码保存为一个 Python 文件,如 `clear.py`。 3. 将 `clear.py` 文件部署到 thttpd-cgiCGI 目录,例如 `/var/www/cgi-bin/` 目录。 4. 在 thttpd 的配置文件添加以下配置: ``` dir cgi-bin { cgi ".py=/usr/bin/python3" } ``` 这个配置告诉 thttpd-cgi,当请求以 `.py` 结尾时,使用 `/usr/bin/python3` 解释器来执行 CGI 程序。 5. 重启 thttpd 服务器,使配置生效。 现在,当你访问 `http://<服务器IP>/cgi-bin/clear.py` 时,就会执行上述 Python 程序,清空网页内容,并在页面上显示“网页内容已清空”的文字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值