`

tomcat5,tomcat6,apache--cgi配置/shell脚本

    博客分类:
  • perl
阅读更多
很多功能都是需要用到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
分享到:
评论

相关推荐

    最新版linux apache-tomcat-9.0.38.tar.gz

    你可以通过访问&lt;https://tomcat.apache.org/download-90.cgi&gt; 获取。在这个案例中,已经有一个名为"apache-tomcat-9.0.38.tar.gz"的压缩包文件,这通常意味着文件已下载完成。 2. **解压**:在Linux终端中,使用`cd...

    jdk+tomcat经典配置----jdk+tomcat经典配置

    ### JDK + Tomcat 经典配置详解 #### 一、环境搭建与配置 在搭建 Java 开发环境时,经常需要将 JDK(Java Development Kit)与 Tomcat 集成在一起,以便于部署 Java Web 应用。下面详细介绍如何在 Windows 操作...

    Apache Tomcat v6.048 Windows64位版

    1. `bin`目录:包含了启动和停止Tomcat的脚本,如`catalina.bat`(Windows批处理文件)和`startup.sh`/`shutdown.sh`(Unix/Linux shell脚本)。此外,还有其他用于管理Tomcat的工具,如`admin.cgi`、`tomcat-users....

    tomcat7,mac,windows

    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协议。 - **关闭自动部署功能:** ...

    从源码安装tomcat6018.pdf

    本文档详细介绍了如何从源码安装 Apache Tomcat 6.0.18 的过程,包括所需的工具、步骤以及可能遇到的问题及其解决方法。通过这种方式,可以深入了解 Tomcat 的内部结构和编译流程,对于希望定制或调试 Tomcat 的用户...

    iOS-Mac配置Tomcat教程 Mac环境配置Tomcat教程

    首先,你需要从Apache Tomcat的官方网站(http://tomcat.apache.org/download-70.cgi)下载最新版本的Tomcat。选择适合你的操作系统的版本,通常是`.tar.gz`格式。 2. **解压并重命名**: 下载完成后,解压缩文件...

    第15章 Apache进阶1

    - **Bash**:作为Linux系统的默认Shell,Bash可以用于编写简单的脚本,实现自动化任务。 - **PHP**:一种广泛用于Web开发的脚本语言,尤其适合服务器端编程,用于创建动态网页。 - **Perl**:一种功能强大的文本...

    shll编程基础Linux进阶

    在“Shell编程基础Linux进阶”这一主题中,我们探讨了如何在Linux环境中进行开发工作,包括使用Shell脚本和安装关键的开发组件。以下是详细的知识点解析: **开发环境搭建** 1. **Xshell和Xftp工具**:这两款工具...

    Ant入门与进阶

    当时,James尝试使用现有的构建工具(如GNU Make、批处理文件和shell脚本)来创建一个跨平台的Tomcat构建过程,但由于这些工具在跨平台兼容性方面的限制,他未能成功。于是,在一次从欧洲返回美国的航班上,James...

    Ant入门与进阶.pdf

    Davidson在尝试使用现有的构建工具(如GNU Make、批处理文件和shell脚本)构建跨平台的Tomcat项目时遇到了挑战。为了解决这一问题,他设计了一种新的构建工具——Ant。 - **设计理念**: Ant的设计理念是提供一个轻量...

    J2EE题库(选择填空)

    - **a) CGI程序在自己的OS Shell中执行**: 这实际上是一种特性,而不是缺点。 - **b) 所有服务提供商都支持CGI程序**: 此项描述与问题无关。 - **c) CGI程序的响应时间较高**: CGI程序每次处理HTTP请求时都需要...

    Jmeter中文手册

    Apache JMeter是一款100%纯Java开发的开源工具,专为测试CS架构(客户端/服务器)的软件而设计,尤其适用于评估和测试静态及动态资源的性能,如静态文件、Java Servlets、CGI脚本、Java对象、数据库查询(SQL语句)...

    运维142问不看一定后悔

    1. **磁盘使用率检测(用shell脚本)**:运维人员通常会编写shell脚本来定期监控磁盘空间,例如使用`df`或`du`命令,结合`awk`或`sed`进行数据处理。 2. **LVS(Linux Virtual Server)负载均衡**:LVS是一种开源的...

    Web安全深度剖析(张柄帅)

    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跨站脚本漏洞 ...

Global site tag (gtag.js) - Google Analytics