Требуется ли чтение () перед записью () с помощью SSH через PHPSecLib?

Я написал небольшой скрипт, который выдает серию команд через write() на Linux-машину с 5-секундным интервалом sleep() между каждой командой. Точно такие же команды работают при вводе вручную, но, несмотря на успешное подключение, похоже, не работают при использовании из PHP-скрипта.

В этом случае мне любопытно, является ли использование read() абсолютно необходимым до выдачи команды write()?

<?php

include('Net/SSH2.php');

    $serverhostname = "IP_HERE";
    $ssh_username = "root";
    $ssh_password = "PASS_HERE";

    // Establish new SSH2 Connection
    $connection = new Net_SSH2($serverhostname, 22);

    if($connection->login($ssh_username, $ssh_password))
    {
        echo "LOGGED IN! </br>";

        sleep(5);

        $result = $connection->write('en PASS_HERE\r\n');
        echo "RESULT: " . $result . " </br>";

        sleep(5);

        $result = $connection->write('configure terminal\r\n');
        echo "RESULT: " . $result . " </br>";

        sleep(5);

        $result = $connection->write('interface ve 110\r\n');
        echo "RESULT: " . $result . " </br>";

        sleep(5);

        $result = $connection->write('port-name Test_Brett\r\n');
        echo "RESULT: " . $result . " </br>";
    }
    else
    {
        echo "SSH Connection Failed. Check that the remote host is online and accepting connections!";
    }

?>

ОБНОВИТЬ

$result = $connection->write('en PASS_HERE\n');
$result = $connection->write('configure terminal\n');
$result = $connection->write('interface ve 110\n');
$result = $connection->write('port-name Test_Brett\n');
$connection->setTimeout(5);
echo $connection->read();

person Community    schedule 07.07.2014    source источник
comment
Правильно ли отправлять сюда \r\n? Когда вы делаете это в интерактивном режиме, вы, вероятно, нажимаете клавишу ввода, которая, как я ожидаю, отправит только \r.   -  person Kenster    schedule 07.07.2014
comment
По моему опыту, вам нужно отправить \n, а не \r.   -  person neubert    schedule 07.07.2014
comment
Я пробовал это с \n, \r и \r\n. В документации сказано, что это будет один из трех вариантов в зависимости от ОС, но я случайно установил здесь \r\n. В большинстве случаев я использовал только \n для тестирования.   -  person    schedule 08.07.2014


Ответы (1)


Я только что сделал это:

$connection->write("ls -la\n");
$connection->write("pwd\n");
$connection->setTimeout(5);
echo $connection->read();

И, похоже, он отлично выполнял команды без read() между двумя write(). Но может случиться так, что read() придется сделать, хотя бы один раз, в конце.

Что бы я сделал на вашем месте, вместо того, чтобы делать sleep(5), делайте $connection->setTimeout(5); $connection->read();. Вы можете выбросить возвращаемое значение read(). Если бы вы знали, чего ожидать в ответ, вы могли бы просто сделать $connection->read('pattern'), что было бы быстрее, но если вы этого не сделаете, я бы выбрал маршрут $connection->setTimeout(5);, чтобы быть в безопасности.

person neubert    schedule 07.07.2014
comment
Я попробовал это (добавил код, который я использовал в исходном сообщении), выполняя все записи, затем устанавливая тайм-аут и читая. Я также пытался просто использовать echo $connection-›read(); перед каждым писать также. Оба способа приводят к уведомлению: соединение преждевременно закрыто в /public_html/brocade/Net/SSH2.php в строке 2303 после первой строки write(), поэтому я очень смущен. - person ; 08.07.2014
comment
Я думаю, было бы полезно просмотреть журналы ваших успешных и неудачных подключений. Вы можете получить журналы, выполнив define('NET_SSH2_LOGGING', 3); в верхней части файла. - person neubert; 08.07.2014