• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            用shell寫cgi --------- 一個解析cgi參數的SHELL腳本(轉)

             測試工作中,經常會涉及到一些要驗證服務器對某些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""http://"
             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 環境變量里面。
             

            順便貼一下cgi-bin目錄的通用配置

             

             

             

                    ScriptAlias /cgi-bin/ /home/www/c

            分類: linux 學習

            posted on 2013-01-16 19:37 大龍 閱讀(2988) 評論(0)  編輯 收藏 引用

            亚洲国产欧美国产综合久久| 久久九九久精品国产| 久久婷婷五月综合国产尤物app| 亚洲午夜久久久久久久久电影网| 亚洲色欲久久久综合网东京热| 久久综合给合久久狠狠狠97色| 色综合久久天天综合| 国产成人综合久久精品红| 国产产无码乱码精品久久鸭 | 精品99久久aaa一级毛片| 久久国内免费视频| 色综合久久中文综合网| 久久精品国产亚洲av麻豆图片| 久久99国产精品99久久| 一本色道久久HEZYO无码| 老司机国内精品久久久久| 99久久无色码中文字幕人妻| 国内精品久久久久久久久| 亚洲AV日韩AV永久无码久久| 久久久久久噜噜精品免费直播| 久久精品国产免费一区| 久久久久亚洲av成人网人人软件| 精品久久久久久无码中文野结衣| 久久夜色精品国产网站| 狠狠色综合网站久久久久久久高清| 91久久九九无码成人网站| 99久久无码一区人妻a黑| 一97日本道伊人久久综合影院| 99久久精品九九亚洲精品| 国产99久久精品一区二区| 欧美一区二区三区久久综| 日本人妻丰满熟妇久久久久久| 欧美久久久久久| 久久这里有精品| 精品国产乱码久久久久久呢 | 99久久无码一区人妻a黑| 无码国内精品久久人妻蜜桃| 性色欲网站人妻丰满中文久久不卡| 久久精品国产久精国产一老狼| 亚洲成色WWW久久网站| 久久亚洲AV成人出白浆无码国产|