• ベストアンサー

CGIからの絶対パス

こんにちは。 perlのCGIでファイルをオープンする際のパス指定で悩んでいます。 cgiとは別のディレクトリにあるファイルをオープンしたいのですが、 このとき、 open(IN,"/home/XXX/YYY/ZZZ.dat"); というふうに絶対パスでオープンしようとすると、オープンできません。 一方、 open(IN,"../../../home/XXX/YYY/ZZZ.dat"); といった感じに相対パスにすると、オープンできます。 ファイルの場所は/home/XXX/YYY/ZZZ.datで間違いありませんし、 cgiとしてではなく、シェルから直接cgiプログラムを起動すると、 絶対パスでもオープンできます。 これはいったいどういうことが起こっているのでしょうか? ご存知の方、ご解説願えないでしょうか。

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

  • ベストアンサー
回答No.2

> それに、アクセス権の問題なら、パスの指定方法で違いは出ないように思えるのですが、そういった可能性もあるのでしょうか? それもそうですね。すみません。 とりあえず、$!などのエラーメッセージはどうなってますか? ほかには -e でファイルを見つけることが出来るのかどうか、とか。 原因もわからずに対応は出来ませんので。

titokani
質問者

お礼

この件については、おそらくCGIとは別カテゴリになるかと思いますでので、 ひとまず締め切ることとします。 ありがとうございました。

titokani
質問者

補足

>とりあえず、$!などのエラーメッセージはどうなってますか? そうですね。基本的なことをやっていませんでした。 表示させてみたところ、エラーは"Permission denied"でした。 ・・・・ということはやっぱりアクセス権? で、調べてみましたところ、パスの途中のディレクトリ(この場合XXX)に読み込み許可がないものがありました。 drwxr-x--- 原因はきっとこれだと思います。ありがとうございました。 でも・・・・指定方法によってアクセスできたりできなかったりと、これってセキュリティホールじゃないんでしょうか??? それとも、アクセス権の設定って、所詮この程度なのでしょうか? また疑問が生じてしまいました。 OSはSolarisです。 /etc/releaseは Solaris Express Developer Edition 1/08 snv_79b X86 Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. Use is subject to license terms. Assembled 24 January 2008 です。なにかわかりますでしょうか?

その他の回答 (2)

  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

シェルからは大丈夫なのにCGIスクリプトからはダメということは サーバ(Apache?)が動いているコンピュータとシェルが動いている コンピュータとが異なってマウントの位置が違っているとか...。 本当に合っているか use File::Spec; print File::Spec->rel2abs('../../../home/XXX/YYY/ZZZ.dat'); として調べてみたらどうでしょうか。 サーバの設定などによってはCGIの実行するディレクトリの起点が ファイルのある場所と違う場合があります。

titokani
質問者

お礼

ありがとうございます。 コンピュータは一台だけです。 そういう可能性もあるのですね。 ひとまず原因はわかったのですが、新たな疑問が生じてしまいました・・・。

回答No.1

ZZZ.datのアクセス属性は、CGIで実行されるユーザーでアクセスできるようになってますか? nobody(非SuExec)なら0606または0666になると思います。 あと、この場合は絶対パスではなくフルパスと呼びます。 相対パスという呼び方はURLでもシェルでも同じです。

titokani
質問者

補足

>ZZZ.datのアクセス属性は、CGIで実行されるユーザーでアクセスできるようになってますか? はい、なってます。 ls -lで見ると、 -rw-r--r-- と、表示されています。 それに、アクセス権の問題なら、パスの指定方法で違いは出ないように思えるのですが、そういった可能性もあるのでしょうか?