#!/usr/local/bin/perl

$perl = `perl -wc web.cgi`;
$perl=~s/[\r\n]/<BR>/g;

print <<"END";
Content-type: text/html

<HTML>
<HEAD><TITLE>PERLCHECK</TITLE></HEAD>
<BODY>
perl<BR>$perl

</BOBY>
</HTML>
END

exit;

と以上のように書いてますが。telnet上ではOKと出ますがブラウザでみるとエラーが出ます。
やりたいことは、Telnetを使っての構文チャックではなく、ブラウザ上で構文のチェックは出来ないか模索しています。上記の`UNIXコマンド`の部分で、freeやdf等のコマンドを実行させると実行結果が得られるので、その延長で出来ないかと考えてます。初心者なのですいませんが教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 えとですね(笑)



 これは、原因は「$perl = `perl -wc web.cgi`;」の部分です。
 この web.cgi の部分は telnet 上では「HP管理者」が実行しますが、Web上では「HP閲覧者」が実行することになります。
 つまり、「HP閲覧者が、HTTPサーバーを経由せずにCGIを使う」という、(セキュリティ的に)通常はやってはいけないことをやってしまうことになるんです。

 ブラウザからの閲覧は、基本的にすべてゲストログイン扱いになるので、ブラウザ経由でそういうことするのは難しいかと思います。
 かくいう俺も、昔HTTP経由でHPの更新とかできるCGIを作ったことがありましたが、制約が多すぎてやめてしまいました(^_^;
    • good
    • 0

deagleさんが触れられているように、


実効ユーザの違いじゃないですか?

$perl = `df`;

なら正しい結果が得られるんですよね。

それじゃ、$perlの中に書いたものが悪いと
思われますよね。

1.perlのパスが通ってない
  `perl ...`を`/usr/local/bin/perl ...`に
  してみる

2.web.cgiってどこにあるの?
  この書き方だと、telnetでログインした
  ときのホームディレクトリにあるんですか?
  web.cgiをフルパスで指定したらどうですか?

3.パーミッションの問題
  web.cgiをこのCGIの実効ユーザが読めない。
  どういったユーザ名でCGIが実行されてるか、
  設定内容を知りませんが、guestならguestが
  見にいけないような場所にweb.cgiを置いてませんか?
  あるいは、web.cgi自体のパーミッションがきついとか。

HTTPサーバのエラーログを見たらどうなってるんですか?
何か原因が書いてありません?
    • good
    • 0

Content-type: text/html



Content-type: text/html;
とか?

 どんなエラーが出るのか、詳しくエラーを書けば、
もう少し分かるかも?

この回答への補足

telnet上では、syntax OKと出ます。
ブラウザ上では
http://testsite.helpkeeper.net/users/tajima/inde …
と出ます。
ブラウザで、構文チェックとcgiのプログラムでは不可能なことですか?

補足日時:2001/08/28 15:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Qperlスクリプト

<html>~</html>の中に複数のperlスクリプトは書けるのでしょうか?
htmlファイル1つの中には、<html>~</html>は1つだと思うのですが、
phpだと<?php>~<?>とすれば、<html>~</html>の中に複数書けるみたいですが、perlでも書けるのでしょうか?

Aベストアンサー

通常書けません(書くのは別にかまいませんが期待通りにはならないでしょう)。
逆にPerlスクリプト中にHTMLをヒアドキュメントという形で記述することは一般的です。
PerlはWebが生まれる前からありましたが、PHPはWebの為に生まれました。

QPerlにおけるのようなPerlのバージョンなどのチェック機能はございますか?

 Perlにおける<?phpinfo();?>のようなPerlのバージョンなどのチェック機能はございますか?
利用しているサーバのPerlの正確なバージョン(5.8.1など。5.8までではなく)やインストールされているモジュールなどが知りたいので。

Aベストアンサー

1行目のパスにコマンドを追加してもエラーが返るだけなので、

print "Content-type: text/plain\n\n";
print `perl -v`;
print `perl -V`;
print `find \`perl -e 'print "@INC"'\` -name '*.pm' -print`;

のように、コマンドをバッククォートで括ってprintさせれば出力されます。

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。


おすすめ情報