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

            分類: linux 學習

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

            欧美午夜精品久久久久久浪潮| 一本色道久久88精品综合| 久久夜色精品国产网站| 人人狠狠综合久久88成人| 久久综合狠狠综合久久激情 | 久久国产精品波多野结衣AV | 无码人妻久久一区二区三区蜜桃 | 久久亚洲高清综合| 99蜜桃臀久久久欧美精品网站 | 久久婷婷国产麻豆91天堂| 性高朝久久久久久久久久| 99久久精品免费看国产一区二区三区| 国产精品久久精品| 久久婷婷色香五月综合激情| 91精品国产9l久久久久| 午夜天堂精品久久久久| 久久久久国产日韩精品网站| 精品无码久久久久久午夜| 久久伊人五月丁香狠狠色| 久久99亚洲综合精品首页| 国内精品久久九九国产精品| 性欧美大战久久久久久久久 | 午夜精品久久久久久| 国产综合精品久久亚洲| 久久国产精品-国产精品| 久久丫精品国产亚洲av不卡| 中文字幕乱码久久午夜| 亚洲国产天堂久久久久久| 亚洲人成无码久久电影网站| 精品久久久久久无码中文字幕| 久久精品国产免费| 久久er热视频在这里精品| 国产精品久久亚洲不卡动漫| 国内精品久久久久久99| 99久久婷婷国产综合亚洲| 国产精品久久99| 久久免费精品一区二区| 久久久久久毛片免费看| 久久久国产打桩机| 久久婷婷成人综合色综合| 91精品国产9l久久久久|