Как отправить команду в оболочку Linux через ssh;Сохраните вывод как переменную;Но НЕ печатайте вывод на консоль - PullRequest
0 голосов
/ 01 июня 2018

Я работаю над проектом на C # и WPF, который предусматривает отправку команд в оболочку Linux и проверку выходных данных указанных команд.Мой проект создает ssh-соединение с использованием Renci.ssh, автоматически отправляет различные команды и выводит результаты в окно вывода консоли в созданном мной графическом интерфейсе.

У меня есть несколько методов, которые вместе отправляют команды в Linuxshell и возвращает ответ (см. ниже).

    private ShellStream _ss;
    private SshClient   _sc;
    private bool _isConnected;

    public string SendReceive(string cmd, Regex expect, int numSec)
    {
        var r = "";
        try
        {
            Send(cmd);
            r = WaitFor(expect, numSec);
        }
        catch (Exception ex)
        {
            log.Error("Caught exception after sending cmd=" + cmd, ex);
            return "";
            // throw (ex);
        }
        return r;
    }

    public void Send(string cmd)
    {
        if (!_isConnected) throw new NotConnectedException(string.IsNullOrWhiteSpace(Name) ? "Can't send, connection not connected" : $"{Name} is not connected, can't send");
        try
        {
            Flush(33); // flush anything in read buffer.
            _ss.Write(cmd);
            // Task.Run(() => Task.Delay(33)).Wait(); // give ccap time to catch up.
            _ss.Write("\r");
        }
        catch (Exception ex)
        {
            log.Error("Not able to send text= " + cmd, ex);
            // throw (ex);
        }
    }

    public string WaitFor(Regex expect, int numSec)
    {
        if (!_isConnected) throw new NotConnectedException(string.IsNullOrWhiteSpace(Name) ? "Can't receive, connection not connected" : $"{Name} is not connected.");
        var r = "";
        try
        {
            r = Filter(_ss.Expect(expect, numSec));
        }
        catch (Exception ex)
        {
            log.Error("Caught exception waiting for response. ", ex);
            return "";
        }
        return r;
    }

Когда эти методы реализованы, команды отправляются в следующем формате:

var send = Conn.SendReceive("command text", expected_regex, 10);

При этом сохраняются как отправленная команда, так ивесь вывод в отправляет , а также печатает оба (команда и вывод) на консоль.Проблема в том, что вывод некоторых команд слишком длинный для печати в моей консоли GUI.Это очень затрудняет просмотр содержимого консоли.

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

Я не могу использовать инструменты linux, такие как | grep или | awk, чтобы ограничить мой вывод.Это связано с тем, что команда также хранится в переменной send .Таким образом, любые параметры поиска «указанной строки», которые я сообщаю | grep или | awk для поиска, будут включены в send .Поэтому, если я использую:

if (send.Contains("Specified String"))

«Заданная строка» всегда будет найдена, независимо от того, нашла ли | grep ее в выводе.

Есть ли способ, так что отправьте командув Linux выведите в консоли только команду, сохраните вывод как переменную в коде C # для использования, НО НЕ выводите вывод в консоль?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...