プロが教える店舗&オフィスのセキュリティ対策術

RH7.3の環境で試しているのですが、どうもうまく動作しません。

CGIから呼び出す方法として3つ試したのですが、
open(IN,"|sudo -u USER PROGRAM");
$text = `sudo -u USER PROGRAM`;
system("sudo -u USER PROGRAM");
最後のsytemは一応期待通りの動作になりました。
ただ、これですと実行結果(標準出力)を取り込めないのですが、何か方法はありませんか?
PROGRAMはbashのシェルスクリプトです。

最初の2つですと、sudoの関係かエラーが出ます。
./PROGRAM: SQL*Plus:: command not found
systemの場合はちゃんと動作します。

■実際にやりたいこと
oracleサーバへの問い合わせ結果を取得したいのですが、
10gのクライアントまでは入りましたが、perlのDBD::Oracleがうまく入らなかったため、sqlplusで処理しようと考えています。
最初は直接CGIから呼び出そうとしたのですが、sudo時に環境変数が設定されないので、bashのシェルスクリプトにexportで先頭に書いております。
外部公開サーバではありませんので、とりあえずセキュリティーは無視しています。

systemで実行結果をcgiの標準入力に渡すか、バッククォートでエラーが出なくするかどちらかの方法はありませんでしょうか?

A 回答 (1件)

open(IN,"|sudo -u USER PROGRAM");


は、前にパイプがあるので標準入力を受け付けています。

標準出力を取得するには、
open(IN,"sudo -u USER PROGRAM|");
後ろにパイプをつけてください。
そして、 print while(<IN>);
    • good
    • 0
この回答へのお礼

間違っていた点が2カ所ありました。1つはご指摘の通り標準入力と出力の
指定の仕方を間違えていました。
もう1つは肝心のshellスクリプトに誤記があったようです。
bashでコマンドを実行する時に全体を`バッククォートでくくっていたの
ですが、これがopenなどで実行しようとしたときに引っかかっていたよう
です。
ただ、systemで実行した時には問題がなかったので、このあたりが原因を
追求するのにややこしくなっていました。
無事に解決できましたので、お礼とさせていただきます。
ありがとうございました。

お礼日時:2007/06/05 05:24

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