Вывод SSH в реальном времени с помощью Net_SSH (phpseclib)

Я использую Net_SSH (phpseclib) для выполнения команд SSH на внешнем сервере. Я просто не могу понять, как получить вывод команды в режиме реального времени. Я знаю, как заставить его работать в фоновом режиме, чтобы он не зависел от процесса Apache, но неясно, как мне будет показывать внешний вывод в режиме реального времени вместо того, чтобы ждать завершения команды.

Мой текущий код так же прост, как $ssh->exec('command'),

Используемая версия PHP:

[admin@ ~]$ php -v
PHP 7.1.9 (cli) (built: Sep 10 2017 11:31:06) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

0

Решение

Мне удалось заставить его работать с libssh2 и буферизацией вывода, см. Пример ниже:

$session = ssh2_connect("server.local", 22, array('hostkey'=> 'ssh-rsa' )) or die("Couldn't connect to the SSH Server.");

ssh2_auth_pubkey_file($session, "root", "/path/to/public/key.pub", "/path/to/private/key") or die("couldn't authenticate to server"); // Authenticating to the server with a ssh-key for security purposes

while (ob_end_flush()); // end all output buffers if any

$proc = ssh2_exec($session, "ping -c 40 google.nl");

echo '<pre class="scroll">';
echo "[root@server ~]# ping -c 5 google.nl\n"; // Command you will execute
while (!feof($proc))
{
echo fread($proc, 4096); // Read the output from the command
@ flush(); // Flushes the whole php buffer so we can output new data
}
echo "\nDone";
echo '</pre>';

Не забывайте, что вам нужен PHP 5.6 или ниже для ssh2, вы можете заменить команду в переменной $ proc на $ssh->exec('command') как вы используете это.

0

Другие решения

Я смог заставить его работать с помощью этого:

$ssh->exec('ping 127.0.0.1', function($output) {
echo $output;
});

Чтобы устранить различия в конфигурации вашей системы по сравнению с моей, я буду использовать Vagrant для создания общей конфигурации. Для этого вот мой Vagrantfile:

Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"end

Мой полный код phpseclib (с использованием 1.0.7):

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

$ssh = new Net_SSH2('127.0.0.1', 2222);
$ssh->login('vagrant', 'vagrant');

$ssh->exec('ping 127.0.0.1', function($output) {
echo $output;
});

Видео с YouTube на выходе:

https://youtu.be/j9-q3024eEk

Если это не работает, существует несколько возможностей.

  1. Может быть, «команда», которую вы запускаете, просто не выводит вывод в реальном времени. Или, может быть, это требует PTY или что-то. Трудно комментировать, так как вы еще не сказали, что это за команда, которую вы пытаетесь выполнить. Как показывает мой пост являются приказывает, что мое решение делает работать с.

  2. Может быть, это работает с Vagrant, но не с вашей системой. Может быть, ваша система была настроена каким-то странным образом или что-то в этом роде. В этом сценарии, я думаю, что поможет, если вы предоставите журналы SSH. Вы можете получить их, сделав define('NET_SSH2_LOGGING', 2); а потом echo $ssh->getLog();, Опубликуйте результаты на pastebin.com, а затем опубликуйте ссылку.

edit: если вы запускаете это на веб-сервере против CLI, у вас могут возникнуть проблемы с настройкой веб-сервера — проблемы, которые выходят за рамки phpseclib. Например, выводится ли он в режиме реального времени или блокируется ?:

while (true) {
echo "test\n";
sleep(1);
}

flush() / ob_flush() может помочь, но в конечном итоге это будет зависеть от используемого вами веб-сервера (Apache, nginx и т. д.), используемого вами SAPI (CGI, модуль Apache и т. д.) и т. д.

Я бы посчитал это «прикольной конфигурацией».

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector