#!/usr/bin/perl # ↑ここ、環境に応じて変更してください。■操作方法1参照 # ========================================================== # 操作方法と設定 # ========================================================== # 1. ↑冒頭の「#!/usr/bin/perl」を環境にあわせて変更します。 # 「#!/usr/local/bin/perl」か「#!/usr/bin/perl」で動くはずです。 # 2. ↓下の※変数の設定で、cgiをおくディレクトリ名「$perm_dir」を書き換えます。 # 3. ↓2つ以上のperlがインストールされているサーバでは、下で「$perl_path」を # 書き込みます。普通は空のままでいいはずです。 # 4. このファイルをmsearch.cgiと同じディレクトリにアップロードします。 # 5. このファイルのパーミッションを755または777にします。 # 6. ブラウザでこのcgiにアクセスするとチェックが始まります。 # このcgi自体のテストをしたい場合は「check_ms.cgi?test」にアクセスしま # す。「CGI Script OK. 」と表示されればOKです。 # jcode.plが利用可能な場合は、漢字コード・改行コードの判定も行います。 # なお、行頭に「#」のある行はコメント行で、無視されます。 # --------------- 変数の設定 ■操作方法2 --------------- # ↓msearch.cgiの入っているディレクトリ名を相対パスまたは絶対パスで$perm_dirに記述。 # ↓同時に、ここで指定されたディレクトリ内の詳細なパーミッションが表示されます。 # ↓ディレクトリ名の後ろに「/」はいりません。 # ↓例:$perm_dir = '../cgi-bin'; # ↓複数指定の場合は,で区切ります。 $perm_dir = '../msearch'; # --------------- 変数の設定 ■操作方法3 --------------- # ↓普通は空のままにします。 # ↓perlが2つ以上あるサーバで、perlバージョンチェック、cgiの文法チェックで # ↓特定のperlを指定したい場合、ここにperlのフルパスを書きます。そのような # ↓サーバでは、プロバイダのFAQにバージョンとパスの情報があるはずですので、 # ↓確認してください。 # ↓例:$perl_path = '/usr/local/bin/' ; ←このように最後にperlはいりません。 $perl_path = '' ; # 設定はここまでです。 # ========================================================== # ========================================================== # このファイルの情報 # check_ms.cgi ver.0.216 2001/10/23 変更履歴はこのファイルの最後 # 水沢・penguin-19・和彦 mizusawa@kiwi.ne.jp # http://www.kiwi-us.com/~mizusawa/penguin/index.html # Katsushi Matsudaさんの全文検索ソフトmsearchを設置するときのテスト用cgiです。 # msearchはhttp://www.kiteya.net/script/msearch/index.html # このツールはmsearchの作者Katsushi Matsudaさんとは関係がありません。ま # た、このツールはmsearchの動作を保証するものではありません。ただのチェッ # クツールです。 # このファイルは変数の変更だけで、汎用的に使えるようになっています。 # 個人・商用を問わず、このファイルの使用・改造・改造品の再配布は無断でで # きます。 # ただし、改造品の配布の場合はその旨を明記するか、オリジナル作者名を削除 # してください。混乱を避けるため、できるだけファイル名も変更してくださ # い。例:check_xxxx.cgi # CGI作者の方が、ご自分のcgiにチェックツールとしてこのファイル(またはそ # の改造品)を添付することももちろんOKです。できればご一報ください。 # ========================================================== # 以下の変数は変更の必要はありません。 $cgi_title = "msearch"; # 調査するcgiの名前 $cgi_title_url = "msearch"; # 調査するcgiの名前・urlつき $this_title = "$cgi_title設置チェック結果:ver.0.216"; # このcgiのタイトル $perl_ver = "5.x"; # このcgiがサポートするperlのバージョン。$perl_ver = "4.x、5.x"; $hissu_file = "msearch.cgi,genindex.cgi,fold.pl,jcode.pl,indexing.pl,config.dat"; # 必須ファイルのファイル名を,区切りで記述。漢字/改行コード判定の対象にもなる $arukana_file = "genindex.pl"; # オプション(なくてもいい)ファイルのファイル名を,区切りで記述 $perm_do = "msearch.cgi,genindex.cgi"; # 755、777のパーミッションのファイル名を,区切りで記述 $perm_read = "fold.pl,jcode.pl,genindex.pl,indexing.pl,config.dat"; # 444、644、666のパーミッションのファイル名を,区切りで記述 $syntax_file = "msearch.cgi,genindex.cgi"; # 文法チェックをするファイル名を,区切りで記述 $sample = 3 ; # 漢字/改行コード判定の時にファイルから読み込む最大kb数。デフォルトでは3。普通はこれで十分です。変更する場合はせいぜい10kbまでにして下さい。 # 操作方法2で指定する$perm_dirについてのメモ # ↑メモ:cgi-binなど特定フォルダでしかcgiを動かせず、データを別のディレクトリに # ↑置く場合も、ここで絶対パスでデータディレクトリを指定するとチェック可能。 # ↑その場合は念のため絶対パスで記述してください。↓cgi-binとdataディレクトリをチェックする例 # ↑例:$perm_dir = '../cgi-bin,/usr/name/html/data'; # ========================================================== # CGIテスト用 # ブラウザから「check_xxx.cgi?test」という風にアクセスしてテストします。 # Script OKと表示されたら無事動きます。macでは動作しません。 if ("$ARGV[0]" eq "test") { print "Content-type: text/html\n"; print "\n"; print "CGI Script OK.\n"; exit(0); } # ========================================================= # ■■メインルーチン print "Content-type: text/html; charset=EUC-JP;\n\n"; print <<"_HTML_";
このツールは$cgi_title_urlの設置を手助けするものです。最初に、$cgi_title_urlの説明にしたがって、サーバにcgiを設置してください。その後、このツールでチェックすると、おかしなところを拾い出してくれます。
チェックに失敗した項目は赤字で表示されます。簡単な指示はでますが、もう一度$cgi_title_urlのマニュアル等を参照して該当部分を確認してください。
初心者が引っかかりそうなところを中心にチェックしています。改造するような中級者にも文法チェックは役に立つでしょうし、基本的なポカをなくせると思います。
なお、このツールでチェックできるのは、cgi周りの環境で、cgiがなんとか動くようになるところまでです。cgiの中の細かい設定までは見ていません。
cgi周りの環境についても、$cgi_title_urlのFAQに書かれている制限のうち、次の制限のチェックはこのツールではできません。つまり、このツールでエラーがないにも関わらず$cgi_title_urlが動作しない場合は、次のことが疑われます。
c.CGIからのファイル読み込みに制限がかかっている.
サーバによってはCGIから読み込むことができるファイル数に制限をかけていることがあります。→サーバ管理者に問い合わせてください。解決方法はFAQにあります。d.CGIのメモリ使用量に制限がかかっている.
サーバによってはCGI1プロセスあたりのメモリ使用量に制限をかけているところがあります。→サーバ管理者に問い合わせてください。解決方法はFAQにあります。
フルパス情報やperlバージョン情報、cgiファイル名など、悪用されるかもしれない情報が表示されますので、用が済んだらこのcgiはサーバから削除してください。
以下、テストの結果です。テスト結果は枠で囲まれて表示されます。
(perlが2つ以上はいっているサーバでは、perlの場所、バージョン、文法チェックなどがおかしくなります。こうしたサーバでバージョン・文法チェックをしたい場合、チェックに使いたいバージョンのperlのフルパスを変数\$perl_pathに設定する必要があります。_HTML_ # ====== 基本チェック print "
このcgiの最初の方に設定部分があります。テキストエディタで開いてフルパスを書き込み、アップし直して、再度ブラウザでアクセスしてください。パスがわからなかったらお使いのプロバイダのFAQなどを確認してください。
通常、perlは一つだけだと思いますので、\$perl_pathは空のままでいいはずです。)
●perlの場所:"; print "
\n"; print "\n
\n \n\n"; $cmd = "which perl" ; &cmd($cmd); print " \n
このcgiが動いているのですでにわかっていると思いますが、$syntax_fileの最初の行「\#!〜」をこれに合わせます。\n"; # perlのバージョン print "
\n ただし、perlが2つ以上あるサーバの場合はこの情報を信用せず、\$perl_pathに書いたパスを設定します。
●perlのバージョン:
"; # print "$]\n"; print "\n
\n \n\n"; $cmd = $perl_path ; $cmd .= "perl -v" ; &cmd($cmd); print " \n
$cgi_title_urlを動かすにはperlのバージョン$perl_ver以上が必要です。"; # このcgiの場所 print "
●このcgiのフルパス:
\n"; print "\n"; print "\n
\n \n\n"; print "$ENV{SCRIPT_FILENAME}"; print " \n
\n"; print "\n"; # ↓これは必要なくなった。 # $this_dir = $ENV{SCRIPT_FILENAME}; # @this_dir = split(/\//,$this_dir); # 必須ファイル変数を/で分解する # @this_dir_r = reverse @this_dir; #ひっくり返す。@this_dir_r[1]がこのcgiのあるディレクトリ名となる。 # ====== ファイルの有無・必須 print "上のパスは絶対パスでこのcgiの場所を示しています。
\n" ; print "web上でファイルの場所を示すURLアドレス(http://〜)と異なり、サーバの中のファイルの場所を示すのがパスです。今いる場所から目的の場所までを示す「相対パス」と、サーバのルートディレクトリ(一番上のディレクトリ)からファイルの場所までを示す「絶対パス(フルパス)」があります。
\n" ; print "
\n 絶対パスは「/」から始まります。「aaa/bbb」となっていれば、「/」で始まっていないので相対パスで、「今いるディレクトリにあるaaaディレクトリの下のbbb」という意味です。
\n"; print " 「/aaa/bbb」となっていれば絶対パスで、「サーバの一番上のディレクトリ(/)にあるaaaの下のbbb」という意味です。意味がまるで違いますので注意。
\n 相対パスの場合、一つ上のディレクトリは「../」と書きます。今いるディレクトリは「./」と書きます。「aaa/bbb」と「./aaa/bbb」は同じ意味ですが、「../aaa/bbb」は意味が違います。\n"; print "
\n"; # ====== ファイルの有無・オプション(なくてもよい) if ( $arukana_file ne "") { # オプションがあるときだけ表示する print "\n
\n \n\n"; @hissu_file = split(/,/,$hissu_file); # 必須ファイル変数を分解する foreach $filename ( @hissu_file ) { &umu; } print " \n
\n"; } # ====== パーミッション・チェック print "\n
\n \n\n"; @arukana_file = split(/,/,$arukana_file); # なくてもいいファイル変数を分解する foreach $filename ( @arukana_file ) { &umu2; } print " \n
■■ディレクトリのパーミッション
\n"; print "\n"; print "\n
\n \n\n"; @perm_dir = split(/,/,$perm_dir); # ディレクトリを分解する $i = 0; foreach $filename ( @perm_dir ) { &permitdir; # 書き込み可能ディレクトリか &filemake_test ; # cgiがファイルを作れるか } print " \n
■■実行ファイルのパーミッション
\n"; print "\n"; print "\n
\n \n\n"; @perm_do = split(/,/,$perm_do); # 777を分解する foreach $filename ( @perm_do ) { &permit777; # 実行可能か } print " \n
■■読み込みファイルのパーミッション
\n"; print "\n"; print "\n
\n \n\n"; @perm_read = split(/,/,$perm_read); # 666を分解する foreach $filename ( @perm_read ) { if ($filename eq "jcode.pl") { $j_check = 1 ; } # jcodeが利用可能なら1 &permit666; # 読み込み可能か } print " \n
■■詳細なパーミッション情報
\n\n"; print <<"_HTML_";_HTML_ print "上のパーミッションチェックも、下の詳細で確認してください。パーミッションの変更はたいていのFTPソフトで可能なはずです。こんな感じのウインドウで設定します。
permission キャンセル OK
読む 書込 検索/実行 オーナー: □ □ □ グループ: □ □ □ 全員: □ □ □ パーミッションはファイルに与えられた読込・書込・実行の権限のことで、755、644などの数字で表します。
下の詳細表示はシェルコマンドでパーミッションを表示させています。telnetで表示されるものと同じです。ここではパーミッションは数字ではなく、各権限がダイレクトに表示されています。詳細情報の読み方は次のようになります。
最初の「-」はそれがファイルであることを示します。「d」ならディレクトリです。次に列記されているのがパーミッション(権限)。
rwxの3つで一組で、rは4点、wは2点、xは1点持っていて、それを足します。
つまり、rwxなら7、rw-なら6、r-xなら5、r--なら4です。
これが(rwxの組が)オーナー、グループ、全員の3組あります。
この順番に各組のポイントの合計を読むと755、644などとなります。これがパーミッションです。上に示したFTPソフトのパーミッション設定も、これを理解していれば設定できるはずです。
+-------------------- d はディレクトリ。-はファイル
|+------------------- r オーナーの読込権限 4┐
||+------------------ w オーナーの書込権限 2├足して7
|||+----------------- x オーナーの実行権限 1┘
||||+---------------- r グループの読込権限 4┐
|||||+--------------- w グループの書込権限 2├足して7
||||||+-------------- x グループの実行権限 1┘
|||||||+------------- r 全員の読込権限 4┐
||||||||+------------ w 全員の書込権限 2├足して7
|||||||||+----------- x 全員の実行権限 1┘
|||||||||| ↑
drwxrwxrwx 全部あると777となる
-rwxr-xr-x ←練習問題。このパーミッションは? 答えは755。
\n"; # ====== cgiの文法チェック print "\n
\n \n\n\n"; print " \n================ パーミッションの詳細情報 ================"; # @perm_dir ディレクトリは分解済み foreach $filename ( @perm_dir ) { print "
●$filename 内のファイル・ディレクトリのパーミッション
\n"; $cmd = "ls -l $filename"; &cmd($cmd); # コマンド実行・結果表示 } print "
「syntax OK」と表示されれば文法はOKです。エラーがでた場合は、どこかに文法的な誤りがあります。
\n"; print "\n"; # ====== jcode.plが利用可能だったら、漢字コード・改行コードのチェック print "\n
\n \n\n"; @syntax_file = split(/,/,$syntax_file); # 文法チェックファイルを分解する foreach $filename ( @syntax_file ) { $cmd = $perl_path; $cmd .= "perl -c $filename"; print "\n \n●$filenameの文法チェック $cmd:\n"; &cmd($cmd); print "$_
"; } print "
\n"; print "\n
\n \n\n"; $sample = $sample *1024 ; #KBを1024倍してバイトに変換 if ( $j_check == 1) { # jcode.plをまずチェック $line = ""; open (THIS_FILE, "./jcode.pl" ); # ファイルをオープン read ( THIS_FILE , $line , $sample ) ; #$sampleバイトだけ$lineに読込 close (THIS_FILE); $br_code = ( $line =~ /\r/) ; # CRがあったら$br_code=1なければ0 if ($br_code == 1){ # げ、CRがあるぜ。 $j_check = 2; print "●jcode.plの改行コードが Windows(CR+LF)かMAC(CR) です。 \n
\n"; print " 改行コードは UNIX(LF)にする必要があります。
\n"; print " jcode.plが利用できないため、漢字コード・改行コードの判定はキャンセルされました。
\n"; } print "\n"; } if ( $j_check == 1) { require './jcode.pl'; # こんなところでリクワイアしていいのか? # @hissu_file = split(/,/,$hissu_file); # 必須ファイル変数は分解済み foreach $filename ( @hissu_file ) { $line = ""; open (THIS_FILE, "$filename" ); # ファイルをオープン read ( THIS_FILE , $line , $sample ) ; #$sampleバイトだけ$lineに読込 close (THIS_FILE); # print "デバッグ用:$filenameの内容は次の通り。
\n"; # デバッグ用出力 $code = ""; # 初期化 $code = &jcode'getcode(*line) ; # 漢字コードの判定ver4 # $code = &jcode::getcode(\$line); # 漢字コードの判定ver5 print "
$line\n"; if ($code eq "euc"){ # eucなら print "●$filenameの漢字コードは $code です。
\n"; # $i = $i + 1; # 次のファイルの判定 } } print "
\n"; } else { # それ以外なら if ($code eq "sjis" ){ print "●$filenameの漢字コードは 「$code」 です。
\n"; print " 漢字コードは EUC である必要があります。
\n"; } else { # 判定できなかったら if ($code eq "jis" ){ print "●$filenameの漢字コードは 「$code」 です。
\n"; print " 漢字コードは EUC である必要があります。
\n"; } else { @suffix = split(/\./,$filename); # ファイル名を.で分解する if (@suffix[1] eq "cgi") { # cgiだったらちょっとヤバイ。 print "●$filenameの漢字コードは 判定できませんでした。
\n"; print " EUCファイルであることを他の手段で確認してください。
\n"; } else { # cgiでなければ print "●$filenameの漢字コードは 判定できませんでした。
\n"; print " おそらくファイルの中に日本語がないために判定不能だったと思われます。
\n"; print " その場合は漢字コードは関係ないのでこのままでよいはずです。
\n"; print " 念のため$filenameを開いてすべて英文かチェックしてください。
\n"; } } } } $br_code = ( $line =~ /\r/) ; # CRがあったら$br_code=1なければ0 if ($br_code == 1){ # げ、CRがあるぜ。 print "●$filenameの改行コードは Windows(CR+LF)かMAC(CR) です。
\n"; print " 改行コードは UNIX(LF)にする必要があります。
\n"; } else { print "●$filenameの改行コードは UNIX(LF) です。
\n"; } print "
\n"; print "\n"; print "このファイルが動いているということは、すでに「漢字コード・改行コード」については知識があると思います。ちょこっとだけおさらいします。
\n"; print "・漢字コード
\n"; print "
\n 現在サーバで使われている漢字コードにはEUC、JIS、SJISがあります。WindowsやMacintoshなどのパソコンではSJISが使われていますが、特殊なものを除き、perl cgiはEUCにします。・改行コード
\n"; print "
\n Windowsでは「CR+LF」、Macintoshでは「CR」が改行コードです。perlでは「LF」でないと行として認識されないので動作しません。漢字コード・改行コードの変換には、これらを認識・変更可能なテキストエディタを使います。保存時に漢字コード・改行コードを指定して保存するだけです。Vectorなどで探すと良いと思います。代表的なところでは、Windowsでは「秀丸」、Macintoshでは「JEdit」ゃ「mi」「褌edit」などがあります。
\n"; print "「手元では確かにEUC/LFなのに…」という場合は、FTPツールが勝手に書き換えてアップしている場合がありますので、FTPツールの設定をチェックしてみてください。アップロードはASCIIモード(MACのFetchならRaw data)で転送しているかも要チェックです。
\n"; print "
以上でテストは終わりです。
\n";
print " エラー(赤字)があったら、上から順番に赤字がなくなるようにチェックしていってください。
このツールでチェックできないケースについては、このページの最初の方に書いてあります。ご一読下さい。
●$filenameは 存在します。
\n" ; } else { print "●$filenameが ありません。
\n" ;
print " $filenameをアップロードし、パーミッションを設定してください。
●$filenameは 存在します。
\n" ; } else { print "●$filenameがありませんが、このファイルは必須ではありません。
\n" ; } } # ■■パーミッションを調べるルーチン ファイル・読み出し可能か sub permit666 { if ( -r $filename ) { print "●$filenameは 読み込み可能 です。
\n" ; } else { print "●$filenameは 読み込みできません。
\n" ;
print " パーミッションを666、644または444にして下さい。
●$filenameは 実行可能 です。
\n" ; } else { print "●$filenameは 実行権限がありません。
\n" ;
print " パーミッションを777または755にして下さい。
●$filenameディレクトリは 書き込み可能 です。
\n" ; } else { print "●$filenameディレクトリは 書き込みできません。
\n" ;
print " パーミッションを777または755にして下さい。パーミッションが正しいのにこのエラーがでる場合は、次の「cgiがファイルを作成できるか」を参照してください。
→cgiがファイルを作成できるかチェックしました。
\n";
print " $filenameディレクトリは cgiがファイルを作成可能 です。
→cgiがファイルを策せできるかチェックしました。
\n";
print " $filenameディレクトリは cgiがファイルを生成できません。
\n";
print " このディレクトリのパーミッションが777、755など書込可能になっているにも関わらずこのエラーがでた場合、cgiがファイルを生成できないようにサーバの制限が設けられています。このままではインデックスファイルを作成できませんので、あらかじめ「mindex.dat」という空っぽのファイルを作り、パーミッションを666にしてからインデックスをつくって下さい。