類比HTTP請求的返回&shell寫cgi

來源:互聯網
上載者:User

標籤:

測試中偶爾會有這樣的需求:
1.需要訪問外網的cgi或連結地址,但訪問不通
2.需要構造cgi特定的返回,但正常情況下難以構造
為了獲得想要的結果,此時可以類比http請求的返回滿足測試需要

 

方法一:直接擷取結果檔案

在apache配置的對應路徑下建立一個檔案,如

DocumentRoot /data/server/xxxx/htdocs

然後用IP/檔案名稱來訪問,或者放在alias指定的檔案夾下面

建立一個檔案名稱字,比如result,鍵入以下內容:

result=0&res_info=OK

 

在瀏覽器裡直接輸入http://xxx.xxx.xxx.xxx/result,訪問該檔案,可以看到返回結果

 

 

這個只是相當於把檔案內容給取出來了,如果真正類比cgi的返回的話我一般用shell寫個樁cgi

 

方法二:寫一個樁cgi

什麼是cgi,見apache指南:cgi

http://man.chinaunix.net/newsoft/ApacheManual/howto/cgi.html

簡言之,要自己寫一個cgi需要如下條件:1.apache配置支援cgi

一般機器上有部署過cgi,在該目錄下編寫一個自己寫的cgi是不會有什麼不支援的問題,如果是在其他目錄新部署自己的cgi,也許會遇到apache的支援問題

如,直接在剛才的目錄下面建立一個shell指令碼,如test.sh

#!/bin/shprint "result=0&res_info=OK"

 

 再在瀏覽器裡運行,啟動並執行結果就是把這個指令檔下載下來,而不是執行輸出

必須配置Apache以允許CGI的執行,其方法有多種:

  (1)ScriptAlias

  ScriptAlias指令使Apache允許執行一個特定目錄中的CGI程式。當用戶端請求此特定目錄中的資源時,Apache假定其中檔案都是CGI程式並試圖運行。

  ScriptAlias指令形如: 

ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/

  如果Apache被安裝到預設的位置,預設的設定檔httpd.conf中則會有上述配置。ScriptAlias指令定義了映射到一個特定目錄的URL首碼,與Alias指令非常相似,兩者一般都用於指定位於DocumentRoot目錄以外的目錄,其區別是ScriptAlias又多了一層含義,即其URL首碼中任何檔案都被視為CGI程式。所以,上述例子會指示Apache,/cgi-bin/應該指向/usr/local/apache/cgi-bin/目錄,且視之為CGI程式。

 

  (2)用Options顯式地允許CGI的執行

可以在主伺服器設定檔中,使用Options指令顯式地允許特定目錄中CGI的執行:

<Directory /usr/local/apache/htdocs/somedir>Options +ExecCGI</Directory>

上述指令使Apache允許CGI檔案的執行。另外,還必須告訴伺服器哪些檔案是CGI檔案。下面的AddHandler指令告訴伺服器所有帶有cgi或pl尾碼的檔案是CGI程式:

AddHandler cgi-script cgi pl

 

  (3).htaccess檔案

  在主伺服器配置中如此配置:

AllowOverride Options

  在.htaccess檔案中,需要如此配置:  

Options +ExecCGI

  以使Apache允許此目錄中CGI程式的執行。 

 

 

2.按照cgi的格式輸出內容

在CGI程式的所有輸出前面必須有一個MIME類型的頭,即HTTP頭

有三個類型的頭部: Content-type, Location, 和Status. Content-type 最普遍的。

有關content-type解釋可以見有關HTML的說明, 一個你可以發出的特定編碼象這樣:Content-type: text/html在這個例子中,輸出資料的類型是text/html; 換句話說, 他是個HTML檔案. 其他詳盡的說明參照apache文檔

基本使用方法是

 

echo "xxxxxxx"echo ""

其他詳盡的說明參照apache文檔

 

 

 

看完了1和2後可以做一個簡單的demo:

apache配置為:

ScriptAlias /cgi-bin/ /data/server/xxxxxx/htdocs/cgi-bin/

 在目錄下建立檔案test.sh(寫成test.cgi可能會逼格高一點,實際是一樣的)

#!/bin/shecho "Content-type:text/html;charset=UTF8\n"echo ""echo "result=0&res_info=OK"

執行後應該能夠返回

result=0&res_info=OK

 

再讓我們幹點cgi應該乾的事情,解析輸入,進行處理,再輸出

這裡要能夠擷取請求串中的參數就需要從環境變數env中取出REQUEST_METHOD和QUERY_STRING

REQUEST_METHOD為提交方式 get或post

QUERY_STRING為請求參數串,可能需要自己分割處理下

比如我需要調一個cgi查詢手機號的驗證碼,傳入的是手機號,處理邏輯是sql查詢,返回的是查詢結果

 

#!/bin/shecho "Content-type:text/html;charset=UTF8\n"echo ""method="$REQUEST_METHOD"mobile=`echo  $QUERY_STRING | cut -d "=" -f2`y=${mobile:0-3:1}xx=${mobile:0-2:2}verifycode=""verifycode=`mysql -uroot -p111111 -e "select Fverify_code from verify_code_$xx.t_code_$y where Fmobile_no=‘$mobile‘ order by Fcreate_time  desc limit 1"|grep -v Fverify_code`
if [ !-n $verifycode ]; thenecho "fail"elseecho $verifycodefi

 curl "http://172.27.207.203:23080/wx_pay/v1.0/wx_get_sms.cgi?mobile=13xxxxxxxxxx” 或直接在瀏覽器中訪問,返回的就是驗證碼,若不帶參數或者mobile錯誤,則返回的是"fail"

 

 

類比HTTP請求的返回&shell寫cgi

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.