#!/usr/local/bin/perl # ================================ #  このファイルを保存してください。 # ================================ #  このファイルを「check.cgi」として保存してください。文字コードはEUC、改行コードはLFです。 # ================================ #  設定してください。 # ================================ # ●設定1 最初の1行 #  このファイルの最初の1行目「#!/usr/local/bin/perl」を、環境に合わせて # 変更してください。「#!/usr/local/bin/perl」か「#!/usr/bin/perl」のはずです。 # ●設定2 文法チェックをしたいCGIファイルを指定します。 # 下で、文法チェックをするファイル名を「,」区切りで記述します。 # 必要なければ空にしてください。 # 例:$syntax_file = 'test.cgi,abc.cgi'; 半角スペースなどは入れないで。 $syntax_file = 'test.cgi'; # ●設定3 jcode.plなどの必須ファイルがあればそれを指定します。 # 下で、必須ファイル名を「,」区切りで記述します。 # 必要なければ空にしてください。 # 例:$hissu_file = 'jcode.pl,mimew.pl'; 半角スペースなどは入れないで。 #$hissu_file = 'jcode.pl'; # ●設定4 CGIがファイルを作成する場合、ファイルを作成するディレクトリを指定します。 # 下で、ディレクトリパスを「,」区切りで記述します。最期に/を忘れずに。 # このCGIをおいたディレクトリを指定したい場合は「./」にします。 # 必要なければ空にしてください。 # 例:$hissu_file = './,./aaa/'; 半角スペースなどは入れないで。 #$filemakedir = './'; # 設定はここまでです。 # ================================ #  動かし方 # ================================ # ・EUC/LFで「check.cgi」という名前で保存します。 # ・「check.cgi」をチェックしたい.cgiと同じディレクトリにアップします。 # ・「check.cgi」のパーミッションを適切に変更します。 # ・ブラウザで「check.cgi」にアクセスします。 # ================================ #  もろもろ # ================================ # CGIを設置するときに、telnetができなくても文法チェックをしたかったので作ったもの。 # 他にもいろいろチェックしてくれます。 # 水沢・penguin-19・和彦 # フリーウェアです。ご自由に使用・改造してください。 # ただし、保証はありませんので、オウンリスクでお使いください。 # ver.0.1 2006/8/16 #  最初のバージョン。使わなくなったルーチンも残してあって、未整理ですが。 # ================================ #  メインルーチン # ================================ # ヘッダの出力 print "Content-type: text/html; charset=EUC-JP;\n\n"; print <<"_HTML_"; チェック結果  このCGIでは、基本的なチェックしか行いません。設定を変更した上で動作させてください。 _HTML_ # ====== cgiの文法チェック if($syntax_file ne ''){ print "
\n

文法チェック

\n"; print "

 「syntax OK」と表示されれば文法はOKです。エラーがでた場合は、どこかに文法的な誤りがあります。

\n"; print "
\n\n\n\n
\n"; @syntax_file = split(/,/,$syntax_file); # 文法チェックファイルを分解する foreach $filename ( @syntax_file ) { $cmd = $perl_path; $cmd .= "perl -c $filename"; print "\n

$filenameの文法チェック $cmd:\n"; &cmd($cmd); print "$_

"; } print "
\n"; } # ====== 必須ファイルの有無 if($hissu_file ne ''){ print "
\n

必須ファイルの有無

\n"; print "
\n\n\n\n
\n"; @hissu_file = split(/,/,$hissu_file); # 必須ファイル変数を分解する foreach $filename ( @hissu_file ) { &umu; } print "
\n"; } # ====== CGIがファイルを作成可能か if($filemakedir ne ''){ print "
\n

CGIがファイルを作成可能か

\n"; @testdirs = split(/,/,$filemakedir); # 分解する foreach $thisdir ( @testdirs ) { &filemake_test($thisdir); } } # ====== 基本チェック print "
\n

基本的なチェック

\n"; # このcgiの場所 print "

 ●このcgiのフルパス:

\n"; print "
\n\n\n\n
\n"; print "$ENV{SCRIPT_FILENAME}"; print "
\n"; # perlの場所 print "

 ●perlの場所:"; print "

\n\n\n\n
\n"; $cmd = "which perl" ; &cmd($cmd); print "
\n"; # perlのバージョン print "

 ●perlのバージョン:

"; # print "$]
\n"; # メモ print "
\n\n\n\n
\n"; $cmd = $perl_path ; $cmd .= "perl -v" ; &cmd($cmd); print "
\n"; print "

 ●このディレクトリ内のパーミッション情報

\n
\n"; print <<"_HTML_";

 パーミッションの変更はたいていの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。

