• ベストアンサー

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

以下のような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 お手数をお掛けします。

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

> #! /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 サーバには関係ありません。

makoji
質問者

お礼

パスの行を上に持っていったところ、エラーログの内容が変わりました。  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; これでブラウザ上でもキチンと表示できるようになりました。 ありがとうございます。

その他の回答 (2)

  • Toshi0230
  • ベストアンサー率51% (836/1635)
回答No.2

私もperl scriptのパーミッション設定が不適切、という説に1票。 httpd でCGIを起動するアカウントでは、問題のモジュールへのアクセス権が無いのではないかと。 ま、現象から推測しただけなので外しているかもしれませんが。

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

いくつかの情報が無いので憶測になってしまいますが、 1. HTTPd の権限不足  一番可能性があると思うのですが、例えば、Apache で動かしているとして、アクセスする CGI や Lib 達に適切なアクセス権限を与えていますか? 2. 実は、"/home/makoji/makoji00001/myperl/lib"; が絶対パスではなくて、HTTPd からは違うパスに見えている。バーチャルサーバなんかを使っている時に発生します。以前、自分が同じ問題で嵌った事があるのでね。

makoji
質問者

補足

アドバイスありがとうございます。 パーミションは  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つを試してみましたが、やはりダメです。

関連するQ&A

  • パスがうまく通らない

    Check.pmが  o:\public_html/post_pervice/cgi/lib にあります。 このモジュールを利用するために以下のようなプログラムを書きました。   #! /usr/bin/perl -w   use CGI::Carp qw(fatalsToBrowser);   unshift @INC, "o:/public_html/post_service/cgi/lib";   print join "\n",@INC;   use Check; この中の  use Check; をコメントで伏せて動かすと、   o:/public_html/post_service/cgi/lib   O:/usr/site/lib   O:/usr/lib のような表示がなされるので、  unshift @INC, "o:/public_html/post_service/cgi/lib"; はちゃんと機能しているようです。 しかし  use Check; のコメントを外して動かすと、   Can't locate Check.pm in @INC (@INC contains: O:/usr/site/lib O:/usr/lib .) at O:\public_html\post_service\cgi\showINC.pl line 8.   BEGIN failed--compilation aborted at O:\public_html\post_service\cgi\showINC.pl line 8. のようなエラーが出てしまいます。 何がいけないのでしょう。

    • ベストアンサー
    • Perl
  • Can't locate R.pm in @INC

    perl初心者でまた質問させていただきます。 CGIを作っているのですが、R.PMが使えなくて困っています。 USE R; とすると、以下のようなエラーが出てしまいます。 Can't locate R.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .) at /srv/www/htdocs/cgi/ringo.cgi line 5. BEGIN failed--compilation aborted at /srv/www/htdocs/cgi/ringo.cgi line 5. Premature end of script headers: ringo.cgi そこで、 locate R.pm で、場所を探しました。 /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi/R.pm ということで、 use R '/usr/lib/perl5/5.10.0/x86_64-linux-thread-multi/'; このように変えてみたものの、同じエラーです。ちなみに、CGIではなく、PERLのプログラムからだと、use R;で動作することは確認しました。 よろしくお願いします。

    • 締切済み
    • CGI
  • CGI::Carpを使っているのにInternal Server Error

    うまく動きません。コマンドラインでは作動するのですが、ブラウザではダメでした。  #! /usr/bin/perl -w  use Calendar::Simple;  use CGI::Carp qw(fatalsToBrowser);  use Data::Dumper;  use lib "/home/kojima/kojima00001/myperl/lib";  my @curr=calendar;  print Dumper(@curr); もっともその理由は分かりました。  use lib "/home/kojima/kojima00001/myperl/lib"; が  use Calendar::Simple; より後にあったことです。 さらに言うと、ブラウザで動かすためにはHTMLをサポートしていないといけませんが、このコードはHTMLをサポートしていません。 この2点を修正して、無事このプログラムはブラウザでもうまく動いたのですが、問題はうまく動いてくれていなかった時のブラウザの表示です。 Internal Sever Errorが出ていました。それじゃ何のことか分からなくて嫌だから  use CGI::Carp qw(fatalsToBrowser); と宣言してあるのです。 モノの本によると、この場合は  Software error:  Can't locate Calendar/Simple.pm in @INC (@INC containts: @INCに含まれるディレクトリがズラズラ・・・).  BEGIN failed--compilation aborted at calendar.cgi line3. というエラーメッセージが表示されるはず。 つまりCGI::Carpが機能していないことになります。 何故でしょう? お手数をお掛けします。

    • ベストアンサー
    • Perl
  • Jcode.pmについて

    ネット上からダウンロードしてきたCGIプログラム内で、Jcode.pmを使用しているようなのですが、サーバ にUpしたところ、以下の様なエラーが表示されました。 ※1 Can't locate Jcode.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl .) at access/accview.cgi line 68. ※2 BEGIN failed--compilation aborted at access/accview.cgi line 68. ちなみに、accview.cgi line 68には use Jcode; と書かれていました。 エラーの原因として、何がありますか? また、その解決法を教えていただきたいです。

    • ベストアンサー
    • Perl
  • perl niftyについて。use CGI;

    画像アップロードのスクリプトを作ろうと思っているのですが、 use CGI; という記述をすると、ここでエラーに引っかかります。 下はperl checkerでのエラー表示です Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5/5.00503/sun4-solaris /usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/site_perl/5.005/sun4-solaris /usr/local/lib/perl5/site_perl/5.005 .) at a.cgi line 10. BEGIN failed--compilation aborted at a.cgi line 10. 参考URLはここ http://www.topstudio.co.jp/~kmuto/html/node38.html niftyでは使えないようになってしまっているのでしょうか? また、CGI.pmを使わないファイルアップロードの仕組みを解説しているサイトを知っている方がいたら、教えてくださいませ。

    • ベストアンサー
    • CGI
  • フォームの送信ボタンを押すと

    どなたか、お助けいただければ幸いです。 メールフォームを設置し、いざ送信テストをしようと 思ったのですが、送信をする際に下記のようなエラーがでます。 対処方法を教えてください(@´_`@)フエーン □エラーメッセージ□ Software error: Can't locate Jcode.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl/5.6.0/i386-linux /usr/lib/perl5/site_perl/5.6.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/vendor_perl/5.6.1 /usr/lib/perl5/vendor_perl .) at mailform.cgi line 8. BEGIN failed--compilation aborted at mailform.cgi line 8. というような、エラーです。このエラーは当方は初めて見るエラーでして、どのように対処すればわかりません。。。 □8行目記載内容□ use Jcode; のみです。 □フォーム設置ツリー□ ../inquiry/index.html ../cgi/toiawase/mailform.cgi ../cgi/jcode.pl   ↓ここから下は同ディレクトリーです。 ../cgi/cgi-lib.pl という中身で設定しております。 □環境□ IBM Xserver(Xeon 2.4GHz) Redhat Linux DirectAdmin Apache1.3.29 もし、この件でこの内容がなければ対処ができないとのことであれば、 何なりとおっしゃってください。 よろしくお願いします。。。

    • ベストアンサー
    • CGI
  • エラーログについてお尋ねしたいことがあるのですが。

    エラーログについてお尋ねしたいことがあるのですが。 CGIがうまく接続されずサーバー上で500エラーになるためサーバー管理者に尋ねたところエラーログに以下のようにKihon.pmが見つからない模様です。という返事が返ってきましたがCGIは詳しくないため、この内容が理解できずに困っています。 また、このような場合の回避策などがあればご指導願いたいと思っています。 Can't locate Kihon.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at kanri.cgi line 16. BEGIN failed--compilation aborted at kanri.cgi line 16.

    • ベストアンサー
    • CGI
  • MovableType5のエラー文を教えて下さい。

    お世話になります。ご質問させてください。 OCNのスタンダードプランにMovabletType5.02をFTPでアップロードしてmt.cgiにアクセスしました。ログインをクリックすると下記のエラー文が表示されます。エラー文はどのような意味なのでしょうか?また、解決方法をご存知の方は教えて下さい。 ちなみにmt-check.cgiにアクセスすると500エラーが表示されます。 パーミションを変更しても500エラーが表示されます。 他のサーバーにはMTを何回もインストールして設定したこともあります。 宜しくお願い致します。 Got an error: Can't locate Encode.pm in @INC (@INC contains: /usr/home/○○○/www/htdocs/mt/extlib lib /usr/local/lib/perl5/5.6.1/i386-freebsd /usr/local/lib/perl5/5.6.1 /usr/local/lib/perl5/site_perl/5.6.1/i386-freebsd /usr/local/lib/perl5/site_perl/5.6.1 /usr/local/lib/perl5/site_perl/5.6.0/i386-freebsd /usr/local/lib/perl5/site_perl/5.6.0 /usr/local/lib/perl5/site_perl/5.005/i386-freebsd /usr/local/lib/perl5/site_perl/5.005 /usr/local/lib/perl5/site_perl .

    • ベストアンサー
    • CGI
  • Can't locate...

    こんにちは。Perl初心者で、 ネット上のPerlのサンプルプログラムを動かそうとしましたが 以下のようにエラーがでて実行できません。。 Can't locate Lingua/JA/Romanize/Japanese.pm in @INC (@INC contains: ./ /usr/local/lib/perl5/5.00504/i686-linux /usr/local/lib/perl5/5.00504 /usr/local/lib/perl5 /site_perl/5.005/i686linux /usr/local/lib/perl5/site_perl/5.005 .) at object.cgi line 4. BEGIN failed--compilation aborted at object.cgi line 4. これはどういったエラーで、どうすれば解決しますか。 教えてください。

  • movable typeのエラーメッセージの対処法を教えて

    movable typeのインストール直前です。 mtディレクトリ以下のmt.cgiがブラウザで読み込めず(ダウンロードになってしまう)、 メモ帳で開くと以下のメッセージです。 Got an error: install_driver(SQLite) failed: Can't locate DBD/SQLite.pm in @INC (@INC contains: /home/infonet2/public_html/(私のサイト名)/cgi/mt/extlib lib /usr/lib/perl5/5.8.7/i686-linux /usr/lib/perl5/5.8.7 /usr/lib/perl5/site_perl/5.8.7/i686-linux /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl .) at (eval 10) line 3. Perhaps the DBD::SQLite perl module hasn't been fully installed, or perhaps the capitalisation of 'SQLite' isn't right. Available drivers: DBM, ExampleP, File, Multiplex, Proxy, Sponge, mysql. at lib/MT/ObjectDriver/DBI/sqlite.pm line 64 対処法を教えてください。