Hi-ho で、T-Filesafe を使いたいのですがエラーに・・・

[上に] [前に] [次に]
クラブのA [E-Mail] 1999/11/17(水) 01:19:17
http://www.mytools.net/cgitools/filesafe0.html
に置いてるCGIを使いたいのですが、エラーで動きません。
作者の掲示板に質問したのですが、ご多忙のようで、他の方からもレスがありません。

Hi-ho で、このCGIを使用してる方がいらっしゃれば、
$basedir = ".";
$rootdir = "/home/who/tfsdata";
の記述方法が知りたいので教えてください。

現在、
$basedir = "filesafe";
$rootdir = "$ENV{'HOME'}/tfsdata";
と書いてアップしてますが、02 ... 指定されたファイルが存在しない というエラーが出ます。
URLは、
http://www.dab.hi-ho.ne.jp/cgi-bin/user/club/tfsafe.cgi
です。

サーバーには
+ <cgi-bin>
|   + tfsafe.cgi (705)
|   + <filesafe> (707)
|     + errors.txt (606)
|     + access.txt (606)
|
+ <tfsdata> (707)
   + config.txt (606)
   + tscgi.gif (604)

の構成でファイルを置いてます。( )内は、パーミッションです。

つばさ 1999/11/17(水) 01:48:50
具体的にお答えする事はできないのですが、
http://www.eva.hi-ho.ne.jp/himetarou/
こちらのホームページがお役に立つかもしれないのでね
ご紹介します。…ご存知かな。
でしゃばってごめんなさい。

wosamu 1999/11/17(水) 09:12:36
$ENV{'HOME'}の値は何が入ってらっしゃいます?
CGIがnobodyで動作するとかなら期待する値とは違うかも。
素直にフルパスで書いてみては?

クラブのA 1999/11/17(水) 19:11:43
◆つばささん
>ご紹介します。…ご存知かな。
はい。ご紹介の掲示板には過去何回か質問をしましたが、他所のCGIで起きた問題では決まって「作成者に聞いてください」と一言レスが返って来るだけでした。
また、ページ内を探してみましたが、それらしき記述は見つかりませんでした。

>でしゃばってごめんなさい。
いえいえ、レスがついて感謝してます(^^)

◆wosamuさん
>$ENV{'HOME'}の値は何が入ってらっしゃいます?
特に設定してませんが、どのような記述で確認できるのでしょうか?
"$ENV{'HOME'}" と書けば、自動的に自分のホームページへの値が入るものだと思ってたもので。。。

>CGIがnobodyで動作するとかなら
すみませんが、初心者なので、これの意味がわかりません。
噛み砕いて書いてくださると有り難いのですが。。。

>素直にフルパスで書いてみては?
フルパスで書きたいのですが、書き方がわかりません。
Hi-ho の場合、html(public_html相当) の下に "NEW" というディレクトリをつくったとき、CGIを置いたところから見たパスは、
$ENV{'HOME'}/html/NEW/
になるようです。

andi 1999/11/18(木) 12:27:21
「通常のHTML用ディレクトリ(public_html等)の外にファイルを置ける環境が必要」
と書いてありますがどうでしょう。

wosamu 1999/11/18(木) 13:24:32
>andiさん
>通常のHTML用ディレクトリ(public_html等)の外にファイルを置ける環境が必要」
これは動作するしないではなくて
おそらくdocumentroot以下に作ったディレクトリでは意味がないということでは?
>クラブのA さん
>特に設定してませんが、どのような記述で確認できるのでしょうか?
print "$ENV{'HOME'}";
だけ処理するようなCGIを作ってそれを実行すれば
表示されると思います。
作り方がわからなければ現在設置されているCGIのエラー出力のところ
(sub errorとかいうところ)のprint "<BODY><H1>Access Denied.</H1>\n";
とかいう行の後ろにでも追加するとうまくいくかもしれません。

>すみませんが、初心者なので、これの意味がわかりません。
こういう説明は苦手なのですよね。
今回の場合はとりあえず関係なさそうなので割愛させてください。
誰か得意な方できればお願いします。
>フルパスで書きたいのですが、書き方がわかりません。
Hi-Hoでの注意書きを参照しましたらフルパスでの表記はできないとのことですね。
>$ENV{'HOME'}/html/NEW/
で恐らくよいと思います。

