• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            用shell寫cgi --------- 一個解析cgi參數(shù)的SHELL腳本(轉(zhuǎn))

             測試工作中,經(jīng)常會涉及到一些要驗證服務(wù)器對某些cgi接口查詢結(jié)果返回信息進行解析是否正確的情況。而提供cgi接口的通常又是另外的部門,測試的時候需要調(diào)試一些返回結(jié)果不方便。所以需要自己模擬虛假的cgi接口來達到同樣的目的。

                  比如說,類似http://www.yousite.com/query.cgi?username=***&kind=*** 這樣的接口會根據(jù)username和kind的值的不同返回6類結(jié)果,每一類結(jié)果,請求服務(wù)器都會針對地走不同的處理流程,這就需要每一個返回結(jié)果都需要 模擬到,于是乎,建立模擬的cgi接口勢在必行。以前自己也沒有接觸過cgi程序,翻了一些基礎(chǔ)資料發(fā)現(xiàn)總體框架也不是很復(fù)雜,而解析html發(fā)過來的參 數(shù)有不少現(xiàn)成的程序可以使用,不用自己寫了。因為只是需要簡單的模擬返回結(jié)果,所以用shell寫cgi程序,開始用了uncgi解析,配置很方便,具體 方法可以看:

            http://www.midwinter.com/~koreth/uncgi.html

             

            后來又發(fā)現(xiàn)一個shell寫的解析程序proccgi.sh,似乎在簡單的cgi接口中使用更方便

             

             

            proccgi.sh文件內(nèi)容如下:

            #!/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腳本中直接調(diào)用這個shell解析參數(shù)即可,如:

                   eval `proccgi.sh $*`        # 可以把proccgi.sh放在你服務(wù)器的cgi-bin目錄

                  如果上面的調(diào)用出錯,嘗試用絕對路徑調(diào)用  eval `/home/www/cgi-bin/proccgi.sh $*`

             

             

                  例子,比如有一個cgi接口,按照下面的參數(shù)調(diào)用:

                  http://your-website/cgi-bin/mycript?username=your_name&password=mypass

                  返回結(jié)果:

                  your_name

                  mypass

             

                則,mycript的內(nèi)容為:

             

            #!/bin/sh

            eval `/home/www/cgi-bin/proccgi.sh $*`

            echo Content-type: text/plain

            echo

            echo $FORM_username

            echo $FORM_password

             

             

             

             

              

                  參數(shù)里面每一對key/value存儲在$FORM_key 環(huán)境變量里面。
             

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

             

             

             

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

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

            久久精品国产亚洲AV麻豆网站| 欧美日韩精品久久久免费观看| 久久夜色撩人精品国产| 久久国产热精品波多野结衣AV| 亚洲国产欧洲综合997久久| 亚洲国产成人久久综合一区77| 伊人热人久久中文字幕| 99久久精品国产一区二区三区 | 精品久久久久久成人AV| 亚洲AV无码久久精品色欲| 性欧美大战久久久久久久久 | 日本福利片国产午夜久久| 999久久久无码国产精品| 久久国产乱子伦精品免费强| 青青草原1769久久免费播放| 国产精品免费久久| 日本亚洲色大成网站WWW久久| 亚洲精品美女久久久久99小说 | 熟妇人妻久久中文字幕| 99国产欧美久久久精品蜜芽| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久国产乱子伦精品免费强| 久久久精品久久久久久| 日韩中文久久| 久久久亚洲欧洲日产国码二区| 久久99久久99精品免视看动漫| 久久夜色精品国产亚洲| 亚洲国产精品嫩草影院久久| 婷婷久久香蕉五月综合加勒比| 久久香蕉国产线看观看99| 免费一级欧美大片久久网| 亚洲∧v久久久无码精品| 精品久久久久久无码免费| 亚洲精品tv久久久久| 丰满少妇高潮惨叫久久久| 四虎影视久久久免费观看| 久久99精品国产一区二区三区| 伊人久久大香线蕉综合网站| 久久99热狠狠色精品一区| 国产精品成人久久久| 国产激情久久久久影院老熟女免费|