SSH.NET如何即时解压缩

时间:2017-05-02 11:09:17

标签: c# ssh ssh.net

我有2Gb image.gz的图像。现在我正在执行以下步骤以在目标计算机上获取解压缩的image.gz

  1. 使用image.gz上传Renci.SshNet.ScpClient
  2. 通过运行远程Renci.SshNet.SshCommand来解压缩文件。
  3. 这两个步骤大约需要4分钟才能完成,我想加快这个过程。

    如果我可以使用简单的命令行,我只需编写以下命令:
    cat image.gz | ssh 10.70.0.1 "gunzip -C - > /var/tmp/decompressed_image"

    此命令在2分钟内完成,这是以前的两倍。

    我试图用Renci.SSH实现这个单线程:

      sshClient.Connect();
    
      var shellStream = sshClient.CreateShellStream(
          terminalName: "dumb",
          columns: 80,
          rows: 24,
          width: 800,
          height: 600,
          bufferSize: 1024);
    
      while (!shellStream.CanWrite)
      {
          Thread.Sleep(TimeSpan.FromSeconds(1));
      }
    
      shellStream.WriteLine("cat - | gunzip -c > /var/tmp/image.raw");
      shellStream.Flush();
    
      long totalBytes = 0;
      const int bufferSize = 1024;
      using (var fileStream = File.OpenRead(@"D:\images\image.gz"))
      using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, bufferSize))
      {
          var buffer = new byte[1024];
          int bytesRead;
          while ((bytesRead = streamReader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
          {
              totalBytes += bytesRead;
    
              if (totalBytes % Megabyte == 0)
              {
                  Console.WriteLine(totalBytes / Megabyte);
              }
    
              while (!shellStream.CanWrite)
              {
                  Thread.Sleep(TimeSpan.FromSeconds(1));
              }
    
              shellStream.Write(buffer, 0, bytesRead);
          }
       }
    

    正如您所猜测的那样,此代码无法正常工作。这是我对如何实现这一点的唯一想法。

    如果你有更好的想法(工作思路:)),请与我分享。

0 个答案:

没有答案