如何通过ssh向Linux Shell发送命令;将输出存储为变量;但是不要将输出打印到控制台

时间:2018-06-01 15:46:58

标签: c# linux ssh

我正在研究C#和WPF中的一个项目,该项目涉及将命令发送到Linux shell,并对所述命令的输出执行检查。我的项目使用Renci.ssh创建一个ssh连接,自动发送各种命令,并将结果打印到我创建的GUI中的控制台输出窗口。

我有几种方法,它们一起向Linux shell发送命令并返回响应(见下文)。

    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控制台中打印。这使得查看控制台内容变得非常困难。

一般情况下,我试图检查某些命令的输出是否包含指定的字符串。其他一些情况涉及需要存储一个命令的输出以用于不同的命令。

我不能使用像| grep或| awk这样的linux工具来限制我的输出。这是因为该命令也存储在 send 变量中。因此,我告诉| grep或| awk要查找的任何“指定字符串”搜索参数都将包含在 send 中。所以,如果我使用:

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

无论grep是否在输出中找到它,都将始终找到“Specified String”。

有没有办法向Linux发送命令,只在控制台中打印命令,将输出存储为C#代码中的变量以供使用,但是不要将输出打印到控制台?

0 个答案:

没有答案