1

PHP で動作する SSH2_Shell セッションがあります。私の問題は、次のコマンドに進む前にコマンドを完全に終了する必要があることです。これまでの私のコードは次のとおりです。

    $command_capture = "cd /mnt/NADS/scripts/";
    $command_capture2 = "./tcpdump.sh $capture_name $sleep";


    if (!($connection = ssh2_connect("172.20.1.18", 22))) {
        echo "fail: unable to establish connection";
    } 
    if (!ssh2_auth_password($connection, "root", "Hideandseek")) {
        echo "fail: unable to authenticate";
    }
    $stream = ssh2_shell($connection);

    fwrite($stream, $command_capture. PHP_EOL);
    sleep(1);
    fwrite($stream, $command_capture2 . PHP_EOL);
    sleep(5);
    $data="";
    while($buf = stream_get_contents($stream)){
        $data.=$buf;
    }
    echo $data;
    fclose($stream);

tcpdump.sh スクリプトは lftp コマンドを実行していますが、完了するのに十分な時間がありません。指定された時間よりも長くかかる可能性があるため、スリープを使用できません。数秒しかかからない場合は、ユーザーを待たせたくありません。stream_set_blocking を実装するのはうまくいきませんでした。そうすると、ブラウザがフリーズするようです。

全体として、コマンドが終了したことを検出して次のコマンドに移る方法が必要です。

前もって感謝します!

4

3 に答える 3

1

アイデアに感謝しますが、解決したと思います。コマンドが終了したときにいくつかの特殊文字のエコーを行い、strpos() を使用して文字を検索しました。私が助けたと思うもう 1 つのことは、php.ini ファイルの max_execution_time 設定を調整することでした。ここでその答えを見つけました:

http://verysimple.com/2006/03/30/fatal-error-maximum-execution-time-of-30-seconds-exceeded/

そして、これが私の新しいコードです

    $data="";
    while (true){
        $data .= stream_get_contents($stream);
        if (strpos($data,"XOXO") !== false) {
            echo "okay: command finished\n";
            break;
        }
    }
    echo $data;
    fclose($stream);
于 2011-04-25T18:07:42.977 に答える
0

純粋な PHP SSH 実装である phpseclib を使用できます。例えば。

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2();
$ssh->login('username', 'password');

echo $ssh->exec('command');
echo $ssh->exec('command2');
?>

シェルのサポートが本当に必要な場合は、次のことを実行できます (最新の SVN を使用):

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2();
$ssh->login('username', 'password');

$ssh->read('[prompt]');
$ssh->write("command\n");
echo $ssh->read('[prompt]');
$ssh->write("command\n");
echo $ssh->read('[prompt]');
?>
于 2011-04-23T15:43:39.500 に答える
0

github で Secure Shell2 を実装する SSH2 クラスがあります

プロンプトの検索を処理するためのより良い方法を探し続けているので、それに対するアドバイスや貢献は大歓迎です。うまくいけば、いくつかのアイデアを提供する以上のことではありません。

于 2011-04-21T17:01:14.720 に答える