_HTML_ print "
\n\n\n\n
\n\n"; print "

================ パーミッションの詳細情報 ================"; print "

●このディレクトリ内のファイル・ディレクトリのパーミッション
\n"; $cmd = "ls -l ./"; # ./を変更すれば別のディレクトリの情報も得られる。 &cmd($cmd); # コマンド実行・結果表示 print "

\n"; # フッタの出力 print "\n\n"; exit; # ================================ #  サブルーチン # ================================ # ■■ファイルの有無を調べるルーチン・必須 sub umu{ if ( -e $filename ) { print "

●$filenameは 存在します。

\n" ; } else { print "

$filenameが ありません。
\n" ; print "  $filenameをアップロードし、パーミッションを設定してください。

\n" ; } } # ■■パーミッションを調べるルーチン ファイル・読み出し可能か sub permit666 { if ( -r $filename ) { print "

●$filenameは 読み込み可能 です。

\n" ; } else { print "

$filenameは 読み込みできません。
\n" ; print "  パーミッションを666、644または444にして下さい。

\n" ; } } # ■■パーミッションを調べるルーチン ファイル・実行可能か sub permit777 { if ( -x $filename ) { print "

●$filenameは 実行可能 です。

\n" ; } else { print "

$filenameは 実行権限がありません。
\n" ; print "  パーミッションを777または755にして下さい。

\n" ; } } # ■■パーミッションを調べるルーチン ディレクトリ・書き込み可能か sub permitdir { if ( -w $filename ) { print "

●$filenameディレクトリは 書き込み可能 です。

\n" ; } else { print "

$filenameディレクトリは 書き込みできません。
\n" ; print "  パーミッションを777または755にして下さい。パーミッションが正しいのにこのエラーがでる場合は、次の「cgiがファイルを作成できるか」を参照してください。

\n" ; } } # ■■cgiがファイルを作れるかテストするルーチン sub filemake_test { # まずファイルを作ってみる。 my $filemakedir = @_[0]; # テストしたいディレクトリ my $testfielname = "test.txt" ; # テストで作成するファイル名 if (open(OUT, ">> $filemakedir$testfielname")) { # ファイル生成に成功したら flock(OUT, 2); # 念のためロック。close時に自動的に解除される printf(OUT "このファイルはテスト用のファイルです。\n"); printf(OUT "不要ですので、残っていたら削除してください。\n"); close(OUT); # エラーがなかったのでそのままファイルを削除して報告 unlink ($testfielname) ; # ファイルを削除して print "

 →cgiがファイルを作成できるかチェックしました。
\n"; print "  $filemakedirディレクトリは cgiがファイルを作成可能 です。

\n"; } else { # ファイルが作れなかったら print "

 →cgiがファイルを作成できるかチェックしました。
\n"; print "  $filemakedirディレクトリは cgiがファイルを生成できません
\n"; print "  $filemakedirディレクトリのパーミッションが777、755など書込可能になっているにも関わらずこのエラーがでた場合、cgiがファイルを生成できないようにサーバの制限が設けられています。FAQなどでサーバのローカルルールを確認してください。

\n"; } } # ■■コマンド実行ルーチン・perlのバージョン、ls、文法チェックで使用 # シンタックスチェックはシステムコマンドではなくperlデバッガなので # readpipeが使えないらしい。そこで、open ( ハンドル, コマンド| )を使う。 # 自分のためのメモ。 #  名称    ファイルハンドル  装置名   シェル # 標準入力    STDIN      キーボード   0 # 標準出力    STDOUT     ディスプレイ  1 # 標準エラー出力 STDERR     ディスプレイ  2 #  telnetでは出力の種類は意識しなくてもディスプレイにでてくるが、スクリ # プトでは区別されるため、エラー出力(2)を標準出力に振り替えて(>&1)受 # けとる。これがわかるまで苦労したぜ、くっそー。 # sub cmd{ # 破棄されたルーチン。記念にとってある。 # open(TEST,"$_[0] 2>&1|"); # while () { # if ( $_ =~ /syntax error | compilation errors/){ # 結果の文字列にerrorがあったら # print "
  $_\n"; # }else { # # if ( $_ =~ /Can't open/){ # オープンできないといわれたら # print "
 ファイルがありません。
  $_
\n"; # } else { # バージョン/ls/OKだったら # print "$_
\n"; # } # } # } # close(TEST); # } sub cmd { $output = `$_[0] 2>&1`; $output =~ s/\n/
/g; $output =~ s/\x09/    /g; if($output =~ /errors|Can't open/) { print "
$output\n"; } else { print $output; } }