【问题标题】:Getting SSH output into StreamReader from long running SSH commands从长时间运行的 SSH 命令获取 SSH 输出到 StreamReader
【发布时间】:2018-11-28 07:39:54
【问题描述】:

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

如果我发出一个简单的命令来执行,例如ls,下面的代码 sn-p 可以正常工作,它会立即输出到输出流中。

但是,如果我运行一个不会立即产生任何输出的命令,我不会得到任何返回,并且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# .net ssh


    【解决方案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);
            }
    

    【讨论】:

    • 谢谢,我现在得到了预期的结果。
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    相关资源
    最近更新 更多