dbmをcgiで使うには?

[上に] [前に] [次に]
やるきなしの介 [E-Mail] 1999/12/04(土) 14:50:30
 初まして、やるきなしの介ともうします。
パソコン始めて7ヶ月、perlを勉強し始めて一ヶ月タコですが、どうしても分からないので・ス問宜しくお願いします。
 dbmを使い<form>で入力した情報をdbmを使って入力し出力するというcgiを作り、文法チェックではokがでたのですがブラウザーで開くと500 internal seever errのメッセージがでます。
入門書には、.dirと.pagはカレントディレクトリ上に生成されると書いており、どこかのページでdbmが使えないサーバーは500のメッセージがでると書いていたので確認の為、下記を作りました。サーバー上では動くのですがブラウザーで開くと、500......errがでて表・されません。
サーバー上でdbmを制限するというのはあるのでしょうか?何か基本的な所を間違っているのでしょうか?宜しくご教授ください。

#!/usr/local/bin/perl

$test="test";
$info="info";
dbmopen(%DATA,"./$test/INFO",0666);
$DATA{"$info"}="やるきなしの介<BR>テスト入力です。\n";
dbmclose(%DATA);
print "表・テスト!名前とタイトルが表・されるか!\n";
dbmopen(%DATA,"./$test/INFO",0666);
if (defined $DATA{"$info"}){
     print $DATA{"$info"};
     print "\n";
}else{
     print "------\n---------\n";
}
dbmclose(%DATA);

dbmを階層的に使うのは間違っているでしょうか?

ふじ 1999/12/05(日) 00:16:32
#なんで化けてるんだろ?

>ブラウザーで開くと
CGIとして実行している、という意味ですよね?

単に、Content-Type ヘッダを出していないからでは。
CGI として実行するのなら、

print "表示テスト(中略)\n";
のまえに、
print "Content-Type: text/plain\n\n";
とでもしましょう。

EMI 1999/12/05(日) 06:47:49
DBMを作成するディレクトリのパーミッションは大丈夫ですか?

やるきなしの介 [E-Mail] 1999/12/06(月) 11:23:11
以下のように変え、パーミッションもムキになって777に変えてみました。
結果、やはりサーバー上ではその通りに動作しますが、ブラウザーで(cgiとして)読み込むと同じ500 Internal Server Errorがでます。
dbmを使うに当たって、unixサーバーに必要なソフトってあるんでしょうか?

     1  #!/usr/local/bin/perl
     2
     3  $test="test";
     4  $info="info";
     5  dbmopen(%DATA,"./$test/INFO",0666);
     6  $DATA{"$info"}="やるきなしの介<BR>テスト入力です。\n";
     7  dbmclose(%DATA);
     8  print "Content-type: text/html\n\n";
     9  print "<HTML><HEAD><TITLE>test</TITLE></HEAD><BODY>\n";
    10  print "表示テスト!\n名前とタイトルが表示されるか!\n\n\n";
    11  dbmopen(%DATA,"./$test/INFO",0666);
    12  if (defined $DATA{"$info"}){
    13       print "$DATA{\"$info\"}";
    14       print "\n";
    15  }else{
    16       print "------\n---------\n";
    17  }
    18  dbmclose(%DATA);
    19  print "</BODY></HTML>";

サーバー上では
Content-type: text/html

<HTML><HEAD><TITLE>test</TITLE></HEAD><BODY>
表示テスト!
名前とタイトルが表示されるか!


やるきなしの介<BR>テスト入力です。

</BODY></HTML>

が出力されます。

wosamu 1999/12/06(月) 11:56:48
cgiで実行されている環境と
(質問者の表現で)サーバ上で実行されている環境は同じなのでしょうか?
同じならファイルを作成するディレクトリのパーミッションとかは特に関係無いですよね。
(作成されないだけですし。)
ちなみに私のLANでつながっているテスト用の環境では500エラーはでませんでしたけど。

ふじ 1999/12/06(月) 15:46:32
その CGI を実行しようとしたディレクトリで、他の CGI は正常に
動作してますか?
たとえば、

#!/usr/local/bin/perl

print "Content-Type: text/plain\n\n";
print "Hello";
exit;