で、本題。
プログラムのソースを拝見したところ、
前略
$path_info = $ENV{'PATH_INFO'};
中略
unless(-f "$rootdir/$path_info"){ &error("02"); }
となっております。
ここで$ENV{'PATH_INFO'}で得られる値はfoo.cgiから?までの値が
セットされるらしいのですが、これは必ず"/"から始まります。

$rootdirが$ENV{'HOME'}/html/NEW/であった場合
$ENV{'HOME'}が"/foo/bar"だとすると
"$rootdir/$path_info"は
/foo/bar/html/NEW///tscgi.gifとかになるわけです。
当方の環境でテストした限りでは正常に動作するのですが
環境によってはうまくいかない可能性も考えられます。

$rootdir = "$ENV{'HOME'}/tfsdata";
と指定して
$path_info = $ENV{'PATH_INFO'};
とやっている直後に
$path_info=~s/\///;
というのを挿入してみてください。
それでどうでしょうか。
以下は余談です。
>はい。ご紹介の掲示板には過去何回か質問をしましたが、他所のCGIで起きた問題では決まって「作成者に聞いてください」と一言レスが返って来るだけでした。
もし私が推測したことが今回のトラブルの原因であったなら
いってみればプログラムのバグであるわけでそういうのは
基本的に作成者なり利用者なりが直すべきだと思います。
だからまあ、正しい意見じゃあないかと。

クラブのA [E-Mail] 1999/11/19(金) 00:34:21
◆andiさん
>「通常のHTML用ディレクトリ(public_html等)の外にファイルを置ける環境が必要」
>と書いてありますがどうでしょう。
public_html(Hi-ho では "html")の外にファイルが置けます。ディレクトリもつくれます。

◆wosamuさん
丁寧なご説明を頂き、ありがとうございます。

>print "<BODY><H1>Access Denied.</H1>\n";
>とかいう行の後ろにでも追加するとうまくいくかもしれません。
これは、うまくいきました。
/AA/BBBB/club となってました。("AA" と "BBBB" は数字)

>$path_info=~s/\///;
>というのを挿入してみてください。
はい、挿入してみました。しかし、今度は
Your access to file "" has been denied, sorry.
(Error Code: 00)
ファイル名が指定されていない というエラーが出てしまいました。

$basedir = ".";
にして、errors.txt と、access.txt も同じディレクトリに入れてみたり、
$rootdir = "$ENV{'HOME'}/html/../tfsdata";
に変えたりしましたが、いずれもダメでした。

お手数ですが、もう一度アドバイスを頂ければ幸いです。

wosamu 1999/11/19(金) 09:42:50
上で掲載されたアドレスのCGIではまだエラー番号は
02が返ってきているので別のアドレスに新規に作られたと判断してよろしいでしょうか。
新しいアドレスとか修正したソースとかあれば原因の確定がはやくなるかもしれません。
で、
>Your access to file "" has been denied, sorry.
>(Error Code: 00)
>ファイル名が指定されていない というエラーが出てしまいました。
というのは$path_infoという変数が空のときに出るエラーですね。
アドレスの指定が〜.cgi/filenameという風になっているのなら
ソースを修正する時点で何か間違いがあったのかもしれません。
ここのサイトのperl入門とかを参考にソースを眺めてみるのもよいかもしれませんね。
結構暗号解読みたいで楽しいものですよ。

ところでこれってどういう用途で使われるものなのでしょうか?
アクセス制限なら.htaccessとかでやったほうが楽だと思うのですが。
どうですか?識者の方。

クラブのA 1999/11/19(金) 21:46:42
◆wosamuさん
>上で掲載されたアドレスのCGIではまだエラー番号は
>02が返ってきているので別のアドレスに新規に作られたと判断してよろしいでしょうか。
いいえ。wosamuさんのアドバイスどおり、
$path_info = $ENV{'PATH_INFO'};
の次の行に
$path_info=~s/\///;
を書き足したものをアップしてます。
私の環境(Windows98 MSIE4)で見ると、(Error Code: 00) なんですけど。。。
OSとかブラウザとかで、見え方が違うのでしょうか?
http://www.dab.hi-ho.ne.jp/cgi-bin/user/club/tfsafe.cgi

