こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CGIファイル内の CGI呼出しのパスについて

CGI 内からの .cgi ファイルの呼出しのパスについて質問があります。

動作環境は linux - apache - perl です

perl の cgi ファイル内で次のように、同じ /cgi-bin ディレクトリ内の
reset.cgi をコールしています。

==========
#!/usr/bin/perl

(省略)

if($form[0] =~ /reset/){
`reset.cgi`;
}

==========

バッククォートで実行していますが、これでは動作せず、
./reset.cgi と ピリオド,スラッシュを前に付けると動作します。

少し調べた結果、カレントディレクトリのパスが通っていないのかと考え、
/etc/profile の PATHに下記のように ピリオド を追加してリブートしたところ、

export PATH=$PATH:.

ホームディレクトリなどで作成した
シェルスクリプトは ./ なしで動くようになりましたが、
/cgi-bin ディレクトリ内の前述のような呼出しは動作しませんでした。

後は httpd.conf などの編集が必要なのかもしれませんが、
良く分かりませんでした。
申し訳ありませんが、教えて頂けると助かります。
よろしく御願い致します。

投稿日時 - 2020-01-16 11:09:39

QNo.9702177

困ってます

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

『実行しているCGIから呼び出そうとしているプログラムは、CGIではありません。』

CGIとは、Common Gateway Interface、Webからプログラムを呼び出す仕組みのことであり、呼び出されて動いているのはperl上で動いているスクリプトなわけです。

そして今あなたは、perlスクリプト上から、他のperlスクリプトを呼び出そうとしている。
それを考えると、``の中に書くべきは、通常のコマンドラインからperlスクリプトを呼び出す方法、すなわち、`./reset.pl`または`perl reset.pl`のように、linuxコマンドラインでのプログラム呼び出し法に従った書き方をしなければならない、という訳です。

>【初心者向け】シェルスクリプトの作り方と実行方法
https://eng-entrance.com/linux-shellscript-do

こちらの sh と shスクリプト の関係と同じく、pathの通っていないカレントディレクトリにある、実行可能スクリプトを実行するには、「./」が必要です。
これはもう、linuxがそういうルールですので、従う方が楽でしょう。

もしPATHに追加するとすれば、「.」ではいけません。
export PATH=$PATH:/var/www/cgi-bin/
のように、ルートから始まるパスを書かなければいけないでしょうし、cgi-binフォルダの下にさらにフォルダを作って、その中のファイルも実行したいなら、
export PATH=$PATH:/var/www/cgi-bin/:/var/www/cgi-bin/test/
のようにいくらでも増やさなければなりません。
一般的には、やらないでしょう。

投稿日時 - 2020-01-16 13:25:26

お礼

御回答ありがとうございました。
シェルスクリプトではないので、`perl reset.cgi` が正しいのですね。
実際に動きました。
httpd.conf の cgi-bin ディレクトリの追加では解決しませんでした。
perl の設定ファイルがあればできるかもしれませんが、調べた範囲ではありませんでした。

プロバイダの cgi-bin ディレクトリからローカルに移植中なのですが、
プロバイダのファイルの方も `./reset.cgi`と書いていました。
編集中に ./ を消してしまったようです。どうもすみません。

御忙しいところ、ありがとうございました。

投稿日時 - 2020-01-17 10:37:20

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問