一、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文件,即执行它。
原文链接:https://blog.csdn.net/sinat_28309919/article/details/77509781