>>2552 stone_free まず、 #!/usr/bin/perl require 'jcode.pl'; このスクリプトをコマンドラインから動かして下さい。カレント ディレクトリに jcode.pl があればちゃんと動くでしょう。 suid したスクリプトを実行すると、perl は自動的に汚染モード (taint mode) に切り替わります。いちいちスクリプトを suid して web 経由で実行するのは面倒なので、perl に -T オプションを付けて 汚染モードで動作させます。 #!/usr/bin/perl -T require 'jcode.pl'; 今度は jcode.pl が見付からない、と言われるはずです。 require がライブラリを探すパスは @INC で設定されていますので、今度は #!/usr/bin/perl print "@INC\n"; と #!/usr/bin/perl -T print "@INC\n"; で違いを調べます。 # perl -e 'print "@INC\n"' # perl -Te 'print "@INC\n"' # としてもいいです。 すると、上の方では @INC の最後に `.' (カレントディレクトリ) が含まれて いますが、-T を付けると `.' が含まれていないことがわかります。ドキュメント化 されていないのかもしれませんが、これは汚染モードの仕様なのでしょう。 というわけで、 require './jcode.pl'; require '/foo/bar/jcode.pl'; などと、@INC に頼らず require するか、require する前に push(@INC, '.'); すれば解決です。 その他、suidperl で動かすと PATH だとか umask だとかで文句を 言われることがあるかもしれませんが、いきなりブラウザ上で動作を 検証することはせず、必ず -T 付でコマンドラインから動作を確かめる ようにして下さい。 |