- PR -

cgi(Perl)からシェルの実行

1
投稿者投稿内容
さっくん
会議室デビュー日: 2004/06/02
投稿数: 16
投稿日時: 2005-03-29 19:06
いつも役立つ情報を拝見させて頂いております。
行き詰まってしまったので
どなたか、ご教授ください。

****************
環境
****************
   OS : HP-UX 11i
   Webサーバ : Apache(HP-UX付属のもの)
   Perl : v5.8.0
****************
やりたいこと
****************
   cgi(Perl)からシェルを実行したいのですがうまく行きません。

以下のコードで試したのですが
どうにもこうにもうまくいきません。

#--------
# シェル
#--------
$command = "/***/script/test.csh";
#--------
# パラメータ
#--------
$prm1 = "/***/test.txt";
$prm2 = "AAAA";
#----------------------------------------------
# 試したコード
#----------------------------------------------
# 変数格納編
$exe_command = `$command $arg_file $printer`;
$exe_command = "$command $arg_file $printer";
$status = system( $exe_command );

#----------------------------------------------
# 直接実行編
$status = system( "$command $prm1 $prm2" );
$status = system( $command,$prm1,$prm2 );
$status = system( '$command $prm1 $prm2' );
#----------------------------------------------

返り値は「1」だったり「255」だったりでした。
(ちなみに返り値は256で割っています)

少し前は実行できましたが
最近になって急に実行できなくなりました。
管理者は自分だけではないので
他の管理者が環境変数などを変えた可能性はあります。
ただ、変えた環境変数もわからないのでお手上げ状態です。

拙い文章ですが
ご回答、ご指摘等ありましたら、宜しくお願いします。
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2005-03-29 19:53
こんばんは。

実行したいシェルはどんな機能でしょうか?
例えば、ログファイルをバックアップするような機能の
場合、バックアップ先のディレクトリ容量が足りなくて
シェルがダウンしている...なんて指摘もできるのですが。
さっくん
会議室デビュー日: 2004/06/02
投稿数: 16
投稿日時: 2005-03-29 20:01
   >>実行したいシェルはどんな機能でしょうか?

すいません。記述が抜けていました。

シェルの中では、アプリケーションのコマンドを実行しています。
実行したコマンドの返り値をcgiに返しているだけです。
シェルのパーミッションですが
テスト環境のため「777」だったり「4755」だったりと
していますが、動作した形跡はありませんでした。


シェルの中には実行されたら
実行された日付を必ずログファイルに出力するようにしていますので
実行されれば、ログに書き込みがあるはずなんですが
どうやっても、ログに書き込みがないため
実行されていないとしか判断できません。
ログファイルのパーミッションは「777」です。
ログの書き出し先ですが
ディレクトリ容量に不足などはありません。

くさいと思っているのは
cgi(Perl)の【system】という関数なんですが
【exec】という関数だとcgi(Perl)に制御が戻ってこないので
これは使えないです。

以上、宜しくお願い致します。
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2005-03-29 20:49
>ディレクトリ容量に不足などはありません。
そうですか...
以下のことを調査されてはいかがでしょう?

1)シェルを単独で起動してみる
2)必ず0を返却するシェルを起動を呼んでみる

# あまり役にたたなくてすいません。
さっくん
会議室デビュー日: 2004/06/02
投稿数: 16
投稿日時: 2005-03-29 23:13
>> 1)シェルを単独で起動してみる

シェルを単独で起動(root)で実行した場合は
うまく動作します。
cgiから成功したときには、wwwユーザでシェルが実行されている模様です。
以前、動作していた時のログより。

>> 2)必ず0を返却するシェルを起動を呼んでみる

こちらは試してないので、試してみたいと思います。

>> # あまり役にたたなくてすいません。

全然そんなことないです。
ご返答ありがとうございます。

あと、コードがちょっと間違ってたというか
記述ミスがあるので訂正を・・・
ちなみに、system関数で渡すパラメータは
「”」だったり、「'」だったり、なにもなかったりと
調べた限りではバラバラでしたが、どれもうまくいくのでしょうか。。。

#----------------------------------------------
# 試したコード
#----------------------------------------------
# 変数格納編
$exe_command = `$command $prm1 $prm2`; # ←のコードでRedhat9では動作確認済み

$exe_command = "$command $prm1 $prm2";

$status = system( $exe_command );

#----------------------------------------------
# 直接実行編
$status = system( "$command $prm1 $prm2" );

$status = system( $command,$prm1,$prm2 );

$status = system( '$command $prm1 $prm2' );
#----------------------------------------------
hohojp
常連さん
会議室デビュー日: 2005/02/15
投稿数: 31
投稿日時: 2005-06-07 19:38
「”」と「'」の違いはありますよ。

コード:
$test1 = "a";
$test2 = "b";

$str1 = "$test1 $test2";
$str2 = '$test1 $test2';

print $str1 . "\n";
print $str2 . "\n";


<出力結果>
a b
$test $test2

「'」に関しては、中身を文字列としてしか扱ってくれません。

これが、直接の原因ではないと思いますが。。。
さっくん
会議室デビュー日: 2004/06/02
投稿数: 16
投稿日時: 2005-06-07 19:50
hohojp様

ご返答ありがとうございます。
「”」と「’」についてはわかりやすい説明ありがとうございました。

本件、解決したにも関わらず放置しておりました。
申し訳ありませんでした。

原因は、LANGの設定でした。

cgiからシェルを起動する際のLANGの設定が「""」(空)であったため
シェル内で
「LANGの指定がありません」
というエラーにて起動ができていませんでした。

LANGを指定することにより、本件は解決致しました。
ご助言を頂いた方、どうもありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)