>新しいアドレスとか修正したソースとかあれば原因の確定がはやくなるかもしれません。
アドレスは変えておりません。また、CGIファイルで書き直した箇所は、
$basedir = "filesafe"; # 99-11-16変更
$rootdir = "$ENV{'HOME'}/tfsdata"; # 99-11-16変更
$path_info=~s/\///; # 99-11-18追加
の3行だけですが。。。

挿入場所違いということも有り得ますので、ソースをご確認頂けますか?
http://www.dab.hi-ho.ne.jp/club/a/tfsafe.txt

説明書通り、access.txt、errors.txt、config.txt の3つは、0 バイトの空ファイルのままです。

>アドレスの指定が〜.cgi/filenameという風になっているのなら
CGI動作チェック用のサンプル画像を呼び出すアドレスは、
http://www.dab.hi-ho.ne.jp/cgi-bin/user/club/tfsafe.cgi/tfcgi.gif
になってます。

>結構暗号解読みたいで楽しいものですよ。
そうですね(^^) CGIの本は持ってませんので、取り敢えずWebで勉強してみます(笑)

>ところでこれってどういう用途で使われるものなのでしょうか?
以前、自作のMIDIを公開してたのですが、直にリンクを貼ってるサイトを発見してしまいました。その後は、ファイルの場所を定期的に変えてました。そこで、他のサイトから直にリンクされない方法は無いかと探してたところ、このCGIが見つかったわけです。

つまり、html(public_html 相当)の外にファイルを置くことで、直リンクを貼らせない…というのが狙いです。このCGIでの「アクセスログ」や「アクセス制限」は、副産物と考えてます。

同様趣旨のスクリプトがあれば、それを利用させて頂くことも考えたいと思ってます。
ご存知の方がいらっしゃれば、紹介してください。(勝手ながら、フリーで改造が自由なスクリプトを希望します)

wosamu 1999/11/20(土) 12:02:44
私の環境(win98SE、NN4.6 IE5)では
cgi-bin/tfsafe.cgi/tfcgi.gif: file not exist
とだけ出ますね。
どうやらCGI自体は動作していますし、
config.txtは取得できている(エラー99でないから)
出力されるエラーメッセージはtfsafe.cgiのものではない。(形式が違うから)
おそらく出ているエラーはこのプロバイダで使用しているuser.cgi(でしたっけ、なんか注意書きみたいなやつに書いてあるやつ)からのメッセージのようですね。
ということはプロバイダでの何らかの制限に引っかかっている可能性があります。
で、だいぶ弱気になってきたのですが提案として、
1)プロバイダに問い合わせてuser.cgiの動作について確認してみる。
2)$rootdirをHTMLファイル等を置いてあるディレクトリしたに指定する。
この場合$path_info=~s/\///; # 99-11-18追加
は外しておいてください。よく見たら拡張子を取得してMIMEタイプを
判別するところで/が必ずあるものとして処理していますね。

確かにファイルパスが正確にわかってしまえばアクセスされてしまいますがサブディレクトリを掘って$rootdirをわかりづらくすればある程度は防げるのではないかと。
あ、これで動作するかどうかは不明ですけど。
ただこれって、リンクをhttp://www.dab.hi-ho.ne.jp/cgi-bin/user/club/tfsafe.cgi/tfcgi.gifって張った場合には動作しないわけ?
そうじゃないと意味がないからそうなのかな。
それとも動作しても意味があるのかな?
ちょっとよくわからない。
解決策となるかは正直自信ないのですがこんなところです。
それでは。

