很多功能都是需要用到CGI(Common Gateway Interface)进行工作。在使用CGI进行工作时候,我们首先要进行CGI服务器的配置。一般情况下可以直接使用Apache来架设CGI服务器。由于我们后期的一些应用可能是在JEE平台上进行开发,所以在一个可以运行Web Container的Server 上架设CGI服务是有必要的。本文将介绍如何在Tomcat下配置CGI服务。
运用情况,1、后端服务由脚本语言(shell、perl、python)提供,前端js ajax调用
一、tomcat下的cgi配置如下:
1、tomcat5、6都需要修改
a、 在Tomcat的conf/web.xml 文件中,把关于<servlet-name> CGI的那段的注释去掉。内容样式如下:
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value>/bin/sh</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
cgiPathPrefix与cgi的存放目录有关系,excutable与cgi的语言有关系,Tomcat默认的cgi语言为perl,需要自已添加进去,它的值就是我们用来解释CGI脚本的程序。
linux下 shell :/bin/sh
perl :/bin/perl
c/c++都行,类推
b、 在Tomcat的%CATALINA_BASE%/conf/web.xml文件中,把关于对CGI进行映射的那段的注释去掉。内容样式如下:
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
其中url-pattern就是将来我们访问CGI脚本的url地址模式。
2、tomcat5比6多的配置
a、把servlets-cgi.renametojar (在%CATALINA_HOME%/server/lib/目录下)改名为servlets-cgi.jar。
b、配置权限
在conf/context.xml 修改下面这一行
<Context privileged="true">
不配置权限,将会出现java.lang.SecurityException: Servlet of class org.apache.catalina.servlets.CGIServlet is privileged and cannot be loaded by this web application这一异常。
完成上面几个步骤后,我们的Tomcat服务器就具有了运行CGI脚本的能力了。
配置过程中遇到一个问题,就是静态网页可以正常显示,但点击其中的cgi连接时,cgi就被当成文件下载了,而不是由服务器解释执行。
Apache会在html所在当前文件夹下寻找cgi文件。但默认的cgi前缀是WEB-INF/cgi-bin,路径不对,无法执行
二、cgi测试
1、shell 脚本cgi
参考
http://lovingtree.blog.163.com/blog/static/14485342008834225624/
测试工作中,经常会涉及到一些要验证服务器对某些cgi接口查询结果返回信息进行解析是否正确的情况。而提供cgi接口的通常又是另外的部门,测试的时候需要调试一些返回结果不方便。所以需要自己模拟虚假的cgi接口来达到同样的目的。
比如说,类似http://www.yousite.com/query.cgi?username=***&kind=***这样的接口会根据username和kind的值的不同返回6类结果,每一类结果,请求服务器都会针对地走不同的处理流程,这就需要每一个返回结果都需要模拟到,于是乎,建立模拟的cgi接口势在必行。以前自己也没有接触过cgi程序,翻了一些基础资料发现总体框架也不是很复杂,而解析html发过来的参数有不少现成的程序可以使用,不用自己写了。因为只是需要简单的模拟返回结果,所以用shell写cgi程序,开始用了uncgi解析,配置很方便,具体方法可以看:
http://www.midwinter.com/~koreth/uncgi.html
后来又发现一个shell写的解析程序proccgi.sh,似乎在简单的cgi接口中使用更方便
proccgi.sh文件内容如下:
#!/bin/sh
#
# Process input to a CGI script. Written and Copyright 1995 Frank Pilhofer
# You may freely use and distribute this code free of charge provided that
# this copyright notice remains. fp@informatik.uni-frankfurt.de
#
# All variables in here are prefixed by _F_, so you shouldn't have
# any conflicts with your own var names
#
# get query string. if $REQUEST_METHOD is "POST", then it must be read
# from stdin, else it's in $QUERY_STRING
#
if [ ${DEBUG:-0} -eq 1 ] ; then
echo --Program Starts-- 1>&2
fi
#
if [ "$REQUEST_METHOD" = "POST" ] ; then
_F_QUERY_STRING=`dd count=$CONTENT_LENGTH bs=1 2> /dev/null`"&"
if [ "$QUERY_STRING" != "" ] ; then
_F_QUERY_STRING="$_F_QUERY_STRING""$QUERY_STRING""&"
fi
if [ ${DEBUG:-0} -eq 1 ] ; then
echo --Posted String-- 1>&2
fi
else
_F_QUERY_STRING="$QUERY_STRING""&"
if [ ${DEBUG:-0} -eq 1 ] ; then
echo --Query String-- 1>&2
fi
fi
if [ ${DEBUG:-0} -eq 1 ] ; then
( echo " " $_F_QUERY_STRING
echo --Adding Arguments-- ) 1>&2
fi
#
# if there are arguments, use them as well.
#
for _F_PAR in $* ; do
_F_QUERY_STRING="$_F_QUERY_STRING""$_F_PAR""&"
if [ ${DEBUG:-0} -eq 1 ] ; then
echo " " arg $_F_PAR 1>&2
fi
done
if [ ${DEBUG:-0} -eq 1 ] ; then
( echo --With Added Arguments--
echo " " $_F_QUERY_STRING ) 1>&2
fi
#
# if $PATH_INFO is not empty and contains definitions '=', append it as well.
# but replace slashes by ampersands
#
if echo $PATH_INFO | grep = > /dev/null ; then
_F_PATH_INFO="$PATH_INFO""//"
if [ ${DEBUG:-0} -eq 1 ] ; then
( echo --Adding Path Info--
echo " " $_F_PATH_INFO ) 1>&2
fi
while [ "$_F_PATH_INFO" != "" -a "$_F_PATH_INFO" != "/" ] ; do
_F_QUERY_STRING="$_F_QUERY_STRING""`echo $_F_PATH_INFO | cut -d / -f 1`""&"
_F_PATH_INFO=`echo $_F_PATH_INFO | cut -s -d / -f 2-`
done
fi
#
# append another '&' to fool some braindead cut implementations. Test yours:
# echo 'i am braindead!' | cut -d '!' -f 2
#
_F_QUERY_STRING="$_F_QUERY_STRING""&"
#
if [ ${DEBUG:-0} -eq 1 ] ; then
( echo --Final Query String--
echo " " $_F_QUERY_STRING ) 1>&2
fi
#
while [ "$_F_QUERY_STRING" != "" -a "$_F_QUERY_STRING" != "&" ] ; do
_F_VARDEF=`echo $_F_QUERY_STRING | cut -d \& -f 1`
# _F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-`
_F_VAR=`echo $_F_VARDEF | cut -d = -f 1`
_F_VAL=`echo "$_F_VARDEF""=" | cut -d = -f 2`
#
# Workaround for more braindead cut implementations that strip delimiters
# at the end of the line (i.e. HP-UX 10)
#
if echo $_F_QUERY_STRING | grep -c \& > /dev/null ; then
_F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-`
else
_F_QUERY_STRING=""
fi
if [ ${DEBUG:-0} -eq 1 ] ; then
( echo --Got Variable--
echo " " var=$_F_VAR
echo " " val=$_F_VAL
echo " " rem=$_F_QUERY_STRING ) 1>&2
fi
if [ "$_F_VAR" = "" ] ; then
continue
fi
#
# replace '+' by spaces
#
_F_VAL="$_F_VAL""++"
_F_TMP=
while [ "$_F_VAL" != "" -a "$_F_VAL" != "+" -a "$_F_VAL" != "++" ] ; do
_F_TMP="$_F_TMP""`echo $_F_VAL | cut -d + -f 1`"
_F_VAL=`echo $_F_VAL | cut -s -d + -f 2-`
if [ "$_F_VAL" != "" -a "$_F_VAL" != "+" ] ; then
_F_TMP="$_F_TMP"" "
fi
done
if [ ${DEBUG:-0} -eq 1 ] ; then
echo " " vrs=$_F_TMP 1>&2
fi
#
# replace '%XX' by ascii character. the hex sequence MUST BE uppercase
#
_F_TMP="$_F_TMP""%%"
_F_VAL=
while [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; do
_F_VAL="$_F_VAL""`echo $_F_TMP | cut -d % -f 1`"
_F_TMP=`echo $_F_TMP | cut -s -d % -f 2-`
if [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; then
if [ ${DEBUG:-0} -eq 1 ] ; then
echo " " got hex "%" $_F_TMP 1>&2
fi
_F_HEX=`echo $_F_TMP | cut -c 1-2 | tr "abcdef" "ABCDEF"`
_F_TMP=`echo $_F_TMP | cut -c 3-`
#
# can't handle newlines anyway. replace by space
#
# if [ "$_F_HEX" = "0A" ] ; then
# _F_HEX="20"
# fi
_F_VAL="$_F_VAL""`/bin/echo '\0'\`echo "16i8o"$_F_HEX"p" | dc\``"
fi
done
#
# replace forward quotes to backward quotes, since we have trouble handling
# the former ones.
#
_F_VAL=`echo $_F_VAL | tr "'" '\`'`
#
# if debug, send variables to stderr
#
if [ ${DEBUG:-0} -eq 1 ] ; then
( echo --Final Assignment--
echo "FORM_$_F_VAR"=\'$_F_VAL\' ) 1>&2
fi
# /bin/echo "FORM_$_F_VAR"=\'$_F_VAL\'
/bin/echo "FORM_$_F_VAR"="'"$_F_VAL"'"
done
#
if [ ${DEBUG:-0} -eq 1 ] ; then
echo done. 1>&2
fi
#
# done.
#
exit 0
使用方法:
在自己的cgi脚本中直接调用这个shell解析参数即可,如:
eval `proccgi.sh $*` # 可以把proccgi.sh放在你服务器的cgi-bin目录
如果上面的调用出错,尝试用绝对路径调用 eval `/home/www/cgi-bin/proccgi.sh $*`
例子,比如有一个cgi接口,按照下面的参数调用:
http://your-website/cgi-bin/mycript?username=your_name&password=mypass
返回结果:
your_name
mypass
则,mycript的内容为:
#!/bin/sh
eval `/home/www/cgi-bin/proccgi.sh $*`
echo Content-type: text/plain
echo
echo $FORM_username
echo $FORM_password
参数里面每一对key/value存储在$FORM_key 环境变量里面。
2、c语言 (windows下的,未经测试)
a创建cgitest4.cpp
b生成 cgitest4.exe,并在WEB-INF下创建目录cgi,将cgitest4.exe放置其中
c、浏览器通过 http://localhost:8080/yourweb/cgi-bin/cgitest4.exe即可访问
8080为服务器端口,更改为自己的,yourweb也改成自己的网站目录
cgitest4.cpp
#include "stdio.h"
#include "stdafx.h"
void main()
{
FILE* f = fopen("bbb.txt","w");
fprintf(f,"hello world");
fclose(f);
printf("content-type:text/html;\r\n\r\n");
printf("<html><body>hello world</body></html>");
}
三、apache支持cgi
apache默认支持cgi,很容易
参考
http://hi.baidu.com/higkoo/blog/item/d3af504e85ede8c6d0c86ac0.html
分享到:
相关推荐
你可以通过访问<https://tomcat.apache.org/download-90.cgi> 获取。在这个案例中,已经有一个名为"apache-tomcat-9.0.38.tar.gz"的压缩包文件,这通常意味着文件已下载完成。 2. **解压**:在Linux终端中,使用`cd...
### JDK + Tomcat 经典配置详解 #### 一、环境搭建与配置 在搭建 Java 开发环境时,经常需要将 JDK(Java Development Kit)与 Tomcat 集成在一起,以便于部署 Java Web 应用。下面详细介绍如何在 Windows 操作...
1. `bin`目录:包含了启动和停止Tomcat的脚本,如`catalina.bat`(Windows批处理文件)和`startup.sh`/`shutdown.sh`(Unix/Linux shell脚本)。此外,还有其他用于管理Tomcat的工具,如`admin.cgi`、`tomcat-users....
Apache Tomcat 7 是一个广泛使用的开源软件,用于部署和运行Java Servlets和JavaServer Pages (JSP)。它是一个轻量级应用服务器,特别针对Web应用程序,是Java EE(企业版)的一部分。Tomcat 7是其7.x系列的一个稳定...
- 解压`lib/Catalina.jar`并修改`org/apache/catalina/util/ServerInfo.properties`文件中的`serverinfo`字段以更改Tomcat版本信息。 - **更改默认监听端口:** - 考虑禁用AJP协议。 - **关闭自动部署功能:** ...
本文档详细介绍了如何从源码安装 Apache Tomcat 6.0.18 的过程,包括所需的工具、步骤以及可能遇到的问题及其解决方法。通过这种方式,可以深入了解 Tomcat 的内部结构和编译流程,对于希望定制或调试 Tomcat 的用户...
首先,你需要从Apache Tomcat的官方网站(http://tomcat.apache.org/download-70.cgi)下载最新版本的Tomcat。选择适合你的操作系统的版本,通常是`.tar.gz`格式。 2. **解压并重命名**: 下载完成后,解压缩文件...
- **Bash**:作为Linux系统的默认Shell,Bash可以用于编写简单的脚本,实现自动化任务。 - **PHP**:一种广泛用于Web开发的脚本语言,尤其适合服务器端编程,用于创建动态网页。 - **Perl**:一种功能强大的文本...
在“Shell编程基础Linux进阶”这一主题中,我们探讨了如何在Linux环境中进行开发工作,包括使用Shell脚本和安装关键的开发组件。以下是详细的知识点解析: **开发环境搭建** 1. **Xshell和Xftp工具**:这两款工具...
当时,James尝试使用现有的构建工具(如GNU Make、批处理文件和shell脚本)来创建一个跨平台的Tomcat构建过程,但由于这些工具在跨平台兼容性方面的限制,他未能成功。于是,在一次从欧洲返回美国的航班上,James...
Davidson在尝试使用现有的构建工具(如GNU Make、批处理文件和shell脚本)构建跨平台的Tomcat项目时遇到了挑战。为了解决这一问题,他设计了一种新的构建工具——Ant。 - **设计理念**: Ant的设计理念是提供一个轻量...
- **a) CGI程序在自己的OS Shell中执行**: 这实际上是一种特性,而不是缺点。 - **b) 所有服务提供商都支持CGI程序**: 此项描述与问题无关。 - **c) CGI程序的响应时间较高**: CGI程序每次处理HTTP请求时都需要...
Apache JMeter是一款100%纯Java开发的开源工具,专为测试CS架构(客户端/服务器)的软件而设计,尤其适用于评估和测试静态及动态资源的性能,如静态文件、Java Servlets、CGI脚本、Java对象、数据库查询(SQL语句)...
1. **磁盘使用率检测(用shell脚本)**:运维人员通常会编写shell脚本来定期监控磁盘空间,例如使用`df`或`du`命令,结合`awk`或`sed`进行数据处理。 2. **LVS(Linux Virtual Server)负载均衡**:LVS是一种开源的...
6.1.2 Apache解析漏洞 109 6.1.3 PHP CGI解析漏洞 110 6.2 绕过上传漏洞 110 6.2.1 客户端检测 112 6.2.2 服务器端检测 115 6.3 文本编辑器上传漏洞 123 6.4 修复上传漏洞 127 6.5 小结 128 第7章 XSS跨站脚本漏洞 ...