FAQ 問答集 - CGI Perl
索引:
什麼是 CGI?它可以作什麼? 2000-03-07
CGI 程式不能執行最常發生的狀況有哪些? 1998-08-04
我的 CGI 程式不能執行,我該怎麼辦? 1998-08-04
我是 TacoCity 的居民,我執行 CGI 程式時出現 The server made a boo boo. 的訊息.... 1998-08-04
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: System Error: execv() failed
Error: No such file or directory (2) 1998-08-04
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: Script is not executable. Issue chmod 755 ...... 1998-08-04
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: Script File Not Found! 1998-08-04
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: User not in allow file! 1998-08-04
執行 CGI 程式時出現如下的訊息:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request
Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error. 1998-08-04
我要如何才能在 CGI 程式中將留言者填寫資料中的 HTML 標籤指令過濾掉? 1998-08-11
如何排除 Perl 程式處理中文資料的障礙? 2000-01-30
執行 CGI 程式時出現如下的訊息:
The requested method POST is not allowed for the URL /..../cgi-bin/rsgb.pl 2000-08-24
我的網頁設在北美地區,但是我希望留言板紀錄的是台北時間,我該怎麼做? 1999-12-12
為何我在家裡用 Windows 95 測試我的 Perl 程式可以正常執行,上載到網站上之後卻不能執行? 1998-08-12
為何我的留言板程式可以正常執行,但是卻無法將新的留言寫入檔案內? 1998-08-12
我想在家裡測試網頁與 CGI 程式,我需要什麼軟體? 2000-08-30
我要如何才能讓使用者留言後,不需 Reload 就可以直接看到自己的留言? 1999-10-21
我要如何確保 CGI 程式能正確的擷取傳入的參數? 1998-08-12
如何才能禁止別人由其它的網頁來執行我的 CGI 程式? 1998-08-15
網路上有哪些提供 CGI 免費空間的網站?其 CGI 相關設定為何? 2000-08-26
何謂真實路徑?什麼又是相對路徑? 1999-08-11
如何上傳 CGI 程式及設定程式檔案的屬性? 1999-10-21
如何對 Perl 程式進行 Debug 程序? 1999-10-25
如何對目錄或網頁進行密碼保護? 2000-11-30
我的程式上傳後可以正常執行,但是結果卻不對,我該怎麼辦? 2000-07-04
CGI 程式應該用那一種程式來作編修呢? 2000-10-14
--------------------------------------------------------------------------------
CGI 程式應該用那一種程式來作編修呢?
(Oct. 14, 2000)
這個問題其實很簡單,可能初學者會因為尚不熟悉所以會有些疑慮,我還是作個簡單的說明供大家參考一下吧:
CGI 程式並非專指某一種電腦語言所撰寫的程式,而是指任何一種腦語言所撰寫出符合 CGI 運作規則的程式,我想釵h的初學者可能會將 Perl 語言和 CGI 畫上等號,而將兩個名詞混淆了,暫不論到底是否有人將 CGI 與 Perl 這兩個名詞混淆了,基本上各類 CGI 程式的「原始碼」都是以標準文字型態呈現的,只是有的語言屬於「編譯式」的,必須要將原始碼編譯成「中間碼」或「執行碼」後才能執行,這類經過編譯的執行檔案,其內容就不是原來可供嬝牧滬鴝l碼了,而有的語言是屬於「解譯式」的,程式寫好之後直接以原始碼的型態交由「解譯程式」作解譯即可執行,使用 Perl 語言所撰寫出來的 CGI 程式即屬這種解譯式的程式。
標題所示的問題其實有語病,因為「程式」檔案可能指的是「編譯過」的「執行檔」,而這種執行檔並非一般人可以對其作「編修」的,同時有鑑於前段所述有人將 CGI 及 Perl 這兩個名詞混淆了,所以問題可能問的是「要如何對 Perl 語言所撰寫的 CGI 程式檔案作編修?」,
有點扯遠了,讓我們回到正題來,前一段我講到基本上各類 CGI 程式的「原始碼」都是以標準文字型態呈現的,因此在對程式的原始碼作編修時,僅需使用可以處理標準文字檔案的工具程式即可,這類程式我們通常稱之為「文書編輯程式」或者是「文字編輯程式」,英文通常稱文字型態檔案為 ASCII 或 TEXT 檔,可以對這些檔案正常作讀取、編修、儲存的程式,最簡單的有視窗系統所附到的「筆記本」程式(也就是 NotePad 程式),其實像是 WordPad 或者是 MS-Word 這類程式一樣可以編修標準文字檔,只是在儲存時要留意儲存的類別一定要確定選擇成文字文件 (Text)或純文字 (ASCII)的格式,可千萬記得不要選擇儲存成 Word (.doc) 或者是 Rich Text (.rtf)....等其它的格式喔~
為了避免不必要的麻煩,筆者建議您最好不要使用那些可以處理多種格式的程式來編修文字檔案,找一個單純一點的文書編輯程式來使用比較好,本網頁整理了一些免費文書處理程式的相關資訊與下載連結,這些程式基本上都可以拿來編修各類程式的原始碼檔案,您可以在本網頁選單點選「免費資源」的「免費軟體下載」,然後在點選一個名為「文書處理」的類別項目就可以了,我自己目前最常使用的是 EmEditor 程式,該程式的相關資訊也有整理在該項目內,您不妨參考一下。
我的程式上傳後可以正常執行,但是結果卻不對,我該怎麼辦?
(Jun. 04, 2000)
在自己的個人電腦上安裝有相關的環境時,可以參考 "如何對 Perl 程式進行 Debug 程序?" 一文來對程式作除錯的動作,而上傳到網站上之後,您就無法用前述文章的方式來作除錯了,除非您能獲得站台主機的 Telnet 使用權,那麼這樣子不是就很麻煩了嗎?程式又未顯示出相關的錯誤訊息,到底該如何才能瞭解問題出在哪裡呢?
會碰到這種情形,大部分都是撰寫程式者為了簡化程式而將一些「錯誤處理」程序給省略了,因此發生一些問題時,無法獲得相關的訊息提示,例如:開啟某個並不存在的檔案、讀取到的資料為空資料時....,按照正規的寫法都應該在處理這些動作時加上相關的訊息提示,然後將程式結束掉,否則程式將會繼續的執行,因此會有程式發生錯誤,卻未顯示錯誤訊息的現象產生。
要想對於這類程式作除錯的動作,那就只有先判斷程式可能發出問題的是那一段程序?然後在該處加上一段顯示資料或訊息的敘述並結束程式,這裡我提供一個簡單的方式,並舉幾個例子來作說明:
到底執行到哪裡了?:
原來的敘述:
&MyProcedure1;
&MyProcedure2;
&MyProcedure3;
插一段敘述(以紅色標示的部分)到原敘述之內:
print "Content-type: text/html
";
&MyProcedure1;
print "1";
&MyProcedure2;
print "2";
&MyProcedure3;
print "3";
exit;
解說:
有時候您並無法在一開始就找到發生問題的那段敘述,因此我們可以在某些重要的敘述之前加上一個顯示的動作,然後藉此瞭解到底是在那一段之前發生錯誤的?以本例來說,若執行後連 1 都未顯示出來,那麼顯然問題出在 MyProcedure1 這個程序裡,若顯示出 123 這三個數字,那麼我們就可以假設問題出在 MyProcedure3 這個程序了,接著再到 MyProcedure3 這個程序內插入其它的識別數字、字樣的顯示敘述即可,重複這樣的動作一直到找出問題的所在處。
結果是通過那一個步驟了?
原來的敘述:
if($value eq $check){
...
}else{
...
}
插一段敘述(以紅色標示的部分)到原敘述之內:
print "Content-type: text/html
";
if($value eq $check){
print "1";
...
}else{
print "2";
...
}
exit;
解說:
執行的結果若顯示為 1,那麼顯然的 if(....) 的判斷式是成立的,否則將換顯示出 2 這個數字。
比對字串未達預期的結果:
原來的敘述:
if($value eq $check){
...
}else{
...
}
插一段敘述(以紅色標示的部分)到原敘述之前:
print "Content-type: text/html
";
print "value = ($value)";
print "<br>";
print "check = ($check)";
exit;
if($value eq $check){
...
}else{
...
}
解說:
本例插入的敘述係將 $value 及 $check 兩個變數的內容直接顯示出來,而為了能知道變數是否為空字串?所以在變數外圍加上左、右括號。
比對字串看起來一樣,卻依然未達預期的結果:
原來的敘述:
if($value eq $check){
...
}else{
...
}
插一段敘述(以紅色標示的部分)到原敘述之前:
print "Content-type: text/html
";
print "value len = ".length($value);
print "<br>";
print "check len = ".length($check);
exit;
if($value eq $check){
...
}else{
...
}
解說:
本例插入的敘述係將 $value 及 $check 兩個變數內含值的「長度」顯示出來,這是為了避免字串中含有「不可視」(看不見)的字元碼在內,例如換行字元....等,而被系統欺騙掉,如果使用前一個範例所看到的變數內容是一樣的,仍無法通過那個 if(....) 的判斷式,那麼就很有可能是某個變數含有隱藏的「不可視」字元了,利用本例的方式將可確認是否為這個問題?如果真的有長度不一的現象的話,可以在 if(....) 這個判斷式之前,使用 chop 這個函數來過濾掉隱藏的換行字元。
藉由上面的這些範例說明,您可以對一些變數或資料作相關的檢查,以下是一些項目及重點:
由 HTML 檔案傳遞給程式的參數。
路徑與檔案是否存在?
檔案的開啟是否正常?
檔案到底有無建立成?
檔案內到底有無資料?
由檔案讀取出的資料。
各個變數的轉換處理。
數字的加減。
當然啦,當您藉由上述方法找出問題所在,並將以修正後,記得要將插入的測試敘述刪除掉,同時要再執行過一次,以確定程式確實能正確的執行了,如果您的時間允釭爾隉A最好還是將程式處理步驟改得正規些比較好,以免以後再次碰到類似的狀況,或者提供給他人使用時,他人也會碰到類似的困擾。
如何對目錄或網頁進行密碼保護?
(Nov. 30, 2000)
其實這個問題很早以前就有網友陸續向我詢問過了,因為這個動作比較複雜些,對於部分網頁新手們而言並不是很容易搞清楚的,因此我個人雖然知道如何設置密碼檢核的動作,卻一直未能騰出時間將設置方法整理出來供網友參考,主要的是我希望能寫好一支密碼管理的程式後,再一併穡儥繾隊W來,這樣可能會比較方便,但是這件事情卻一拖就拖了一年多,近日又有數位網友提及,為了避免再拖上個一年半載,我設法抽了個空撰寫本文,希望能對有設置密碼需求的網友們有幫助,我將設置步驟與相關說明敘述如下:
一般使用 NCSA(National Center for Supercomputing Applications) 的 Web Server 或是由其所衍生出來的系統(著名的 Apache 即是由 NCSA 衍生出來的系統),可以設置對於目錄或檔案存取作限制的檔案,預設名稱為 .htaccess,而預設的密碼檔名稱則是 .htpasswd。
如果您希望對您的某個目錄加上密碼保護,那麼就必須建立一個名為 .htaccess 的存取規則檔放到該目錄內,並建立一個名為 .htpasswd(可另行命名) 的密碼資料檔放到另一個目錄內,為何要將密碼資料檔存放到另外的目錄呢?這是為了避免密碼檔被盜取,因為要能檢查密碼就得要能讀取密碼,能讀取密碼就可以設法取走密碼,因此將密碼檔放到別的目錄去,他人才不容易猜出來密碼檔放在哪裡?舉個例子來說明:假設您在網站上的個人根目錄為 /home/city/urid/www,而您希望保護的是名為 download 的次目錄,並打算將密碼檔放到一個名為 pwd_dir 的次目錄內,那麼就將:
.htaccess 放到 /home/city/urid/www/download 目錄內
.htpasswd 放到 /home/city/urid/www/pwd_dir 目錄內
那麼 .htaccess 與 .htpasswd 這兩個檔案的內容應如何設定呢?
首先讓我們看看如下的 .htaccess 檔範例:
AuthUserFile /home/city/urid/www/pwd_dir/.htpasswd
AuthGroupFile /dev/null
AuthName "Member Directory"
AuthType Basic
<Limit GET>
order allow,deny
allow from all
require valid-user
</Limit>
AuthUserFile 項目所設定的是密碼檔所存放的位址及檔案名稱,位址必須以真實路徑來設定,而檔案名稱 .htpasswd 是系統預設的密碼檔名稱,您可以自行為密碼檔設定不同的名稱。
AuthGroupFile 項目是設定群組資料所在的位址及檔案名稱,本例所設定的 /dev/null 表示不啟用群組資料。
AuthName 項目所設定的字樣 "Member Directory",會顯示於要求輸入密碼的 POP-UP 視窗上,表示用戶正在接受那一個項目(目錄、區域)的密碼認證?您可以將該字樣設定為任何您認為適合顯示於該視窗上的字樣。
require 項目所設的 valid-user 是表示凡是 .htpasswd 檔案內有帳號資料者,都是可以透過密碼驗證來合法的存取這個目錄,如果欲限制成僅讓密碼檔內部分特定人員可存取,那就給改用 user 參數並接著在該參數之後列出各個人員代碼,例如:require user user1 user2 user3,如果欲限制的對象是特定群組的話,則參數要改用 group,並接著在該參數之後列出各個群組名稱,例如:require group group1 group2。
其它以綠色標示的敘述部分,在您還沒搞懂 .htaccess 檔其它的參數如何調整與設定之前,只要照抄即可。
其次讓我們看看如下的 .htpasswd 檔範例:
user1:aeFPfnvmrkCGU
user2:bk/ukqY15rvjc
user3:gllGJQmhYJaMc
以上使用紅色標示的即為帳號名稱 (用戶代碼),以綠色標示的就是編碼過的密碼資料,這三筆資料的密碼都是 123456,您看得出來嗎?
無論您設定的密碼有幾碼(最多好像可設為 32 碼)?當系統予以編碼後即變成 13 碼的資料,而前兩碼是由自己設定(或由程式隨機取樣)作為編碼時的關鍵字碼。
請您注意一件事情,那就是帳號名稱是有區分大小寫的,因此您不可以將 USER1 視為 user1。
附註說明:
如果您想要在 .htaccess 檔的 require 敘述處指定可接受的使用者(user) ID 或是是群組(group)的話,請另外參照本文結尾列出的相關站點去查冀袺鷃〝A或是利用搜索引擎來另外找尋相關資料,搜尋時可設定 ".htaccess"、".htpasswd"、".htgroup"、"require group"、"require user"、"AuthGroupFile"....這些關鍵字,限於篇幅與時間關係,作者不在此多加說明。
有關於檔案格式與屬性設定:
以上兩個檔案可以使用一般的文字編輯程式來製作,儲存時必須以標準的 ASCII 格式來存成文字檔,而上傳時也必須使用 ASCII 模式來上傳。
我沒有找到比較具體有關屬性設定的說明資料,我自己測試的結果是兩個檔案屬性都為 644 時,可以正常的運作並無問題,如果您知道設定何種屬性比較好些,歡迎您留言或寫信告訴紅雪網頁作者,作者會將資訊整理到本篇內供大家參考。
讓我們來看看範例吧!請您點選下列的按鈕來連結到設置了 .htaccess 檔來作保護的目錄,您可以先隨便輸入帳號與密碼試一下,然後再重新試一次以 guest 為帳號、123456 為密碼,看是否可以載入指定的頁面?
系統的密碼編碼方式是屬於單向編碼,也就是說系統並無提供反向解碼的能,要比對密碼是否正確時,系統是將用戶所輸入的密碼字樣予以編碼後,再與儲存在系統上已經編過碼的密碼作比對,雖然高手還是有可能將密碼予以解碼,但是您也不用太過分擔心,一般使用者是沒有這個能耐對這種單向編碼的密碼作破解的,通常會對密碼作破解,也都是透過一些程式來完成的,如果您設定的密碼字數很少,而且是有特定意義的字樣,那麼就很容易被他人或前述的程式給 "猜" 出來。
本文作者在此誠懇的建議您,設定密碼時最好使用英文字母及數字混合,同時字數不可太少,最好是設定八碼以上,數字避免直接使用生日、車牌、駕照、或門牌號碼等,而文字則應避免使用自己、家人、同事、友人或寵物的英文名字等,因為這些都是屬於容易猜出來的字句或數字,如果您擔心取個沒有特殊涵義的密碼會不好記憶,非得使用有意義的英文字樣與數字,那麼作者在此提供一個簡單的方式供您參考:將英文字樣與數字交叉設定,例如:想使用寵物名稱(lucky)及愛車的車牌號碼(1234),那麼就將密碼以 l1u2c3k4y 或 luc1234ky ...等這類的方式來設定,相信應該可以達到好記而不易被破解之目的。
使用本文所述的方式來設定的密碼可不是自己輸入了密碼字樣就算數的,就如前一項所說的,這是使用系統的檢核能,因此有一定的編碼格式,那麼我們應該要如何才能設定 .htpasswd 這個密碼檔內的密碼資料呢?以下提供兩種方式供您參考:
如果您的網站使用的是 UNIX 或是 UNIX-Like 的系統,並且您有 telnet 到主機的操作權限,您可以使用 htpasswd 這支工具程式來建立密碼檔及各個用戶的密碼資料,htpasswd 的操作方式請自行查冀袺鬗憟鞳C
您也可以自行寫一支 CGI 程式來設定密碼資料,以 Perl 語言為例,將欲編碼的字樣透過 crypt() 這個函數來處理 (詳細使用方法亦請自行查?Perl 使用說明文件),傳回的就是編碼過的密碼資料了,將這個資料直接寫入 .htpasswd 檔案內,或者輸出到螢幕上再複製到 .htpasswd 檔案內用戶的密碼資料欄即可,這裡我寫了一個編碼的程式:
您想試看看編碼的結果嗎?
想參考一下程式是如何寫的嗎?
如果您希望自己撰寫程式來作密碼認證的處理,那麼以下的範例是處理密碼的基本步驟,您可以參考一下:
產生密碼:
# 取得由 HTML 檔案的 FORM 物件傳遞給程式的密碼字樣
$pass = $FORM{'pass'};
# 使用函數來取得隨機的兩個字碼
$salt = RandomCode().RandomCode();
# 以前述動作取得的兩個字碼當作關鍵字來作編碼處理
$EncodePwd=crypt($pass,$salt);
(接著作儲存帳號與密碼資料的處理)
上述範例中使用的隨機取碼函數如下:
sub RandomCode{
('0'..'9','a'..'z','A'..'Z','.','/')[rand(64)];
}
比對密碼:(此處僅作單純示範,實際運用時可能需要作迴圈與用戶名稱的比對處理)
# 讀取密碼檔內容,並存放到 $passwd_line 變數內
open (PASSWD,"$pwdfile" ;
$passwd_line = <PASSWD>;
chop($passwd_line) if $passwd_line =~ /
$/;
close(PASSWD);
# 拆解讀取出的資料為帳號與密碼兩個資料
($chkname,$chkpwd) = split(/:/,$passwd_line);
# 擷取編碼過的密碼資料前兩個字碼,並以這兩碼作為關鍵字碼對訪客輸入的密碼作編碼處理
$test_passwd = crypt($FORM{'password'}, substr($chkpwd, 0, 2));
# 比對存放於密碼檔內的密碼與訪客輸入並由系統編碼過的密碼
if($test_passwd eq $chkpwd && $FORM{'username'} eq $chkname){
(作密碼符合時的處理)
}else{
(作密碼不符合時的處理)
}
後記:
雖然大部分的網站都有提供上述的密碼認證能,但是仍有可能您使用的網站是極少數中的例外之一,或者是站台並未將該能設定妥當 (或未開放使用權限給一般用戶),因此若是您參考本文來設置妥當後,卻仍然無法正常運作的話,請您寫信向您網頁所屬的站台詢問及請求協助,千萬不要寫信到紅雪網頁來問作者喔!因為作者並不知道全世界每一部主機使用的是何種系統?是如何設定的?
請特別注意:有某些站台會對編碼資料多作一些處理,因而導致在不同站台所產生的密碼資料會有無法正確比對的現象,碰到這種情形時,您可以寫信向站台管理員詢問清楚,然後依據其說明來處理密碼資料,就作者本身的瞭解,有個名為 Virtualave 的站台就有類似情形,該站台會在密碼編碼完畢後在編碼資料的左方多加上 "$1$" 這三個前導碼,依據本文前述的說明,原本在作密碼檢核比對時,應該擷取存放在網站上密碼資料的前兩碼作為訪客所輸入密碼資料的編碼關鍵字碼,但是在這個站台就必須將程式改為跳過前述的那三個前導碼,而改成擷取第四、五這兩碼來當作編碼的關鍵字碼了(這是作者撰寫本文時該站台的處理狀況,不知道該站台會不會隨時作變更?因此如果您是該站台的用戶,而且想自行撰寫程式來使用這種密碼認證的能,請務必再次向該站台確認該站台對密碼編碼處理的方式為何?本段附註僅供參考)。
本文作者尚有數項狀況未搞清楚,如果看倌您有相關資訊的話請不吝賜教,狀況是:1.通過密碼檢核後,能維持多久的時間無需再作認證?2.用何種方式才能即時作出類似 LOGOUT 的動作,當再次存取時仍需輸入密碼?
相關資料參考網點:
NCSA Mosaic User Authentication Tutorial
NCSA HTTPd Access Configuration
Apache Week: Using User Authentication
Apache Module mod_access (order/allow/deny)
Apache Module mod_auth (AuthGroupFile/AuthUserFile)
Apache Core Features (AuthName/AuthType)
Apache Core Features (Directory)
Apache Core Features (Satisfy)
如何對 Perl 程式進行 Debug 程序?
(Oct. 25, 1999)
當您參考 "我想在家裡測試網頁與 CGI 程式,我需要什麼軟體?" 一文將測試 Perl 程式的相關軟體安裝好之後,您會迫不及待的開始寫程式、改程式以及測試程式,如果一切順利您將會很高興,但是如果碰到一些問題導致程式無法正確的執行時,您是否感到很苦惱呢?如果您對程式設計有些經驗,或雪|想到要對程式 Debug 也就是抓蟲,抓什麼蟲呢?抓出隱藏在程式內的臭蟲,這個臭蟲其實指的是程式中的錯誤,因此 Debug 簡單的說就是對程式進行除錯的程序,以便找出問題而加以更正,但是有釵h的網友並不知道應該如何對 Perl 程式進行除錯?我原先也沒有使用除錯程式的經驗,但是一直不斷有網友向我詢問類似的問題,因此我花了一點時間對 Perl 的除錯作了一些瞭解,現在將相關的經驗敘述如下,供有需要的網友們參考:
請先確定您已經正確的安裝了 Perl 程式在您的電腦上,同時也設定了 PATH 指向 Perl 程式放置的目錄。
我並不確定有無其它的方式可以進行除錯的動作?但是我都是在 DOS Box 裡進行的,因此以下的操作敘述都是在 DOS Box 內進行的。
輸入 perl -h 時,您可以看到畫面上會列出一堆可使用的參數及相關說明。
-c 參數可以對 Perl 程式的語法作一個檢查,看是否有語法上的錯誤?如果您想對名為 test.pl 的程式作語法上的檢查時,可以輸入 perl -c test.pl 這樣的指令敘述,然後按下 Enter 鍵就可以知道結果了。
-d 參數就是本篇要介紹的重點了,這個參數可以對 Perl 程式作除錯的動作,如果您想對名為 test.pl 的程式進行除錯的程序時,可以輸入 perl -d test.pl 這樣的指令敘述,然後按下 Enter 鍵就可以進入除錯模式了。
進入除錯模式後,您會看到一些簡單的訊息,其中有一行註明了 h 及 h h 指令可以查看相關的指令說明,當您輸入 h 並按下 Enter 鍵後,將會看到在畫面上飛快的顯示出一大堆的指令說明,如果您的動作夠快的話,可以在列出指令說明時按下 Ctrl-S 或是 Pause 鍵來暫停列示動作,以便查看各個指令的說明,如果您覺得您的動作實在沒有電腦來得快,那也沒關係,改輸入 h h 指令並按下 Enter 鍵,畫面上將會顯示出各個指令的簡短說明,當您看到某個指令可能是您想要的動作時,可以再用 h 指令 的方式查看該指令較為詳細,如果您想瞭解 O 這個指令,那就輸入 h O 的指令然後按下 Enter 鍵就可以看到更為詳細的解說了。
除錯指令有蠻多的,本篇僅介紹幾個我個人認為較為簡單而好用的指令如下:
當您使用某些指令移動觀察原始碼的行位置時,除錯程式會將某些指令的作用行數由該行起算,因此下列有這樣的動作處,將以基準行這個名稱來敘述。
l 指令可列出由基準行開始起算的後 10 行原始程式碼,您也可以用 l 行編號 的敘述來重新設定基準行的位置,當您再下一次 l 指令就可以從剛才指定的行數起算,繼續列出後 10 行的原始碼了,另外也可以使用 l 副程式名稱 的敘述將列示的位置設定到指定的副程式處。
/.../ 或 ?...? 指令為搜尋變數或指令敘述字樣,例如要找尋 open 這個敘述,那就輸入 /open/ (向後找尋資料) 或 ?open? (向前找尋資料) 這樣的指令敘述,搜尋時將會依據您設定的是 /..../ 還是 ?....? 來決定向後或向前找尋,找尋時將由現在的基準行開始往後(或往前)找,因此如果您確定是要從頭開始向後搜尋整個程式的話,就得將基準行移到程式開頭處,這個動作可以用 l 0 來完成,同時當您每執行一次相同的搜尋指令時,都會由找到符合字樣的基準行位置開始繼續往後找下一個符合的位置。
p 變數名稱或運算式 指令為查看指定的變數內容或運算式結果,例如輸入 p 1+2 就會顯示 3 這個運算後的結果出來,輸入 p $Data1 那就會顯示出 $Data1 這個變數的內含值出來,這裡有一點要提醒您,那就是在除錯模式變數依然是有區分大小寫的,輸入變數名稱不正確的話是不會顯示出正確結果的。
b 行數或副程式 指令為設定中斷點的能,您可以設定程式在進行除錯程序時,在指定的行數、副程式....等處中止執行動作,以便進行其它的除錯處理。
W 變數名稱 指令為設定監看某個變數或運算式的變動,如果您欲在 $Data1 這個變數的內含值有所變化時將程式暫停下來,就可以用 W $Data1 這樣的指令敘述來設定,如果想清除所有的監看式,可以直接執行不帶任何參數的 W 指令或是用 A 指令敘述來達成。
L 指令為列出所有已經設定的中斷點及監看式。
d 行數 指令可用來來清除指定的中斷點,或是使用 D 指令來清除所有的中斷點。
s 指令為單步追蹤,也就是一行一行的執行程式碼,每下一次 s 指令並按下 Enter 鍵時,就執行次一行的原始程式碼,就算碰到呼叫副程式的敘述,也是一樣進入副程式內然後逐行的進行除錯動作。
n 指令類似 s 指令,但是若執行到呼叫副程式的敘述時,並不會進入副程式內進行單行除錯的動作,而是將整個副程式當作一個動作來處理。
Enter 鍵 如果您未下達任何指令敘述而直接按下 Enter 鍵的話,除錯程式將會重複最後一個 s 或 n 的指令動作,以方便您進行單步追蹤的除錯動作。
c 指令為執行程式,除非碰到有設定中斷點的地方,否則程式將一次執行到底,但是您也可以給予行數當作參數,讓程式執行到指定的行數處然後暫停下來,如果先前程式因為指定行數或碰到中斷點而停止,再次下達本指令時,會由基準行開始繼續執行程式。
t 指令為追蹤 (trace) 顯示模式的切換,當 trace 切換為 on 時,只要您下達 c 指令來執行程式,畫面上會將被執行的程式碼逐行顯示出來。
q 指令為結束除錯模式返回 DOS 指令模式。
各位可以看得出來,我僅列出一部份的指令及簡介就已經佔掉不少的篇幅了,而我覺得上述的說明已經足夠讓您瞭解如何進行 Perl 程式的除錯了,所以就此打住,您可以自行實作以便更深入的瞭解其它指令。
如何上傳 CGI 程式及設定程式檔案的屬性?
(Oct. 21, 1999)
這個問題和真實路徑及相對路徑那個問題一樣,好像也困擾著不少的 CGI 初學者,我也在留言板及信件中回答過釵h的網友相同的問題,但是也一樣都未能將資料整理成問答集,為了節省網友及我自己不少的時間,藉著此次又有網友問起,就將資料整理如下供網友們參考。
上傳檔案:
有些站台允釣洏?Telnet 及 FrontPage 來上傳檔案,但是通常一般站台都採用 FTP 程式來處理上傳及下載檔案,有些網友未看清楚站台的相關規定,而採用不適合的程式來上傳檔案,這是容易發生問題的。
如果您的 CGI 程式是使用 Perl 來撰寫的,因為 Perl 程式是屬於文字型態的檔案,所以您必須以 ASCII 模式來上傳。
設定檔案屬性:
首先您必須認清一個觀念:您自己個人電腦上的檔案無需也無法設定屬性,同時也必須區分清楚哪一個操作視窗內的檔案是屬於網站上的檔案?
當您使用 FTP 程式接通網站後,檔案列表中所顯示出來類似 -rwxr-xr-x 這樣的標示就是檔案屬性的狀態,在 UNIX 主機上檔案屬性分成三段,分別是:Owner、Group、Public (有的程式本項命名為 Other),而每一段又分三種權限的設定,分別是 Read、Write、Exectue,一般的 FTP 程式都可以使用滑鼠右鍵呼叫出一個能選單來更改檔案或目錄的屬性,通常該項能的名稱叫做 Change file attributes 或是 chmod....等的。
當您要設定網站上的檔案屬性時,必須先將滑鼠指標移到欲更改的檔案名稱處,然後按下滑鼠左鍵將檔案名稱呈反白標示 (有些 FTP 程式允釵P時標註多個檔案)。
接著再按下滑鼠右鍵,此時會顯示一個突現式能選單,如果您使用的是 CuteFTP 程式,那就選擇 "Change file attributes" 項目,如果您使用的是 WS_FTP 程式,那就要選擇 "chmod (UNIX)" 的項目,如果您使用的是其它的 FTP 程式,那麼請參考該程式相關文件的說明來設定。
當畫面上出現一個設定屬性的操作視窗時,您可以依據要設定的屬性來圈選相對應的九個小方框,各項目對應屬性碼的規則如下:
區分 Owner Group Public
(Other)
Read 400 40 4
Write 200 20 2
Exectue 100 10 1
前述例子中的 -rwxr-xr-x 屬性碼為 755,計算方式如下:
Owner 的 RWX 加上 Group 的 RX 再加上 Public (或 Other) 的 RX。
Owner 的 400 + 200 + 100 加上 Group 的 40 + 10 再加上 Public (或 Other) 的 4 + 1。
將前述的數字加總就變成 700 + 50 + 5 = 755。
如果您使用的是 CuteFTP 之類的程式,在您圈選屬性權限項目時,會有一個長方框顯示點選後的屬性數字狀態,而您也可以選擇在該方框內輸入直接屬性數字。
雖然每個 FTP 程式的能都是大同小異,但是卻都有不同的操作方式及能名稱,如果您使用的是其它的 FTP 程式,您可以參考您使用 FTP 程式中的 Help,或利用搜索引擎找尋更多的解說資料來參考。
何謂真實路徑?什麼又是相對路徑?
(Aug. 11, 1999)
這個問題好像困擾著不少的 CGI 初學者,我回答過釵h的網友這個問題,但是卻一直都未能記起來將它作成問答集,這次我可得把它寫好,這樣可能會節省網友及我自己不少的時間。
真實路徑(實體路徑):
實體路徑就是真實的路徑,而不是經過系統處理過後的對應路徑,對應路徑可以用一個簡單的代名來取代一串長長的真實目錄名稱,或者是一組多層目錄的真實路徑,所以也可以說它是虛擬路徑,就像是在 Windows 系統的 DOS Box 裡以 SUBST 這個指令來設定虛擬磁碟是一樣的,例如以 Z: 磁碟來代替 C:SubDirHTMLMySitePageData 這個路徑,那麼當您使用 DIR 指令查看 Z: 時,其實看到的是 C:SubDirHTMLMySitePageData 這個目錄裡的資料。
當我們使用瀏覽器來觀看網頁資料時,透過 HTTPd 這個通訊協定來連結以 https:// 開頭的網址時,通常在網站系統這一端已經將網址對應到特定的目錄裡了,而以 https:// 開頭的網址我們可以說它就是一個對應路徑。
但是 CGI 程式在一般狀態下是無法對虛擬的對應路徑作實體上的讀寫動作,所以當程式內有作到檔案的讀寫動作時,就必須要使用真實路徑了,如果您使用的站台是 WIN32 的作業系統,那麼真實路徑就是 C:SubDirHTML.... 之類的路徑名稱,如果是在 UNIX 或 UNIX-Like 的系統上,就是 /home/city1.... 或是 /home/user/public_html 之類的路徑名稱了。
相對路徑:
實體路徑與對應路徑都可以有相對路徑,在視窗系統及 UNIX-Like 系統上都是以 "." 來代表現在的目錄,而以 ".." 來代表上層的目錄,如果您在視窗系統的 DOS Box 中輸入 "dir .." 這個指令,那麼您將會看到上一層目錄的檔案列表資料。
如果我們在執行 CGI 程式時,要對不同目錄內的檔案作讀寫處理,那麼除了設定完整的真實路徑之外,也可以設定對應的真實路徑,舉例說明:
假設您的根目錄完整的真實路徑為 /home/usr/you,而目錄分佈如下:
根目錄 ┬ cgi-bin
└ data
而您在 cgi-bin 目錄內執行的某個 CGI 程式要讀取 data 目錄內名為 info.txt 的檔案時,因為程式在執行時的位置在 cgi-bin 這一個目錄內,所以必須以 ".." 來對應到上一層目錄,然後再指向名為 data 的目錄以及檔案名稱,因此在程式內設定讀取的相對路徑就變成 ../data/info.txt 這樣的敘述了,否則就得設定完整的真實路徑 /home/usr/you/data/info.txt。
重點提示:
真實路徑不會是以 https:// 開頭的。
如果您的 CGI 程式要讀寫的資料檔案與其放在同一個目錄內,那麼就無須設定路徑,或是設成 "./file.txt" 這樣的敘述就可以了。(記得前面講的嗎?"." 代表的是現在的目錄)
如果您要在 WIN32 系統中執行 CGI 程式,並且是把檔案路徑寫在程式裡的話,請將 C:SubDir... 這樣的敘述改成 C:/SubDir... 這樣的敘述。
通常有支援 CGI 的站台都會有真實路徑的設定說明,否則請教在同一個站台設網頁的鄰居,或是寫信問網站管理員,向無關的人詢問不是一個正確的做法。
網路上有哪些提供 CGI 免費空間的網站?其 CGI 相關設定為何?
(Aug. 26, 2000)
網路上有很多提供 CGI 免費網頁空間的站台,也正因為有很多所以無法一一列出,以下是我所知道一些網站的相關設定,如果您的網站是其中之一,那麼就參考相關的設定吧!如果您發現本文所述有誤或不當,請務必留言或來信告知以便更正,當然若您有其它的站台的 CGI 設定資料可供網友們參考也請不吝提供。(以下各項資料都已精簡掉以節省篇幅,除呼叫路徑之外其餘路徑均以根目錄為例)
特別聲明!
竟然有人寫信給我說他按照我提供的屬性資料去設定 USpace 上的程式,結果 "害" 他不能用....,他說我寫的屬性是 755 不能執行,而他改設成 700 才能執行,這倒是絕了!據我的瞭解若非站台特別對某個屬性設限,否則把屬性改小反而可以執行?有這種道理嗎?
我寫資料是參考各站台公佈的資料及自己測試的結果來製作的,該員所說的若是正確的倒也罷了!但是經我複查的結果,本篇資料與 USpace 站台公佈的相同,且我也有實際作過測試,程式屬性設為 755 並無問題,辛苦製作資料供網友參考卻碰到這種事情,因此作者在此鄭重的聲明:本篇所列資料僅供參考,若各站台資料有所變更以致實際情形與本篇所述有不同者,應以各站台公佈的資料為準!
若您發現某站台的資料有所變更的話,歡迎您來信或留言告知,但是若非善意建言的話就請好自為之,不要寫一些莫名其妙的信來自討沒趣!
--------------------------------------------------------------------------------
TacoMax (15MB):
呼叫路徑:https://tacocity.com.tw/cgi-bin/cgiwrap/帳號/程式名稱
真實路徑:/home/city1/帳號/www
HTTP路徑:https://tacocity.com.tw/帳號
寄信程式:/usr/sbin/sendmail
Perl設定:#!/usr/local/bin/perl
--------------------------------------------------------------------------------
FSN (30MB):
呼叫路徑:https://帳號.fsn.net/cgi-bin/程式名稱
真實路徑:/home2/代碼/帳號.fsn.net
HTTP路徑:https://帳號.fsn.net
寄信程式:/usr/sbin/sendmail
Perl設定:#!/usr/bin/perl
--------------------------------------------------------------------------------
ProHosting (15MB):
呼叫路徑:https://thor.prohosting.com/~帳號/cgi-bin/程式名稱
真實路徑:/usr1/home/帳號/html
HTTP路徑:https://thor.prohosting.com/~帳號
寄信程式:/usr/sbin/sendmail
DATE程式:/bin/date
程式屬性:755
Perl設定:#!/usr/bin/perl
--------------------------------------------------------------------------------
ELEVEN (10MB):
*.htm:資料檔屬性要求為 646。
呼叫路徑:https://11.com.tw/cgi-bin/cgiwrap/帳號/程式名稱
真實路徑:/home/working-web/帳號/www
HTTP路徑:https://11.com.tw/帳號
寄信程式:/usr/sbin/sendmail
程式屬性:700
Perl設定:#!/usr/local/bin/perl
--------------------------------------------------------------------------------
Hypermart (10MB):
呼叫路徑:https://帳號.hypermart.net/cgi-bin/程式名稱
真實路徑:/data1/hypermart.net/帳號
HTTP路徑:https://帳號.hypermart.net
寄信程式:/var/qmail/bin/qmail-inject
DATE程式:/bin/date
程式屬性:755
Perl設定:#!/usr/local/bin/perl
--------------------------------------------------------------------------------
Virtual Avenue (20MB):
呼叫路徑:https://帳號.virtualave.net/cgi-bin/程式名稱
真實路徑:/home/帳號/public_html
HTTP路徑:https://帳號.virtualave.net
寄信程式:/usr/sbin/sendmail
DATE程式:/bin/date
程式屬性:755
Perl設定:#!/usr/local/bin/perl
--------------------------------------------------------------------------------
WebJump (25MB):
呼叫路徑:https://帳號.webjump.com/cgi-bin/程式名稱
真實路徑:(未找到相關說明,但可用自己目錄的相對路徑來試看看)
HTTP路徑:https://帳號.webjump.com
寄信程式:暫未支援,但可參考此處製作 FormMail。
DATE程式:無 (但在 Perl 程式中可使用 localtime 函數)
程式屬性:775 (設成 777 將不予執行)
Perl設定:#!/usr/local/bin/perl
--------------------------------------------------------------------------------
Virtual Nine (5MB):
呼叫路徑:https://帳號.vr9.com/cgi-bin/程式名稱
真實路徑:/data/帳號
HTTP路徑:https://帳號.vr9.com
寄信程式:/var/qmail/bin/qmail-inject
DATE程式:/bin/date
程式屬性:755
Perl設定:#!/usr/local/bin/perl (5.004 版 Perl 用本項設定)
#!/usr/bin/perl (5.005 版 Perl 用本項設定)
--------------------------------------------------------------------------------
UHome(10MB/38MB/香港中文站台):(感謝網友 Sandy Wan 提供本資訊)
呼叫路徑:https://帳號.uhome.net/cgi-bin/程式名稱
真實路徑:/home/uhomeu/帳號 (新申請者可能是:/usr/home/uhomeu/帳號)
HTTP路徑:https://帳號.uhome.net
寄信程式:/usr/sbin/sendmail
DATE程式:/bin/date
程式屬性:建議設為 700,亦可設為 755
Perl設定:#!/usr/bin/perl 或 #!/usr/local/bin/perl
--------------------------------------------------------------------------------
USpace(無限制/香港中文站台):
呼叫路徑:https://帳號.uspace.net/cgi-bin/程式名稱
真實路徑(CGI程式):/home3/申請時的分類名稱/帳號/cgi-bin
真實路徑(資料根目錄):/home3/申請時的分類名稱/帳號/public_html
HTTP路徑:https://帳號.uspace.net
寄信程式:/usr/sbin/sendmail
DATE程式:/bin/date
程式屬性:755
Perl設定:/usr/bin/perl
--------------------------------------------------------------------------------
Tripod (11MB):
呼叫路徑:
https://帳號.tripod.com/cgi-bin/程式名稱
https://members.tripod.com/帳號/cgi-bin/程式名稱
https://cgi.tripod.com/帳號/cgi-bin/程式名稱
真實路徑(CGI程式):/帳號/cgi-bin
真實路徑(資料根目錄):/帳號
HTTP路徑:https://帳號.tripod.com
寄信程式:需套用 TripodMail 模組才能使用
DATE程式:需套用 TripodDate 模組才能使用
程式屬性:該站台宣告系統會自動設定,無須用戶來作相關設定
Perl設定:該站台的系統會忽略第一行的這項設定,因此設定成何種路徑與名稱都可以 (但是本文作者建議應該仍要保留該行)
--------------------------------------------------------------------------------
嘻哈(無限制/香港中文站台):
呼叫路徑:https://帳號.heha.net/程式名稱 (CGI 程式未限制要放在哪一個目錄內,亦可自行建立名為 cgi-bin 的次目錄以便管理。)
真實路徑:/free/home/帳號
HTTP路徑:https://帳號.heha.net
寄信程式:/usr/sbin/sendmail
DATE程式:(未找到相關說明)
程式屬性:700
Perl設定:/usr/bin/perl
--------------------------------------------------------------------------------
Fiberia (11MB):
呼叫路徑:https://home.fiberia.com/帳號/cgi-bin/程式名稱
真實路徑:/www/帳號
HTTP路徑:https://home.fiberia.com/帳號
寄信程式:/usr/sbin/sendmail
DATE程式:/bin/date
程式屬性:(未找到相關說明)
Perl設定:#!/usr/local/bin/perl
--------------------------------------------------------------------------------
亞卓市 (10MB):
呼叫路徑:https://residence.educities.edu.tw/cgi-bin/cgiwrap/~帳號/程式名稱
真實路徑:/home0/free_account/帳號
HTTP路徑:https://residence.educities.edu.tw/帳號
寄信程式:/usr/lib/sendmail
DATE程式:/usr/bin/date
程式屬性:(未找到詳細而明確的說明)
Perl設定:#!/usr/local/bin/perl
--------------------------------------------------------------------------------
其它有提供 CGI 的免費站台:
FreeNation (香港站台 7MB)
Royalty Studios (10/50MB)
如何才能禁止別人由其它的網頁來執行我的 CGI 程式?
(Aug. 15, 1998)
我曾經使用過一個 CGI 程式,原先都能正常的執行,但是在一次更換新網址之後的測試中,雖然自認已經將相關的參數及設定都更改了,卻仍然不能執行,而且畫面上告訴我的是某個網站的警告訊息,內容是說我沒有權利來執行它的這支程式,頓時我傻在那裡,我何時去偷偷執行了別人的程式了呢?於是我再次仔細的查看程式內容,後來才發現是程式中的一段處理所導致的,而該程式係我剛接觸 CGI 時找來用的,當時對 CGI 並不熟悉,所以有些地方根本就不敢改,才會有這樣的現象,現在的我對 CGI 有了相當的認識,所以很快的就將問題解決了,我覺得這是一個相當不錯的經驗,這個方式也相當好,這樣可以避免別人來偷用你的程式,也可以因此而避免加重網站的負載,於是我將這段處理的方式列出來,提供給有興趣的網友們參考:
在 CGI 程式的開頭處設定一個陣列變數,內容為允陸鶡璆輓{式的網址路徑:
@referers = ('tacocity.com.tw/urid');
若有數個網址,就多設幾個:
@referers = ('tacocity.com.tw/urid','其它的網址...');
然後在主程序執行前,找一個適當的位置加入以下的檢查敘述:
if ($ENV{'HTTP_REFERER'}) {
foreach $referer (@referers) {
// 若呼叫本程式的網頁,其所在路徑是包含允釭犖籈}在內,就表示是合法的呼叫
if ($ENV{'HTTP_REFERER'} =~ /$referer/i) {
$check_referer = '1';
last;
}
}
} else {
$check_referer = '1';
}
// 若不是合法的呼叫,就顯示警告訊息並結束程式的執行。
if ($check_referer != 1) {
print "Content-type: text/html
";
print "<html>
<head>
<title>Bad Referrer - Access Denied</title>
</head>
";
print "<body>
<center>
<h1>非法的呼叫 - 禁止存取!</h1>
</center>
";
print "警告!<br>
";
print "由 $ENV{'HTTP_REFERER'} 來執行本程式的要求是不被允釭滿C<br>
";
print "</body></html>
";
exit;
}
當然囉!如果您願意的話,也可以將這個非法呼叫的來源紀錄到一個檔案內,然後去看一下那個網頁到底是一個怎樣的網頁?
附註:這個方式僅適用於網路主機提供 HTTP_REFERER 環境變數的狀態下才能發揮效用喔!
我要如何確保 CGI 程式能正確的擷取傳入的參數?
(Aug. 12, 1998)
我寫的 Perl 大部分都使用參數傳遞的方式來運作,曾經發生過無法正確傳遞參數的情形,經過研究後我的方式如下:
假設在 HTML 檔案中作如下的設定:
<FORM ACTION="https://www.mysite.net/cgi-bin/MYCGI.pl?參數一+參數二+參數三" METHOD="POST">
<INPUT TYPE=submit VALUE="確認"></FORM>
原先的寫法是:
$parm1=$ARGV[0]; # 擷取第一個參數
$parm2=$ARGV[1]; # 擷取第二個參數
$parm3=$ARGV[2]; # 擷取第三個參數
我增加了檢查是否有正確收到參數的程式碼,如果沒有收到則改用 $ENV{'QUERY_STRING'} 來擷取參數:
if ($parm1 eq "" || $parm2 eq "" || $parm3 eq "" {
$buff = "$ENV{'QUERY_STRING'}";
$buff =~ s/+/ /g;
($parm1,$parm2,$parm3)=split(/ /,$buff);
}
您如果擔心會有同樣的情形發生,不妨參考一下,將您的 Perl 程式加一段程式碼進去,或者乾脆就直接改用成上述的寫法來擷取參數。
我要如何才能讓使用者留言後,不需 Reload 就可以直接看到自己的留言?
(Oct. 21, 1999)
或釵釦韟n的做法,但是我的作法是在處理完留言資料,欲返回留言版面時,以下列的敘述來處理:
print "Content-type: text/html
";
print "<meta http-equiv=refresh content="0;url=$newlink">";
exit;
請注意 $newlink 乃是填入欲重新聯結的留言檔名稱或含有該名稱的變數。
另外有一個最有效的方式就是:將留言的內容直接由程式讀取後輸出到瀏覽器上。
我想在家裡測試網頁與 CGI 程式,我需要什麼軟體?
(Jan. 31, 2001)
請注意:以下僅就 Perl 語言撰寫的 CGI 程式作相關說明。
相信有很多網友和我一樣,在自己的網頁設置了一些 CGI 程式,尤其是以 Perl 寫成的 CGI,然而或多或少都會為了配合不同環境或是強化能而予以修改,但是為了瞭解及驗證修改後的效果,常常需要將程式上載至 Web Server 上,然後才能測試,不但浪費時間與金錢,還增加了一些麻煩與加重 Web Server 的負載,如果能夠在家中作初步測試那不是很好嗎?我在家中已完成這樣的環境設置,因而有些小小的經驗,在此提供一些資訊給有相同需求的網友參考:依據我個人在蒐集資料時所接觸的而言 (截至本文撰寫時止),在 PC Windows 環境運作的 Web Server 常見的有 IIS (Internet Information Server) 及 WebSite 這兩套 (相信爾後會有更多的 Web Server 軟體問世),而大部分的 Perl 解譯環境則是 Perl for WIN32 (現更名為 ActivePerl),IIS 是 Microsoft 公司的產品,WebSite 則是 O'Reilly 公司的產品,關於實務上的經驗,因為作者買了一套 NT Workstation 中文版,附贈一套 IIS 3.0,所以作者採用 IIS 為環境,至於其他同類型的軟體我未使用過,所以只能以前述的簡文充當釣竿,有興趣的網友們可以運用本文所提及的一些關鍵字,利用搜尋引擎及新聞討論群組,去尋找更詳細的資料,祝您好運!
有必要先澄清的觀念:
Perl 是一套完整獨立的程式語言,要單純的執行以 Perl 語言所撰寫之程式時,是無需安裝 Web Server 的,但是這樣僅能在 Console mode 執行 (視窗系統的 DOS Box),若要透過瀏覽器來配合 Perl 程式對網站主機的資料作存取的話,就必須要安裝 Web Server 了。
CGI 程式可以使用多種語言來撰寫,並非僅能用 Perl 語言來撰寫,將 Perl 與 CGI 畫上等號是不正確的,如果您打算使用其它的語言來撰寫 CGI 程式的話,是無需下載及安裝 Perl 解譯器的。
選擇一套 Web Server 下載來使用:
Microsoft IIS 3.0 Free for NT user,其它相關中文資訊看這裡
下載免費的 Microsoft Personal Web Server for WIN95 中文版 (750KB)
Xitami 2.5b4 (檔案大小視您下載的版本而定) - iMatix 公司發行的免費 Web Server 軟體,程式不大能卻不少。
Sambar Server 4.4b6 (4,386KB) - Sambar 公司發行的免費 Web Server 軟體,能頗完整的,還包含了 Perl 解譯器在內,無須另外安裝 Perl 解譯器。
Apache for Win32 1.3.14 R2 (3,698KB) - Apache Software Foundation 發行的免費 Web Server 軟體,能無以倫比,據瞭解這是全世界目前使用率最高的一套 Web Server。
選擇欲使用的 CGI 程式解譯器來下載:
若您下載的 Web Server 未包含 Perl 解譯器在內的話,請下載這套 Perl 解譯器:
ActiveState Tool 公司發行免費的 ActivePerl (Build 5.6.0.623) (8,136KB)
若您想測試 PHP 的話,下載 PHP 解譯器:
PHP 官方站台發行免費的 PHP3/PHP4 執行檔及原始碼都有 (檔案大小視您選擇的版本及種類而定)
安裝使用的基本步驟如下:
參考說明文件所述步驟安裝 Web Server 系統。
參考說明文件所述步驟安裝 Perl。
安裝好後再重新開機,在 DOS Box 輸入 PATH 這個指令來查看搜尋路徑,應該會增加 C erlin; 這個目錄字樣。
設定相關目錄與存取權限。
若您使用的 Web Server 是 IIS,必須透過 IIS 的 "服務管理員" 將放置 CGI 程式的目錄設定 "執行" 的存取屬性,否則 CGI 程式將無法執行,使用 "服務管理員" 的設定步驟如下:
內容 → 服務內容 → 目錄 → [點選目錄] → 編輯內容 → [在最下方的 "存取" 項目中的 "讀取" 及 "執行" 兩項都圈選起來]
測試:
設好呼叫 CGI 程式的 HTML 網頁檔內的設定,然後設定 CGI 程式內的相關設定,尤其是兩者對路徑的設定。
先在 DOS Box 中輸入指令 Perl -c yourcgi.pl ← 使用 -c 參數可以檢查 yourcgi.pl 程式內的語法是否正確?若有錯誤會列出程式發生錯誤的行數及錯誤的說明。
(本項能並無須配合 Web Server 使用,所以您可以利用本項能在任何時間對 Perl 程式來作基本的測試)
啟動 Web Server,然後使用瀏覽器載入呼叫 CGI 程式的 HTML 網頁檔來執行 CGI 程式。
若發生問題,依據提示的訊息查噱〝憟韝丹傢鶹欞~排除的章節。
如果發現有任何問題或是想要查冀Y個指令的用法,您可以在 DOS Box 中使用 perldoc 這個指令檔來查冀袺鷏穈T,例如您想查看有關 flock 的說明,那您可以輸入 perldoc -f flock 這樣的指令敘述就可以了。
若測試無誤,應修改網頁檔及程式檔內與路徑相關的設定參數,然後上載到網頁所屬的網站上。
上傳至網站後亦應再作實際的相關測試,以確保程式在網站上能正確的執行。
撰寫 CGI 程式需要哪些工具?
使用 Perl 語言所撰寫的 CGI 程式係以解譯 (直譯) 的方式來執行的,因此程式檔案是以原始碼的方式呈現的,所以您必須使用 "記事本" (notepad.exe) 之類的純文字編輯程式 來建立或編修 Perl 程式檔案,如果您因為習慣的問題而使用 MS-Word 之類的程式來編修程式檔案也是可以的,但是請記得存檔時要選擇儲存成 "純文字" 的格式。
既然程式在自己的電腦撰寫好,也經過測試無誤的話,那麼您可能會想將程式上傳到網站上來正式的運作,上傳檔案的方式很多種,但是通常是使用 "FTP 程式" 來處理,請接著看完下一項後,點選下一項敘述結尾處提供的超連結去了解一下 FTP 程式。
如果提供您放置 CGI 程式的網站採用的是 UNIX 或是 UNIX-Like 的作業系統,那麼您可能必須要對上傳到網站上的程式檔案作屬性的設定,如果該站台提供您使用 telnet 的方式進入網站,那麼您可以使用 chmod 指令來對檔案作屬性的設定,但是一般有提供支援 CGI 程式運作的網站,通常都是提供 FTP 的方式來供用戶處理檔案,因此您就需要使用到 FTP 程式,關於 FTP 程式與屬性設定的問題請參考 "如何上傳 CGI 程式及設定程式檔案的屬性?" 一文。
參考資料:
Sambar 在 4.3 版之後開始支援 PHP,設定極為簡便,設定方法可查看其官方站台 ISAPI Applications 的說明
以下為各個相關軟體的官方站台網址:
Microsoft 官方站台。
Apache 官方站台。
Xitami 官方站台。
Sambar 官方站台。
Perl 官方站台。
PHP 官方站台。
為何我的留言板程式可以正常執行,但是卻無法將新的留言寫入檔案內?
(Aug. 12, 1998)
這個問題的發生也很可能是因為資料檔的寫入權限或屬性設定不足所致。
為何我在家裡用 Windows 95 測試我的 Perl 程式可以正常執行,上載到網站上之後卻不能執行?
(Aug. 12, 1998)
網站上通常都有一些設定與要求是與自己在家裡使用的環境不相同,因此這種情形一但發生,就必須針對不同的網站作一些不同的測試,然後才能找出切確的原因,但是我可以建議您檢查一下權限與屬性的設定。
我的網頁設在北美地區,但是我希望留言板紀錄的是台北時間,我該怎麼做?
(Dec. 12, 1999)
只要設定時區或是換算時區的相對時間就可以了,以下兩種方式都可以取得相同的結果:
將取得的時間加上(或減掉)格林威治時間:
$mytime = gmtime(time+8*60*60);
其中的 8 是時區與 GMT 的時差數,台北是 +8、德黑蘭是 +3.5、夏威夷是 -10....依此類推。
在原本處理時間取的敘述之前加上時區代名的設定:
$ENV{TZ} = 'Asia/Taipei';
$mytime = localtime(time);
執行 CGI 程式時出現如下的訊息:
The requested method POST is not allowed for the URL /..../cgi-bin/rsgb.pl
(Aug. 24, 2000)
rsgb.pl 這支程式的屬性未設正確,無法執行該程式,如果確認程式屬性設定無誤,那麼再確認一下目錄屬性是否設定正確?還有站台對於 CGI 程式是否有其它相關規定?例如程式必須要放在那個目錄?有的站台規定程式僅能在某個目錄裡執行,但是卻不准在該目錄的次目錄內執行程式,另外站台對於屬性設定有無特別限制?有的站台對於屬性設定過大的程式一樣不准予執行。
最重要的是確認站台到底能不能執行 CGI 程式?還有你自己到底有無 CGI 的執行權?如果一切都沒有問題,程式仍然無法執行的話,寫信向網管問清楚比較快。
如何排除 Perl 程式處理中文資料的障礙?
(Jan. 30, 1999)
在 CGI Perl 程式中,有釵h符號字元是有特殊用途的,而不幸的有某些這樣的字元卻與中文字的第二個位元組互相衝突,以至於會有中文字顯示或比對不正確,甚至是產生錯誤結果的現象,尤其是 | 及 這兩個字元,所幸我們還有個 quotemeta 指令可以使用,這個指令可以將指定的字串中每個字元的前面都再多加上一個 這個字元,使得字串內的特殊字元在處理時被視為單純的字碼,請參考下列的範例:
假設 $str 是一個要做搜尋比對的中文字串,而 $line 是逐行讀入的資料檔內容:
$restr = quotemeta $str;
if ($line !~ m/$restr/i) {
......
}
另外若不是以變數來處理的字串,通常我們會使用雙引號來標示及處理,然而這也是會發生上述的障礙,但是當您直接對雙引號括住的字串使用 quotemeta 來處理時卻又會怪怪的,那怎麼辦呢?很間單!將雙引號改為單引號就可以囉~因為單引號不會對其內的字元作特殊處理,換句話講在單引號之內的文字資料將會原原本本的呈現出來,不會去解譯變數也不會處理 escape 字元,例如原來的敘述是:
print "成的$msg訊息!
";
應改為:
print '成的訊息!';
請特別注意
換行符號及 $msg 變數也需拿掉,因為單引號並不處理 escape 字元及變數,如果不將
符號及 $msg 變數拿掉,那麼顯示出來的字樣將會是 成的$msg訊息!
,如果您仍希望顯示成原來包含變數及換行的效果,那就必須將單引號與雙引號資料併用,同時以 . 符號來連結成完整的輸出敘述:
print '成的'.$msg.'訊息!'."
";
上述的 成的 與 訊息! 字樣是使用單引號,而換行的
則是用雙引號。
我要如何才能在 CGI 程式中將留言者填寫資料中的 HTML 標籤指令過濾掉?
(Aug. 11, 1998)
假設 $val 是一個要做過濾處理的字串,若不是在特殊的狀態下,套用以下的敘述就可以了:
$val =~ s/<(.|
)*>//g;
或是:
$val =~ s/<(([^>]|
)*)>//g;
執行 CGI 程式時出現如下的訊息:
500 Internet Server Error
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request
Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
(Aug. 04, 1998)
這個是代碼為 500 的錯誤,是指 "可能為任何的錯誤",因此範圍太廣無法由訊息來判斷問題所在,最可能發生的原因如下:
程式內有語法錯誤或設定錯誤之處,例如:行尾少了分號....。
程式或資料檔的屬性設定不正確,無法做完整的讀寫動作。
沒有以 ASCII 模式上傳 CGI 程式。
程式第一行 #!/..../perl 的路徑宣告不正確或不符合網站的要求。
相關檔案的路徑設錯,例如留言板程式的 /..../sendmail。
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: User not in allow file!
(Aug. 04, 1998)
未獲得 CGI 使用權限。
CGI 程式屬性設定不正確。
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: Script File Not Found!
(Aug. 04, 1998)
不是檔案名稱設錯就是路徑不正確。
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: Script is not executable. Issue chmod 755 ......
(Aug. 04, 1998)
將檔案屬性改為 755 就可以了。
執行 CGI 程式時出現如下的訊息:
CGIwrap Error: System Error: execv() failed
Error: No such file or directory (2)
(Aug. 04, 1998)
上傳時改用 ASCII 模式。
Perl 檔案的第一行沒有指定 #!/usr/bin/perl,或路徑錯誤(各站台設置的位置可能不同)無法找到 Perl 解譯程式。
我是 TacoCity 的居民,我執行 CGI 程式時出現 The server made a boo boo. 的訊息....
(Aug. 04, 1998)
最可能發生這種情形的狀況如下:
當您的 CGI 程式設定錯誤,或者是 CGI 使用權限未被開放時,就會出現這個訊息。
程式中有錯誤的敘述,最常見到的是雙引號內又用到雙引號。
沒有以 ASCII 模式上傳 CGI 程式。
我的 CGI 程式不能執行,我該怎麼辦?
(Aug. 04, 1998)
參照 "CGI 程式不能執行最常發生的狀況有哪些?" 項所述的,逐一檢查並排除問題。
將所有修改過的程式行最左端(行首)放上井字符號 "#",然後再逐行消掉,每消掉一行就上載執行一次,直到找到出問題的位置,然後再好好檢查該行錯在那裡?
上網找尋相關的問題討論區,將問題張貼出來請廣大的網友們協助,但是切記﹔標題不要寫什麼 - 救命啊、完蛋了、很奇怪喔、怎麼辦、急死人了....之類不著邊際的廢話,應該直接簡要的寫出問題種類或狀況(以便讓對此問題有興趣或熟悉的人點選查看),然後在內文部分將問題詳細的描述出來,並且附上錯誤訊息的字樣,必要時可以將網址列出來,以便網友們前往測試,最重要的一點是一定要注意禮貌。
CGI 程式不能執行最常發生的狀況有哪些?
(Aug. 04, 1998)
使用者對 CGI 認識不深,以為每個網站都可以使用 CGI,或是必須申請使用權而未提出申請(或未獲核准),以至於本身根本就無法使用 CGI 而不自知。
某些網站的規劃與設置不同,而使用者未將程式放置在網站規定的 CGI 目錄內。
CGI Perl 程式上傳時未使用 ASCII 模式傳輸。
檔案屬性設定不當,無法有效執行程式或對資料檔案作讀寫動作。
修改程式時,遺漏部分標記或輸入錯誤的內容,例如:敘述結尾未加分號 ";"、雙引號括住的字串之間放置雙引號字元而左方未以反斜線 "" 作為前導字元....。
檔案的相關路徑設定錯誤或該路徑不存在,例如:程式檔案內第一行 #!/usr/bin/perl 的 Perl 解譯程式的路徑宣告、留言板程式的 /usr/lib/sendmail、資料檔案的放置位置....。
程式中有作讀寫處理的相關檔案未放在指定的位置。
什麼是 CGI?它可以作什麼?
(Mar. 07, 2000)
CGI 是 Common Gateway Interface 的縮寫,它可以連結網路主機端與瀏覽器端,使其能夠作檔案存取等動作的一種介面,CGI 程式就是可達成前述動作的程式,這是一種通稱而不是指某種特定的程式,CGI 程式可以使用多種電腦語言來撰寫,依據作業平台的不同最常見的有 C、C++、Perl、PHP、TCL、JAVA、VB....等,而大家在不同網頁上所見到的留言板、討論區、計數器、票選、寄賀卡、線上人數....等,都是屬於 CGI 程式的一種。
在網路上較常見的 CGI 程式多數是使用 Perl 語言撰寫的,因為它幾乎可說是專門為了撰寫 CGI 程式而量身打造的一種電腦語言,而且可使用的平台也較廣,如果是使用 VB 來撰寫 CGI 程式,那就只能在 Windows 平台上執行,若使用 C 語言來撰寫 CGI 程式,那麼就必須要在不同的作業平台上重新編譯過,否則是不能正常運作的。
Perl 語言是一種解譯式 (或稱直譯式) 的電腦語言,因此是以原始碼的型態散播的,它的語法基本上與 C 極為類似,釵h學習 CGI 程式的人都是由觀摩他人撰寫的 Perl 程式,進而修改成自己想要的介面或能來入門的,本文作者也不例外,Perl 比較特別的是正規表示式 (Regular Expressions),能非常非常的強大,但是因為是以符號所組成的一些處理規則,所以常常有初學者因為懶得查黎憟?國人的壞習慣)所以被它給打敗,如果您能在參考他人的程式時勤查文件來對照,其實學習起來並不難,我個人認為當您將這項特異能學會之後,也就差不多等於學會 Perl 了!
請您記得:並非所有站台都提供 CGI 的使用權,要在自己的網頁上使用 CGI 程式,必須要先確認網頁所屬的站台是否有開放 CGI 的使用權給您,如果您想再多瞭解一些有關 CGI 及 Perl 的資訊,或是想找有開放支援 CGI 使用權的站台,請多加善用搜索引擎來找尋,搜索引擎也是 CGI 程式的一種喔!
最後有一點提醒初學者,那就是相關名詞應該搞清楚,千萬不要混淆了,我個人常碰到的困擾如下:
網路上雖然較常看到以 Perl 語言所撰寫的 CGI 程式,但是 CGI 與 Perl 並不等於是同義字,如果在討論區或是其它管道向網友們請教時,請不要將名詞弄混了,如果是請教有關 Perl 語言所撰寫的程式問題,就寫明請教的是有關 Perl 語言的語法或流程....等,而不要寫成請教的是有關 CGI 的問題,否則徒然浪費雙方的時間而已,因為對方還必須問清楚您到底講的是哪種語言所撰寫的 CGI 程式?然後才能提供正確的資訊供您參考。
"CGI" 與 "CGI 程式" 也一樣不等於是同義字,"CGI" 一詞僅指 "通訊協定",而 "CGI 程式" 才是指 "程式",如果您問的是 "CGI",那就應該就 "通訊協定" 的範圍來發問,不要問到程式的指令、語法或敘述,否則就應該問 "CGI 程式" 應如何....,同時也應說明您問的是那一種語言所撰寫的 CGI 程式?
漁家小舖七嘴八舌論壇 - 論壇版權 1、本主題所有言論和圖片純屬會員個人意見,與本論壇立場無關。
2、主題由該作者發表,該作者與漁家小舖七嘴八舌論壇 享有相關版權。
3、使用、轉載或引用時必須同時徵得作者和漁家小舖七嘴八舌論壇 的同意。
4、作者須承擔一切發表而直接或間接導致的民事或刑事法律責任。
5、部分內容轉載自其他媒體,但並不代表本站贊同其觀點和對其真實性負責。
6、如侵犯到任何版權問題,請立即告知本站,本站將盡快刪除並致以最深的歉意。
7、漁家小舖七嘴八舌論壇 管理員和版主有權不事先通知而刪除本文。
作者文章推薦