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

いろいろ理由がありましてsshトンネリング機能を使いたいのですが、phpからコマンドを発行すると応答しなくなってしまいます。phpについてはあまり詳しくないのですが、phpからコマンドを呼び出す場合はなにか制約があるのでしょうか?

以下の個所で応答が無くなってしまいます。
apache上でphpを動作させています。もちろんapache起動ユーザで以下のコマンドを実行すると正常に終了し、転送機能は働きます。
ちなみにパスワードが聞かれないようにしています。
apacheを再起動するとプロセスにトンネリングのプロセスが現れます。
system("/usr/bin/ssh -2 -f -N -l apache -L 60000:192.168.1.XXX:5432 192.168.1.YYY
");

どなたかご教授下さい!

A 回答 (1件)

なるほどssh経由でpostgresに接続しようと・・・・。



 ところで、sshの起動に成功したとして、終了はどうするの?
 あ、いや、成功はしてるんだと思うんスよ。これ(sshの起動とトンネル)。で、応答せんくなるのはsystem()が「sshの終了を待っている」からだ。詳しくは参考URLを参照の事。

 ひょっとしたらpopen()でsshの制御ができるかも知れない。PHPのバージョンが4.3.0以上であれば、proc_open()も参照すると良いだろう。

 ただ、このphpの出力が終わった後にsshやpg_connect()がどうなってるのか気になるよね。レスポンスもだいぶ悪くなりそうやし。もし私がこの手法を取るなら、デーモンとしてあらかじめsshトンネルを作っとくなぁ・・・・。

結論:トンネルは別口で張っておきましょう。

参考URL:http://jp.php.net/manual/ja/function.system.php

この回答への補足

ご回答ありがとうございます。

参考URLから:
バックグラウンドで実行 したままにしたい場合には、プログラムの出力をファイルまたは他の出 力ストリームにリダイレクトする必要があることにも注意して下さい。

出力を" > /dev/null 2>&1"にしたら動くようになりました。。。
終了については
$ret = system("echo \$!");
とかでプロセスIDをもらって。。killしようかと思ったのですが、取れませんでした。。
今は ps ax | grep usr/bin/ssh | grep 【ポート番号】| grep -v grep | awk '{ print $1 }' | xargs kill -9
で終了させています。うーん。無理やりだ。。

>結論:トンネルは別口で張っておきましょう。
トンネルは必要なときだけ張りたいんですよねぇ

補足日時:2005/05/25 22:22
    • good
    • 0

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