Boaweb服务器在Linux2.6.32下CGI测试
作者:dx152 | 来源:互联网 | 2017-11-03 07:57
主机环境:RedHat9交叉编译器:arm-linux-gccversion4.3.2平台:s3c2440(一)编译boa从Boa的官方网站http:www.boa.org上下载了它的发行版本源码,版本号为0.94.13。先把源码解压,调出超级终端并执行:#tarxzfboa-0.94.13.tar.gz#cdboa-0.9
主机环境:RedHat9
交叉编译器:arm-linux-gcc version 4.3.2
平台:s3c2440
(一) 编译boa
从Boa的官方网站 http://www.boa.org/ 上下载了它的发行版本源码,版本号为0.94.13。先把源码解压,调出超级终端并执行:
# tar xzf boa-0.94.13.tar.gz
# cd boa-0.94.13/src
生成MakeFile文件
#./configure
修改Makefile文件,找到CC=gcc,将其改成CC=arm-linux-gcc,再找到CPP = gcc -E,将其改成CPP = arm-linux-gcc -E,并保存退出。
然后运行make进行编译,这时出现如下错误:
“ util.c: 100: 1: pasting “t” and “->” does not give valid preprocessing token make ”的错误提示,
改动 compat.h 文件:
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
改为:
#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
编译成功。
另外,还需要修改一处src/log.c
注释掉
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE(\"unable to dup2 the error log\");
}
为:
/*if (dup2(error_log, STDERR_FILENO) == -1) {
DIE(\"unable to dup2 the error log\");
}*/
否则会出现错误:
log.c:73 unable to dup2 the error log:bad file deor
最后优化调用交叉编译器的strip命令将调试信息剥去,得到的最后程序只有约60KB大小。
# make
# arm-linux-strip boa
(二) 配置boa
安装完Boa软件后,需要对Boa进行配置,其配置文件是boa.conf,这个文件在源代码中有,将其拷贝到嵌入式Linux根文件系统的/etc/boa目录下。然后对这个文件几个重要的地方进行如下修改[2]。
#[3]监听的端口号,缺省都是80,不做修改
Port 80
# 调用的IP地址,注释掉,这样表明绑定到INADDR_ANY,通配于服务器的所有IP地址。不设定静态固定的服务器地址。
#Listen 192.68.0.5
#设定那个Linux用户组的哪个用户,对Boa拥有权限
User root
Group root
#错误日志文件。设计路径在/dev/console下。
ErrorLog /dev/console
#访问日志文件。设置为/dev/null意味关闭AccessLog功能,启动服务器时不载入日志文件。
AccessLog /dev/null
#服务器名字
ServerName friendly-arm
# HTML文档的主目录,访问的页面即放在这个目录下。
DocumentRoot /www
#HTML目录默认索引文件名。
DirectoryIndex index.html
#一个连接所允许的HTTP持续作用请求最大数目。
KeepAliveMax 1000
#HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位。
KeepAliveTimeout 10
#指明mime.types[4]文件位置。
MimeTypes /etc/mime.types
#文件扩展名没有或未知的话,使用的缺省 MIME 类型。
DefaultType text/plain
#提供 CGI 程序的 PATH 环境变量值。
CGIPath /bin:/usr/bin:/usr/sbin:/sbin
#指明 CGI 脚本的虚拟路径对应的实际路径, /www/cgi-bin/ 是我的根文件系统的目录。
ScriptAlias /cgi-bin/ /www/cgi-bin/
拷贝主机 /etc/mime.types 文件到根文件系统的 etc 目录下。
(三) 测试与出错处理
1 、静态网页测试
将一静态网页放置到HTML文档的主目录/www下,为了方便文件名修改为index.html,并在浏览器中输入目标板ip如http://192.168.1.200将出现静态网页。
2、cgi测试
首先,编写Helloworld.c程序
int main(void)
{
printf(\"Content-type:text/htmlnn\"); //这句一定要加上
printf(\" Hello,world.\");
exit(0);
}
交叉编译arm-linux-gcc -o helloworld.cgi helloworld.c
将helloworld.cgi复制到/www/cgi-bin/目录下,注意执行权限,并在浏览器中输入http://192.168.1.200/cgi-bin/ helloworld.cgi即可看到相应的网页。
(四) cgi编程
动态网页的设计有很多方法,CGI是其中之一。Boa服务器支持cgi,这里介绍两种方式利用cgi完成客户端与服务器的通信。
首先了解cgi基本原,CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器本地或远程应用程序通信的一种接口,其程序须运行在网络服务器上。在物理上,CGI是一段程序,它运行在Server上,提供同客户端 Html页面的接口。这样说大概还不好理解。那么我们看一个实际例子: 现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的cgi程序中,于是cgi程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。
n CGI工作的主要流程是:
1.一个用户请求激活一个CGI应用程序;
2.CGI应用程序将交互主页里用户输入信息提取出来;
3.将用户输入的信息传给服务器主机应用程序(如数据库查询〕;
4.将服务器处理结果通过HTML文件返回给用户;
5.CGI进程结束。
n HTML语言与HTML表单
HTML(超文本标记语言)是用来创建与平台无关的超文本文档的简单标记语言,踟[MI,能够用来标记超文本消息、邮件、文档、超媒体、菜单选项、数据库查询结果以及有内嵌图形的简单结构文档。HTML为文档编码,包括要显示的文本、文本如何格式化的信息、要显示的图片名字(不是图片自身)、以及其他重要信息。连接到一个网页时,Web浏览器(如IE)就在内存中按照HTML的结构“构造”该网页,然后在屏幕上显示组装好的网页。
通常浏览器只能通过HTML请求从服务器获取静态网页进行浏览,如果用户需要通过浏览器提交一些数据给服务器进行处理并返回结果以达到交互的效果则要用到HTML表单。HTML表单是用户通过浏览器提交数据为主要输入手段,它由普通文字、标记和一些称为“控件”的特殊元素(如复选框、单选按钮、菜单等)以及控件上的标签组成。用户通过填写或选择控件内容来输入数据,最后提交给服务器进行处理。
下面是一个表单的示例:
FORM的一些参数解释如下:
1. action指定了调用的CGI脚本
2. methed定义了表单被提交的方法。methed有两种,GET和POST。GET是CGI默认的传输方法,用户输入的数据会附在URL之后传给Web服务器。POST方法传递数据时,服务器端CGI处理程序会从SID躺中接收传输入数据。
3. reset的外观和submit相似,不过一旦用户按下它,这个form中的所有输入值都会被清除,或者是回到初始值。
n CGI的工作机制
上一节讲到浏览器提交数据需要用到HTML表单。那么服务器端是如何对这些数据进行识别和处理呢,这就需要用到CGI,通过CGI可以宪成浏览器与WEB服务器之间的信息交互。
CGI(common gateway interface)WEB 服务器和运行在服务器端的外部程序之间的一个接口规范,按照这个规范编写并运行的外部程序就叫做CGI程序,其目的是实现Web服务器与客户端浏览器之间的动态交互。CGI程序通过由Web服务器来调用实现和WEB浏览器之间的交互,如下图所示,Web服务器将WEB浏览器发送来的信息,传送给CGI程序,由CGI程序进行处理,CGI程序在处理完后将响应结果再回送给Web服务器,然后由Web服务器发送到Web浏览器。如果需要调用其他外部应用如数据库服务等,均由CGl程序去与外部应用进行交互.
浏览器与Web服务器的具体交互过程如下:
(1)客户机使用TCP/IP协议,与服务器建立连接,发送URL请求;
(2)Web服务器到相应的目录中调用CGI程序,使用客户机传递的参数作为CGI程序的参数,而CGI程序调用相应的外部程序完成操作;
(3)CGI程序以能被识别的格式返回处理结果给HTTP服务器;
(4)Web服务器将数据返回客户机处理,显示CGI执行结果。
CGI程序与Web服务器进行通信、传递有关参数和处理结果是通过命令行参数、标准输出、环境变量来实现的。如下图所示,CGI的标准输入(STDIN)是服务器的标准输出(STDOUT),而CGI的标准输出则是服务器的标准输入。客户的请求信息通过服务器的标准输出传送绘CGI的标准输入,CGI对信息进行处理后,将结果发送到它的标准输出,也就是服务器的标准输入,然后由服务器将处理结果发送给客户端。这里以boa为例,整个通信流程图如下所示:
同时,CGI程序可以通过环境变量获取Web服务器传递过来的用户数据,常见的环境变量有:
1. SERVER-NAME:运行CGI序为机器名或IP地址。
2. SERVER-INTERFACE:WWW服务器的类型,如:CERN型或NCSA型。
3. SERVER-PROTOCOL:通信协议,应当是HTTP/1.0。
4. SERVER-PORT:TCP端口,一般说来web端口是80。
5. HTTP-ACCEPT:HTTP定义的浏览器能够接受的数据类型。
6. HTTP-REFERER: 发送表单的文件URL。(并非所有的浏览器都传送这一变量)
7. HTTP-USER-AGENT:发送表单的浏览器的有关信息。
8. GETWAY-INTERFACE:CGI程序的版本,在UNIX下为 CGI/1.1。
9. PATH-TRANSLATED: PATH-INFO中包含的实际路径名。
10. PATH-INFO:浏览器用GET方式发送数据时的附加路径。
11. SCRIPT-NAME: CGI程序的路径名。
12. QUERY-STRING:表单输入的数据,URL中间号后的内容。
13. REMOTE-HOST:发送程序的主机名,不能确定该值。
14. REMOTE-ADDR:发送程序的机器的IP地址。
15. REMOTE-USER:发送程序的人名。
1) 利用shell脚本获取QUERY_STRING环境变量
通常这种方式适用于使用get方法提交的表单,post方法提交的表单要通过标准输出获取。但是对于boa服务器两种方式效果是一样的,即使采用post方式url中依然能获取相应的信息。典型的shell程序如下(友善的led测试脚本,位于/www/leds.cgi):
#!/bin/sh
type=0
period=1
case $QUERY_STRING in
*ping*)
type=0
;;
*counter*)
type=1
;;
*stop*)
type=2
;;
推荐阅读
-
本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ...
[详细]
蜡笔小新 2023-12-14 19:42:01
-
本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ...
[详细]
蜡笔小新 2023-12-14 19:45:47
-
-
本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ...
[详细]
蜡笔小新 2023-12-14 18:55:14
-
本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ...
[详细]
蜡笔小新 2023-12-14 17:15:19
-
本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ...
[详细]
蜡笔小新 2023-12-14 17:13:20
-
这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ...
[详细]
蜡笔小新 2023-12-14 16:19:10
-
本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ...
[详细]
蜡笔小新 2023-12-14 16:12:01
-
本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ...
[详细]
蜡笔小新 2023-12-14 13:59:45
-
VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ...
[详细]
蜡笔小新 2023-12-14 12:55:15
-
本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ...
[详细]
蜡笔小新 2023-12-14 04:33:19
-
本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ...
[详细]
蜡笔小新 2023-12-13 21:31:18
-
本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ...
[详细]
蜡笔小新 2023-12-13 18:29:11
-
本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ...
[详细]
蜡笔小新 2023-12-13 16:50:29
-
本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ...
[详细]
蜡笔小新 2023-12-13 16:14:53
-
本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ...
[详细]
蜡笔小新 2023-12-13 15:57:13
-