Ожидание завершения команды с использованием SSH2_Shell в PHP - PullRequest
1 голос
/ 20 апреля 2011

У меня есть сеанс SSH2_Shell, работающий на PHP. моя проблема в том, что мне нужна команда, чтобы полностью закончить, прежде чем перейти к следующей команде. Вот мой код:

    $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, так как когда я это делаю, кажется, что мой браузер зависает.

В общем, мне нужен способ определить, когда команда завершилась, и перейти к следующей команде.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 25 апреля 2011

Спасибо за идеи, но, думаю, я их решил. Я сделал эхо нескольких специальных символов, когда команда закончила, а затем я искал символы с помощью strpos (). Еще одна вещь, которая, я думаю, могла бы помочь, - это настройка параметра max_execution_time в файле php.ini. Я нашел этот ответ здесь:

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);
0 голосов
/ 23 апреля 2011

Вы можете использовать phpseclib, чистую реализацию PHP SSH .например.

<?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]');
?>
0 голосов
/ 21 апреля 2011

У меня есть класс SSH2, который реализует Secure Shell2 поверх github. Проверьте https://github.com/bubba-h57/PHP-SSH2 и посмотрите, поможет ли это.

Я продолжаю искать лучший способ обработки поискаХотя подсказки, так что любой совет или вклад в это будет приветствоваться.Надеюсь, это поможет, если не что иное, как дать вам некоторые идеи.

...