こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

コマンドラインで通っているパスがブラウザからだと通っていない

以下のようなcgiを組みました。
 #! /usr/bin/perl -w
 
 use Calendar::Simple;
 use CGI::Carp qw(fatalsToBrowser);
 use Data::Dumper;
 use lib "/home/makoji/makoji00001/myperl/lib";
 
 my @curr=calendar;
 print Dumper(@curr);

レンタルサーバー上のこのCGIをSSHで
 perl calendar.cgi
とやるときちんと作動します。

しかしながらブラウザから作動すると500 Internal Sever Errorが出ます。

エラーログを見ると、以下のようになっています。
[Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] Can't locate Calendar/Simple.pm in @INC (@INC contains: /usr/lib/perl5/5.8.8/i686-linux /usr/lib/perl5/5.8.8 /usr/lib/perl5/site_perl/5.8.8/i686-linux /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl .) at /home/makoji/makoji00001/www/calendar.cgi line 3.
[Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] BEGIN failed--compilation aborted at /home/makoji/makoji00001/www/calendar.cgi line 3.
[Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] Premature end of script headers: calendar.cgi

Calendar/Simple.pmが@INCの中に無いとエラーが出ています。3行目でコンパイルに失敗したのもやはりCalendar/Simple.pmです。

@INCにCalendar/Simple.pmのパスを通すためにcgi頭で
 use lib "/home/makoji/makoji00001/myperl/lib";
を宣言しているわけです。

で、SSHを用いてコマンドラインから実行すると作動します。

なのに、何でブラウザからだと500 Internal Server Errorが出るのでしょう。

そもそも
 use CGI::Carp qw(fatalsToBrowser);
と宣言しているのに500 Internal Server Errorが出るというのも可笑しな話です。

何に問題があるのでしょうか。

ちなみに.bashrcは以下のようになっています。
 # .bashrc
 
 # Source global definitions
 if [ -f /etc/bashrc ]; then
  . /etc/bashrc
 fi
 
 # User specific aliases and functions
 export MANPATH=/home/makoji/makoji00001/myperl/man
 export PERL5LIB=/home/makoji/makoji00001/myperl/lib

お手数をお掛けします。

投稿日時 - 2009-06-13 00:29:12

QNo.5039318

すぐに回答ほしいです

質問者が選んだベストアンサー

> #! /usr/bin/perl -w

> use Calendar::Simple;
> ...
> use lib "/home/makoji/makoji00001/myperl/lib";

use lib の実行順が逆で、@INC にパスを追加する前に use Calender::Simple; の行が実行されてしまいます。
use lib の行を移動してみてください。しかし、No1 の方が書かれているように必ずしも実行できるようになる
とは限りません。


> レンタルサーバー上のこのCGIをSSHで
>  perl calendar.cgi
> とやるときちんと作動します。

コマンドラインで実行できるのは、.bashrc の中で PERL5LIB を設定しているからです。例え use lib の行が
なくても、コマンドラインからは実行できると思います。しかし、PERL5LIB の設定は、自分の環境だけに有効
で Web サーバには関係ありません。

投稿日時 - 2009-06-13 07:59:53

お礼

パスの行を上に持っていったところ、エラーログの内容が変わりました。

 Sat Jun 13 12:41:18 2009] [error] [client 114.162.47.49] malformed header from script. Bad header=$VAR1 = [: calendar.cgi

一瞬、まだエラーがあるのかよ~と思ったのですが、考えてみれば、件のプログラムはブラウザ上で閲覧できるためのHTML文を何らサポートしていません。

そこでプログラムを書き換えました。

 #! /usr/bin/perl -w
 
 use lib "/home/kojima/kojima00001/myperl/lib";
 use Calendar::Simple;
 use CGI::Carp qw(fatalsToBrowser);
 use Data::Dumper;
 use CGI;
 
 $q=new CGI;
 my @curr=calendar;
 
 print $q->header,
 $q->start_html('Test of Calendar::Simple'),
 Dumper(@curr);
 $q->end_html;

これでブラウザ上でもキチンと表示できるようになりました。

ありがとうございます。

投稿日時 - 2009-06-13 12:59:36

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

私もperl scriptのパーミッション設定が不適切、という説に1票。
httpd でCGIを起動するアカウントでは、問題のモジュールへのアクセス権が無いのではないかと。

ま、現象から推測しただけなので外しているかもしれませんが。

投稿日時 - 2009-06-13 01:13:01

ANo.1

いくつかの情報が無いので憶測になってしまいますが、

1. HTTPd の権限不足
 一番可能性があると思うのですが、例えば、Apache で動かしているとして、アクセスする CGI や Lib 達に適切なアクセス権限を与えていますか?

2. 実は、"/home/makoji/makoji00001/myperl/lib"; が絶対パスではなくて、HTTPd からは違うパスに見えている。バーチャルサーバなんかを使っている時に発生します。以前、自分が同じ問題で嵌った事があるのでね。

投稿日時 - 2009-06-13 00:41:37

補足

アドバイスありがとうございます。

パーミションは
 calendar.cgiが755、
 Simple.pmが555、
 .bashrcが644
です。

サーバーはレンタルで
 Linux CentOS 5.2
です。

パスの方は
 "/home/makoji/makoji00001/myperl/lib";
 "/home/makoji00001/myperl/lib";
 "/home/myperl/lib";
の3つを試してみましたが、やはりダメです。

投稿日時 - 2009-06-13 01:38:27

あなたにオススメの質問