1

phpseclib (apt-get を使用) を使用してアプリケーションをインストールしようとしていますが、受け取ることができるさまざまな出力結果を処理したいと考えています...しかし、それを機能させる方法がわかりません。私は現在、次のものを持っています:

$first = $ssh->read('root@DMZ-Server:~#');
$ssh->write("sudo apt-get install emacs\n");
echo "<br />";
echo "sudo apt-get install emacs";
echo str_repeat(' ',1024*64);
if ($unexpected_output = $ssh->read('root@DMZ-Server:~#')){
  echo "<pre>$unexpected_output</pre>";
  echo str_repeat(' ',1024*64);
}   elseif ($continue = $ssh->read('Do you want to continue [Y/n]?')){
    echo "<pre>$continue</pre>";
    echo str_repeat(' ',1024*64);
    $ssh->write("Y\n");
    $continue_end = $ssh->read('root@DMZ-Server:~#');
    echo "<pre>$continue_end</pre>";
    echo str_repeat(' ',1024*64);
} 

この if ループは最初の「if」でのみ機能します...つまり、予期しない出力がある場合 (「続行しますか」と尋ねられずにシェルに戻る、つまり、既にインストールされているなど)、このスクリプトはうまく動作します。

ただし、アプリケーションがインストールされていない場合は、elseif ループに移動することはありません。その理由は、最初の ssh->read が php タイムアウトまで継続し、その結果を待っているためだと確信しています...両方のオプションを同時に見て、正しいものを選択するようにするにはどうすればよいですか。

これにCASEを使おうと考えているのですが、書き方がわかりません...

phpseclib を使用してこれを行うより良い方法もあるかもしれませんが、その方法がわかりません。

ありがとう!

4

2 に答える 2

1

代わりに、apt-get の呼び出し方法を変更して、apt-get install -y emacsyes または no のプロンプトが表示されないようにしてみませんか? -q を使用して、進行状況を表示しないようにすることもできます。

apt-get(8)を参照

あなたのソリューションの問題は、 $ssh->read が指定されたパターンが見つかるまで待機することです。

于 2012-06-17T20:09:51.943 に答える
0

$ssh->setTimeout(10) などを実行し、接続がタイムアウトしたときに $ssh->getLog() を実行して、実際に何が送信されているかを確認することもできます。

于 2012-06-17T20:43:53.287 に答える