wosamu 1999/11/20(土) 12:02:44
私の環境(win98SE、NN4.6 IE5)では
cgi-bin/tfsafe.cgi/tfcgi.gif: file not exist
とだけ出ますね。
どうやらCGI自体は動作していますし、
config.txtは取得できている(エラー99でないから)
出力されるエラーメッセージはtfsafe.cgiのものではない。(形式が違うから)
おそらく出ているエラーはこのプロバイダで使用しているuser.cgi(でしたっけ、なんか注意書きみたいなやつに書いてあるやつ)からのメッセージのようですね。
ということはプロバイダでの何らかの制限に引っかかっている可能性があります。
で、だいぶ弱気になってきたのですが提案として、
1)プロバイダに問い合わせてuser.cgiの動作について確認してみる。
2)$rootdirをHTMLファイル等を置いてあるディレクトリしたに指定する。
この場合$path_info=~s/\///; # 99-11-18追加
は外しておいてください。よく見たら拡張子を取得してMIMEタイプを
判別するところで/が必ずあるものとして処理していますね。

確かにファイルパスが正確にわかってしまえばアクセスされてしまいますがサブディレクトリを掘って$rootdirをわかりづらくすればある程度は防げるのではないかと。
あ、これで動作するかどうかは不明ですけど。
ただこれって、リンクをhttp://www.dab.hi-ho.ne.jp/cgi-bin/user/club/tfsafe.cgi/tfcgi.gifって張った場合には動作しないわけ?
そうじゃないと意味がないからそうなのかな。
それとも動作しても意味があるのかな?
ちょっとよくわからない。
解決策となるかは正直自信ないのですがこんなところです。
それでは。

クラブのA 1999/11/21(日) 00:58:48
◆wosamuさん
何度も何度も申し訳ないです。

>1)プロバイダに問い合わせてuser.cgiの動作について確認してみる。
すみませんが、具体的にどのようなことをお聞きすれば良いのでしょうか?
以前、Hi-ho 宛てに質問したときの回答では、
>大変申し訳ございませんがHi-HOではお客様個別のホームページ作成につきましては
>サポート外となっております。
>そのためファイル転送などの設定はお答えできますが、ホームページ作成上のテク
>ニックなどはサポートいたしかねますのでご了承頂けますようお願いいたします。
というのが返信されたことがありまして、質問には気をつかってます。

>2)$rootdirをHTMLファイル等を置いてあるディレクトリしたに指定する。
なるほど!
<a href="hogehoge/tfcgi.gif">tfcgi.gif</a>
では、リンク先がバレてしまいますが、
<a href="/cgi-bin/user/club/tfsafe.cgi/tfcgi.gif">tfcgi.gif</a>
なら分からないと。

>あ、これで動作するかどうかは不明ですけど。
試してみましたが、ダメでした。

>解決策となるかは正直自信ないのですがこんなところです。
いろいろとアドバイスを頂きましてありがとうございました。仕方がないので、他の方法を考えてみます。


過去スレッドで、JavaScript を使って「リンク先を分からなくする方法」の紹介がありましたが、CGIが使えるプロパイダーなら、このCGIは有効ではないかと思います。もし、Hi-ho ユーザーの方で、設置にチャレンジして成功した方がいらっしゃれば教えてください。

wosamu 1999/11/21(日) 12:10:05
うーん、お役に立てなくて申し訳ない。
>すみませんが、具体的にどのようなことをお聞きすれば良いのでしょうか?
具体的っていうとなんともいえないのですけど
今までの状況から考えるとどうやら使用しているCGIからのエラーでも
webサーバからのエラーでもないように思えるのでおそらくuser.cgiの
エラーメッセージだと思う.
だからそれ(user.cgiでしたっけね?cgiを呼ぶcgi)の動作について聞いてみるのがよいのかな?

ほかの方法を考えられるということなので余談なのですが(しつこいね)
エラーメッセージが
"cgi-bin/tfsafe.cgi/tfcgi.gif: file not exist"
だったことから考えると
user.cgiはcgiを起動する前に指定のファイルパスを検索して
そのパスにファイルが存在しない場合に上記のエラーを返すと予想する。
(つまり$ENV{'PATH_INFO'};を使用して引数の受け渡しをすることが考慮されていない)
もしこの予想が正しければファイル名の渡し方を変えてしまえば動作する可能性があるわけです。
具体的にいうと〜cgi?filenameとかして$ARGV[0]で取得する方法です。
このページのリファレンスとかを参考に。

後は、ファイルネームを自動変更するスクリプトを書くとか...。

それでは

