例 : (1行目は/bin/cshを起動しているだけです)NCSA系のHTTPサーバーは、CGIスクリプトのエラー(正確には標準エラー出力-STDERRから出力された文字列)を、httpd.confで指定されたログディレクトリ中の「error.log」(NCSA、Apache〜1.2のデフォルトは/usr/local/etc/httpd/log/error.log。Apache1.3〜のデフォルトは/usr/local/apache/log/error.log)に出力する、上記の方法でだめな方は、このファイルを見てください。
$ csh↓
% setenv REQUEST_METHOD GET↓
% setenv QUERY_STRING key=data&key2=date2↓
% test.cgi↓
BEGIN{ close(STDERR); open(STDERR,">>your-own-log-dir/error.log"); } END{ close(STDERR); }
http://xxx.xx.xx.xx.jp:80/ (Squid/1.0.22) for aaa.aaa.aaa.aaaと出ます。ユーザのIPがaaa.aaa.aaa.aaaで、間にSquidを使ってるのが分かります。 $ENV{'HTTP_USER_AGENT'}にも
Mozilla/3.04 (WinNT; I) via Squid Cache version 1.0.22てな感じでSquidのバージョンが出てきます。 ためしに一度、
のようなCGIスクリプトを動かしてみてはいかがでしょう?いろんな 環境変数が見られると思います。#!/usr/local/bin/perl print "Content-Type:text/html\n\n"; foreach(sort keys %ENV){ print "$_:$ENV{$_}
"; }
ただし、CGIスクリプトが受け取る環境変数のうち、頭に"HTTP_"が付くものは、ブラウザやProxyの自己申告なので、簡単に偽造できることを覚えておきましょう。これで本当の通信相手のIPアドレスが分かるとは限りません。
chmod a+x CGIスクリプト名次に、UNIX系のマシンでCGIスクリプトを動かしている場合、行末コードがLF(\n)になっているか気をつけましょう。MacやWindowsのTeachTextやメモ帳で書いたCGIスクリプトをそのままFTPでUNIXに持っていってもきちんと動きません。 MacやWindowsには行末コードを変換するフリーソフトがたくさん出ているので、これらを使うか、Emacsを使って修正しましょう。 Emacsでは、
M-x M-k f *euc-japan*unixと入力することによって、UNIXのEUCに変換できます。 あるいは、以下のPerlスクリプトを使っても修正できます。
さらに、漢字コードの問題もあります。シフトJISやJISの中には、Perlが解釈しうる文字(#や%など)が入っているおそれがあるので、これらの漢字コードを使っている場合には、Emacsなどを使って(上記参照)EUCに変換してやるか、jperlという日本語対応版のperlを使いましょう。 また、雑誌などに書いてあるperlのパスはたいてい/usr/local/bin/perlになっていますが、/usr/bin/perlにperlをインストールすることもありますので、#/usr/local/bin/perl -p # ↑あなたのサーバーのperlのパス # # macwin2unix:標準入力の改行コードをLFに変換して標準出力に出力する s/\r\n/\n/; s/\r/\n/;
which perlなどを実行して、perlのパスを調べてやりましょう。違っていたらCGIスクリプトの1行目を修正すればOKです。 ほとんどの場合はperlのパスは/usr/local/bin/perlか/usr/bin/perlのどちらかなので、どちらにもない場合はperlがそもそもインストールされていない可能性の方が高いです。管理者にカニ缶でも贈って便宜してもらいましょう。
print "\n"; # 0x0a,0x0dを表示 binmode(STDOUT); print "\n"; # 0x0dを表示
または、$user = 'someone'; $home = <~$user>;
$user = 'someone'; $home = ((getpwnam($user))[7]);#($[ == 0の場合)。
のようにすれば復号化できます。この場合では文字コードはEUCになります。open(FILE, "/usr/local/bin/nkf -em $file |");# /usr/local/bin/にnkfがある場合