こんなのは動きますか。
#見られるのならサーバのエラーログを見ると何か分かるかも。

やるきなしの介 [E-Mail] 1999/12/06(月) 17:30:47
以前、dbmではなくtext.ファイルに書き込み読み込むというものを作ったときは問題なかったのですが、dbmをつかうとエラーがでます。
 ”ふじ”さんのスクリプトはブラウザーで読み込むとちゃんと動きました。(どうやらDBMを使わなければうごくようです。)

サーバーエラーメッセージを調べて貰ったのですが以下のメッセージがでていました。

Premature end of script headers
Directory index forbidden by rule
No write permission to ndbm file at .......dbmtest.cgi

です。

wosamu 1999/12/06(月) 18:56:11
ndbmが使用不能の環境が無いので何ともいえませんけど
もしかしたらその環境ではdbmモジュールがインストールされていないのかも。
サーバの管理者の方に問い合わせてみては?
けど、
>サーバー上では
中略
>が出力されます。
ということは使えているわけですよね。
くどいようですが、ブラウザで見ているときとサーバー上というときとでは
同じ環境なのですよね?

ふじ 1999/12/06(月) 19:05:58
>ブラウザで見ているときとサーバー上というときとでは同じ環境
実行しているユーザが違うんでしょうな。

>No write permission to ndbm file
書き込み権限がないよ、と言われているので、
パーミッションを見直してみては。

wosamu 1999/12/06(月) 23:33:31
>実行しているユーザが違うんでしょうな。
777にしたのなら、大丈夫な気がしますけど。
>書き込み権限がないよ、と言われているので、
>パーミッションを見直してみては。
これって、どこの書き込み権限なんでしょうね。
ただ、ファイルを作成するだけなら、それに失敗しても
dbmopen関数が偽の値を返すだけのような気がするのですけど。

ふじ 1999/12/07(火) 03:06:08
>これって、どこの書き込み権限なんでしょうね。
作った dbm ファイルの書き込み権。

多分、 telnet で(一般のユーザ権限で) dbm を作って、
それを CGI (nobody 権限)で書き換えようとしてエラーになってる
気がしますが。
# 作った dbm ファイルのパーミッションはどうなってますか??

> dbmopen(%DATA,"./$test/INFO",0666);

これで 666 のパーミッションをもつ dbm ファイルが作られるかと
いうと、そうではないんですね(さっきラクダ本を見た(^^;)

(青ラクダ本より)
----
dbmopen HASH, DBNAME. MODE
(中略)
データベースが存在しない場合、有効なモードが指定されていれば、
MODE を umask で修飾したパーミッションを持つデータベースファイルが
新規に作成される。
----

なので、
dbmopen の前に
umask 0;
を入れると、お望み通り 666 のパーミッションを持つ dbm ファイルが
作られるんじゃないでしょうか。

やるきなしの介 [E-Mail] 1999/12/07(火) 08:59:23
[[解決]]
 ありがとうございます。
 ”ふじ”さんの言うとおり、 dbmopenのumask 0;前に試してみると見事に動作しました。
 環境の事ですが、telenetでつなげて作成し、そのディレクトリをブラウザーで直に開いているので同じ環境だと思います。
環境の意味がよく分からなかったもので、どうもすいませんでした。
 最初、0と()を間違えて,()で・ソ行して・ッ敗し、一度dir,pagを削除し、もう一度ブラウザーで読み込むと動作。
その後、間違いに気づき、0にしました。期待通りの動きをしました。()と0でも同じ動きをするっていうのも不思議ですが、これから色々試してみます。
 皆さん、本当に有り難うございました。

wosamu 1999/12/07(火) 09:54:40
>多分、 telnet で(一般のユーザ権限で) dbm を作って、
>それを CGI (nobody 権限)で書き換えようとしてエラーになってる
>気がしますが。
># 作った dbm ファイルのパーミッションはどうなってますか??
ああ、なるほど。見事な推理ですね(^^
けど、結果的にumask 0を追加して動作したっていうのなら、また妙な話だと思うのですが。
#私の勘違いですか?
ああ、
>一度dir,pagを削除し、もう一度ブラウザーで読み込むと動作。
なるほど。これですね。

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