NT+IIS4.0+perlでファイルの操作をするには?

[上に] [前に] [次に]
初心者 [E-Mail] 1999/11/04(木) 11:24:26
NT+IIS4.0でPERLを動かそうとしているのですが、ファイルの操作がうまくいきません。
"print"など表示だけのものは問題なく動くのですが、データの受け渡しなどに失敗するようです。
書き込みのスクリプトを実行すると、何もエラーを返さず書き込んだように見えてデータファイルには入っていません。
アクセス権なども確認したつもりです。
なぜなんでしょう??
ご存知の方教えてください。

無責任官庁 1999/11/04(木) 14:04:53
> 書き込んだように見えてデータファイルには入っていません

これは・・・?
ファイルそのものは、できたのですか?それで中身がカラとか。
それとも、ファイルさえもできていない?

どのようなプログラムを書いたのか、教えていただけると良いかもです。
open文をどう書いたのかが、ポイントじゃないかな。
openとprint、どう書いたか教えてくれます?

初心者 [E-Mail] 1999/11/04(木) 15:43:09
無責任官庁さん、ありがとうございます。

ファイルさえもできません・・・。
ファイルを作ってあげてはどうか?と思って、先に作ってあげても(もちろんフルアクセスで)真っ白なんです。
open以下はこんなです。
-------ここから--------------
open(IN,">data.txt");
print IN "<DT><A HREF=\"mailto:$mail\">$name</A>";
print IN "&lt;<A HREF=\"$url\">$url</A>&gt;\n";
print IN "<DD>$comment\n";
close(IN);
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n<TITLE>書き込みました</TITLE>\n</HEAD>\n";
print "<BODY>\n<H1>書き込みました</H1>\n";
print "</BODY>\n</HTML>";
--------ここまで-------------
ちなみに「書き込みました」は表示されるんです。

無責任官庁 1999/11/04(木) 16:43:04
えーと・・・プログラム見た限りでは、変な所ないけど・・・

ファイルが無いというのは、どこを見て無いって言いましたか?
または、このopenによってファイルが出来る場所は、
どこだと思ってますか?

IISでCGIやる場合のポイント・・・
http://www.tohoho-web.com/wwwcgi4.htm#WinNT
ここの(5)にあるように、カレントディレクトリが違ってると思う。
恐らく、Inetpub\wwwroot の下にでもファイル出来てるんじゃないかなぁ(^-^;)

“data.txt”を、検索してみては?
(スタート→検索→ファイルやフォルダで、探す場所をマイコンピュータに)

初心者 [E-Mail] 1999/11/08(月) 17:29:07
残念ながらマイコンピュータで検索しても「data.txt」はありませんでした。ちなみにhttp指定してもダメでした。
http://www.tohoho-web.com/wwwcgi4.htm#WinNT
(5)のchdirもやってみましたが、ダメでした。
困りました。何か根本が間違っているのでしょうか?
訳分からなくなってきました。
とほほほほ・・・

ふじ 1999/11/08(月) 17:52:00
とりあえずスクリプトの先頭で
print "Content-Type: text/html\n\n";
としておいて、

>open(IN,">data.txt");
これを

open(IN,">data.txt") or print "can't open data.txt $!";

としてみて実行しましょう。
ファイルのオープンに失敗しているならメッセージが出ます。

あと、適当なところで

use Cwd;
print "current dir = ", cwd();

としてみて下さい。
これでカレントディレクトリが分かるはずです。

ぎん 1999/11/08(月) 18:03:39
NTサーバー上のCGIは、私も素人なんですが。。。
ちなみに、うちの環境では、同じ文で書き込めました。
試しに、

> open(IN,">data.txt");
を、フルパスで指定してみるとか、

open(IN,">data.txt");
print IN "abc";
close(IN);
の様にごく単純にしてみるとか。。。

ごめん、きっと参考になってないね。

ふじ 1999/11/08(月) 18:08:38
カレントディレクトリが(思っているのと)違っちゃってる気が・・・

>(5)のchdirもやってみましたが、ダメでした。
これも、
chdir("hogehoge") or print "chdir false. $!";
として、メッセージが出ないかどうか見てみましょう。

#open 等の戻り値はこまめにチェックする習慣を付けた方が
#良いです。デバッグが楽になるから。

