由于对HTTP/CGI的工作模式不了解,在网络上找了许久用shell做CGI来提取POST,最终找到了,发现年头挺久的了,http://www.fpx.de/fp/Software/ProcCGIsh.html(其中还有C实现和TCL实现)。

下载地址:http://www.fpx.de/fp/Software/proccgi.sh

贴出shell脚本内容:

 

   
   
   
   
  1. #!/bin/sh 
  2. # Process input to a CGI script. Written and Copyright 1995 Frank Pilhofer 
  3. # You may freely use and distribute this code free of charge provided that 
  4. # this copyright notice remains.            [email protected] 
  5. All variables in here are prefixed by _F_, so you shouldn't have 
  6. any conflicts with your own var names 
  7. # get query string. if $REQUEST_METHOD is "POST"then it must be read 
  8. from stdin, else it's in $QUERY_STRING 
  9. if [ ${DEBUG:-0} -eq 1 ] ; then 
  10.     echo --Program Starts-- 1>&2 
  11. fi 
  12. if [ "$REQUEST_METHOD" = "POST" ] ; then 
  13.     _F_QUERY_STRING=`dd count=$CONTENT_LENGTH bs=1 2> /dev/null`"&" 
  14.     if [ "$QUERY_STRING" != "" ] ; then 
  15.         _F_QUERY_STRING="$_F_QUERY_STRING""$QUERY_STRING""&" 
  16.     fi 
  17.     if [ ${DEBUG:-0} -eq 1 ] ; then 
  18.         echo --Posted String-- 1>&2 
  19.     fi 
  20. else 
  21.     _F_QUERY_STRING="$QUERY_STRING""&" 
  22.     if [ ${DEBUG:-0} -eq 1 ] ; then 
  23.         echo --Query String-- 1>&2 
  24.     fi 
  25. fi 
  26. if [ ${DEBUG:-0} -eq 1 ] ; then 
  27.     ( echo "  " $_F_QUERY_STRING 
  28.       echo --Adding Arguments-- ) 1>&2 
  29. fi 
  30. # if there are arguments, use them as well. 
  31. for _F_PAR in $* ; do 
  32.     _F_QUERY_STRING="$_F_QUERY_STRING""$_F_PAR""&" 
  33.     if [ ${DEBUG:-0} -eq 1 ] ; then 
  34.         echo "  " arg $_F_PAR 1>&2 
  35.     fi 
  36. done 
  37. if [ ${DEBUG:-0} -eq 1 ] ; then 
  38.     ( echo --With Added Arguments-- 
  39.       echo "  " $_F_QUERY_STRING ) 1>&2 
  40. fi 
  41. # if $PATH_INFO is not empty and contains definitions '=', append it as well. 
  42. # but replace slashes by ampersands 
  43. if echo $PATH_INFO | grep = > /dev/null ; then 
  44.     _F_PATH_INFO="$PATH_INFO""//" 
  45.     if [ ${DEBUG:-0} -eq 1 ] ; then 
  46.         ( echo --Adding Path Info-- 
  47.           echo "  " $_F_PATH_INFO ) 1>&2 
  48.     fi 
  49.  
  50.     while [ "$_F_PATH_INFO" != "" -a "$_F_PATH_INFO" != "/" ] ; do 
  51.         _F_QUERY_STRING="$_F_QUERY_STRING""`echo $_F_PATH_INFO | cut -d / -f 1`""&" 
  52.         _F_PATH_INFO=`echo $_F_PATH_INFO | cut -s -d / -f 2-` 
  53.     done 
  54. fi 
  55. # append another '&' to fool some braindead cut implementations. Test yours: 
  56. # echo 'i am braindead!' | cut -d '!' -f 2 
  57. _F_QUERY_STRING="$_F_QUERY_STRING""&" 
  58. if [ ${DEBUG:-0} -eq 1 ] ; then 
  59.     ( echo --Final Query String-- 
  60.       echo "  " $_F_QUERY_STRING ) 1>&2 
  61. fi 
  62. while [ "$_F_QUERY_STRING" != "" -a "$_F_QUERY_STRING" != "&" ] ; do 
  63.     _F_VARDEF=`echo $_F_QUERY_STRING | cut -d \& -f 1` 
  64. #   _F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-` 
  65.     _F_VAR=`echo $_F_VARDEF | cut -d = -f 1` 
  66.     _F_VAL=`echo "$_F_VARDEF""=" | cut -d = -f 2` 
  67.  
  68. # Workaround for more braindead cut implementations that strip delimiters 
  69. at the end of the line (i.e. HP-UX 10) 
  70.  
  71.     if echo $_F_QUERY_STRING | grep -c \& > /dev/null ; then 
  72.         _F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-` 
  73.     else 
  74.         _F_QUERY_STRING="" 
  75.     fi 
  76.  
  77.     if [ ${DEBUG:-0} -eq 1 ] ; then 
  78.         ( echo --Got Variable-- 
  79.           echo "  " var=$_F_VAR 
  80.           echo "  " val=$_F_VAL 
  81.           echo "  " rem=$_F_QUERY_STRING ) 1>&2 
  82.     fi 
  83.     if [ "$_F_VAR" = "" ] ; then 
  84.         continue 
  85.     fi 
  86.  
  87. replace '+' by spaces 
  88.  
  89.     _F_VAL="$_F_VAL""++" 
  90.     _F_TMP= 
  91.  
  92.     while [ "$_F_VAL" != "" -a "$_F_VAL" != "+" -a "$_F_VAL" != "++" ] ; do 
  93.         _F_TMP="$_F_TMP""`echo $_F_VAL | cut -d + -f 1`" 
  94.         _F_VAL=`echo $_F_VAL | cut -s -d + -f 2-` 
  95.  
  96.         if [ "$_F_VAL" != "" -a "$_F_VAL" != "+" ] ; then 
  97.             _F_TMP="$_F_TMP"" " 
  98.         fi 
  99.     done 
  100.  
  101.     if [ ${DEBUG:-0} -eq 1 ] ; then 
  102.         echo "  " vrs=$_F_TMP 1>&2 
  103.     fi 
  104.  
  105. replace '%XX' by ascii character. the hex sequence MUST BE uppercase 
  106.  
  107.     _F_TMP="$_F_TMP""%%" 
  108.     _F_VAL= 
  109.  
  110.     while [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; do 
  111.         _F_VAL="$_F_VAL""`echo $_F_TMP | cut -d % -f 1`" 
  112.         _F_TMP=`echo $_F_TMP | cut -s -d % -f 2-` 
  113.  
  114.         if [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; then 
  115.             if [ ${DEBUG:-0} -eq 1 ] ; then 
  116.                 echo "  " got hex "%" $_F_TMP 1>&2 
  117.             fi 
  118.             _F_HEX=`echo $_F_TMP | cut -c 1-2 | tr "abcdef" "ABCDEF"
  119.             _F_TMP=`echo $_F_TMP | cut -c 3-` 
  120. # can't handle newlines anyway. replace by space 
  121. #           if [ "$_F_HEX" = "0A" ] ; then 
  122. #               _F_HEX="20" 
  123. #           fi 
  124.  
  125.             _F_VAL="$_F_VAL""`/bin/echo '\0'\`echo "16i8o"$_F_HEX"p" | dc\``" 
  126.         fi 
  127.     done 
  128.  
  129. replace forward quotes to backward quotes, since we have trouble handling 
  130. # the former ones. 
  131.  
  132.     _F_VAL=`echo $_F_VAL | tr "'" '\`'` 
  133.  
  134. # if debug, send variables to stderr 
  135.  
  136.     if [ ${DEBUG:-0} -eq 1 ] ; then 
  137.         ( echo --Final Assignment-- 
  138.           echo "FORM_$_F_VAR"=\'$_F_VAL\' ) 1>&2 
  139.     fi 
  140.  
  141. #   /bin/echo "FORM_$_F_VAR"=\'$_F_VAL\' 
  142.     /bin/echo "FORM_$_F_VAR"="'"$_F_VAL"'" 
  143. done 
  144. if [ ${DEBUG:-0} -eq 1 ] ; then 
  145.     echo done. 1>&2 
  146. fi 
  147. # done. 
  148. exit 0