首页 > 解决方案 > 从长时间运行的 SSH 命令获取 SSH 输出到 StreamReader

问题描述

我正在尝试从一个长时间运行的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();
    }
}

标签: c#.netssh

解决方案


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

推荐阅读