初心者 1999/11/08(月) 18:58:50
ふじさん。ありがとうございます。
ふじさんの言うとおりに書き換えてみると、下記メッセージが
----------ここから-----------------
chdir false. No such file or directory can't open data.txt No such file or directory Content-type: text/html
書き込みました
current dir = D:/Inetpub/wwwroot
-----------ここまで----------------
何もかも失敗している感じですね。


ぎんさん、ありがとうございます。
結果はこうでした。
-----------ここから-----------------
CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:
-----------ここまで-----------------
ヘッダの分解?


すみません。今日はあまり時間がないもので、とりあえず結果報告しました。

ふじ 1999/11/08(月) 20:29:35
まとめて、いくつか確認しましょう。

1. chdir の引数には何を指定していますか?

chdir("C:\Inetpub\scripts");
これだと駄目です。

chdir("C:\\Inetpub\\scripts");
または、
chdir('C:\Inetpub\scripts');
または、
chdir("C:/Inetpub/scripts");

上記のいずれかのように指定します。

2. data.txt はどこに作りたいんですか?
例えば C:/Inetpub/wwwroot/hoge に作りたいならば(適切にアクセス権を指定した上で)
open("> C:/Inetpub/wwwroot/hoge/data.txt");
とフルパスで指定したらどうなりますか?

3. 「IUSER_なんとか」というユーザーのフォルダへのアクセス権は
どうなってますか?

初心者 1999/11/10(水) 09:16:47
ふじさん、ありがとうございます。

>1. chdir の引数には何を指定していますか?
D:/Inetpub/wwwroot/cgi-bin
というフォルダを使っています。
指定は("C:/Inetpub/wwwroot/cgi-bin");
にしました。

>
>2. data.txt はどこに作りたいんですか?
D:/Inetpub/wwwroot/ahoとします。
>例えば C:/Inetpub/wwwroot/hoge に作りたいならば(適切にアクセス権を指定した上で)
>open("> C:/Inetpub/wwwroot/hoge/data.txt");
>とフルパスで指定したらどうなりますか?
フルパスで指定してみました。

>
>3. 「IUSER_なんとか」というユーザーのフォルダへのアクセス権は
>どうなってますか?
匿名アクセスを許可する設定になっています。


ところがどっこい、
--------------ここから-------------------
can't open data.txt Permission denied Content-type: text/html
書き込みました
current dir = D:/Inetpub/wwwroot/cgi-bin
--------------ここまで-------------------
なんですよね。

WEBのルートはD:\で、perl32はC:\に入っているんです。でも構成で「perl.exe」
が動くように指定しているんですよ。
何か関係ありますかねぇ。
すみません。

hiro-kim 1999/11/10(水) 16:33:27
冗長な繰り返しになってもかまいませんから,もっと明確に提示しませんか。
10行程度のスクリプトなら,ソース全行を毎回そのまま提示する方がよいです。変更した1行を説明するのではなく,このスクリプトを実行したらエラーメッセージはこれ,と提示してみてください。

>3.「IUSER_なんとか」というユーザーのフォルダへのアクセス権はどうなってますか?
>匿名アクセスを許可する設定になっています。

これも,もっと具体的に表現してほしいです。

IIS のインターネットサービスマネジャで
「既定のWebサイト」のプロパティ → 「ホームディレクトリ」タブ → アクセス権
と進むと,「書き込み」にチェックが付いており,

エクスプローラで
「D:\Inetpub\wwwroot」のプロパティ → 「セキュリティ」タブ → アクセス権
と進むと,Everyone または IUSR_ComputerName に対して「追加,変更,フルコントロール」などの書き込み権限が与えられている

わけですね。

初心者 1999/11/10(水) 18:22:02
[[解決]]
すみません!hiro-kimの書き込みで謎が解けました。
私はアクセス権について誤解をしていました。
インターネットサービスマネージャのディレクトリセキュリティで匿名アクセスを許可すれば、それでOKだと思っていました。
エクスプローラで設定を行ったところ、正常に動作しました。
不勉強と曖昧な表現で皆さんにご迷惑をおかけしたことを、お詫びします。
無責任官庁さん、ふじさん、ぎんさん、hiro-kimさん、ありがとうございました。
もっと勉強しますね。

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