从长时间运行的SSH命令将SSH输出输出到StreamReader

时间:2018-11-27 22:38:50

标签: c# .net ssh

我正在尝试从运行时间较长的SSH命令捕获输出,该命令一次调用可能会花费几秒钟的时间来最初生成任何文本输出,并且可能需要一分钟才能完全完成。
< / p>

如果我发出一个简单的命令来执行,例如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 :(得分:1)

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);
        }