wosamu 1999/11/21(日) 12:45:19
引数を取得方法を変更する際の注意点を追加。
># MIMEヘッダの出力
以下の部分で$path_infoの先頭に必ず"/"があるものとして
処理を行っているのでそこも変更が必要ですね。
けどこれ(先頭が必ず"/")ってもともと必要なのかなあ?

クラブのA 1999/11/22(月) 20:54:18
◆wosamuさん
>だからそれ(user.cgiでしたっけね?cgiを呼ぶcgi)の動作について聞いてみるのがよいのかな?
プロパイダーヘメールを出しました。返事が来てから、「○○でした」と書けば良いのでしょうが、待ってるといつになるか分からないので…。ウチのプロパイダーは、返信が遅いもんで(^^;

>具体的にいうと〜cgi?filenameとかして$ARGV[0]で取得する方法です。
>このページのリファレンスとかを参考に。
はい。勉強してみます。

>後は、ファイルネームを自動変更するスクリプトを書くとか...。
これはちょっと…。BASIC ですら満足に書いたことがないのに…。

>># MIMEヘッダの出力
>以下の部分で$path_infoの先頭に必ず"/"があるものとして
>処理を行っているのでそこも変更が必要ですね。
具体的なヒントのようですが、私には何のことやら…。
無知ですみません。

wosamu 1999/11/24(水) 18:56:52
>プロパイダーヘメールを出しました。返事が来てから、「○○でした」と書けば良いのでしょうが、待ってるといつになるか分からないので…。
>ウチのプロパイダーは、返信が遅いもんで(^^;
いえ、まああちらもお忙しいでしょうし。
>はい。勉強してみます。
頑張ってください(^^
>具体的なヒントのようですが、私には何のことやら…。
もとのソースコードの
# MIMEヘッダの出力
ってかいてある辺りです。
パターンマッチとかはちょっとわかりづらいかもしれませんけど頑張ってください。

頑張れ頑張れだけじゃ私がつまらないので。
まあ、とりあえず$path_infoを取得している行を
$ARGV[0]から取得するように変更して〜cgi?filenameっていうふうに
呼び出し方を変更してそれでエラーメッセージが変わらないようなら
どのみち動かないのだから、いったんそれで試されたらどうですか?
指定したファイルがHTMLファイルならソースが表示され、gifファイルとかなら
訳の分からない文字列とかが表示されればうまくいく可能性があるってことで。

クラブのA 1999/11/30(火) 00:33:25
プロパイダーから返信されました。質問の仕方が悪かったのか、期待はずれ?の
コメントです。


 >> Hi-ho でCGIを動作させる前の user.cgi の動作について教えてください。
 >
 >
 >お問い合わせの件でございますが、CGIプログラムuserは、お客様ディレクトリ内
 >の cgi-bin/に置かれた CGIを、そのCGIの所有者自身(お客様自身の権限(UID))
 >で動作させるためのものでございます。
 >
 >サーバー上の制限事項のページにも記述させて頂いておりますが、プログラム
 >userがお客様のcgi-binディレクトリ直下にあるCGIを呼び出して実行する仕組み
 >になっておりますので、cgi-bin直下に置かれたCGIのパスが
 >/cgi-bin/user/club/CGIプログラム名
 >となります。
 >また、上記理由により、cgi-bin直下以外の場所ではCGIが動作しませんのでご注
 >意下さい。

とのことです…。


>まあ、とりあえず$path_infoを取得している行を
>$ARGV[0]から取得するように変更して〜cgi?filenameっていうふうに
>呼び出し方を変更してそれでエラーメッセージが変わらないようなら
>どのみち動かないのだから、いったんそれで試されたらどうですか?

やっぱり、私には相当険しい道のようで(^^;

wosamu 1999/12/02(木) 09:34:54
>プロパイダーから返信されました。
なんかHPに書いてある通りですね。
まあその辺は仕方ないでしょう。
>やっぱり、私には相当険しい道のようで(^^;
引数の渡し方を変えるだけなのですけどね。
このサイトのPerl入門の引数を使うにはとかいうところをみても、
難しいようなら別の道を模索したほうが良いかもしれません。
渡し方を変えて動作するかどうかは少し興味があったのですが。

[上に] [前に] [次に]