Получение вывода SSH в StreamReader из длительных команд SSH - PullRequest
0 голосов
/ 28 ноября 2018

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

Приведенный ниже фрагмент кода работает нормально, если я запускаю простую команду для выполнения, такую ​​как ls, которая производит немедленный вывод в выходной поток.

Однако я ничего не возвращаю и SSH отключаетсяесли я запускаю команду, которая не производит мгновенный вывод.

using (var sshClient = new SshClient(target, 22, userName, password))
{
    sshClient.Connect();
    var cmd = sshClient.CreateCommand(command);
    var result = cmd.BeginExecute();

    using (var reader = new StreamReader(cmd.OutputStream))
    {
        while (!reader.EndOfStream || !result.IsCompleted)
        {
            string line = reader.ReadLine();
            if (line != null)
            {
                Console.WriteLine(line);
            }
        }
        sshClient.Disconnect();
    }
}

1 Ответ

0 голосов
/ 28 ноября 2018

BeginExecute начинает выполнение асинхронной команды.Вам нужно подождать и продолжить чтение выходного потока, пока он не завершится.

Проще говоря,

        using (var sshClient = new SshClient(host, 22, username, password)) {
            sshClient.Connect();
            var cmd = sshClient.CreateCommand("for i in `seq 1 10`; do sleep 1; echo $i; done");
            var asyncResult = cmd.BeginExecute();
            var outputReader = new StreamReader(cmd.OutputStream);
            string output;
            while (!asyncResult.IsCompleted) {
                output = outputReader.ReadToEnd();
                Console.Out.Write(output);
            }
            output = outputReader.ReadToEnd();
            Console.Out.Write(output);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...