6

SharpSSH を使用してリモート SFTP サーバーからファイルを取得しようとしていますが、それをストリームとして読みたいと思っています。

私が見つけた:

  • Sftpローカル ファイルに保存するメソッドを持つクラスGet-- 閉じる

  • class SshStream、私が望むことをするかもしれませんが、バラバラに見えるSftpので、SFTP部分を自分で実装する必要があるかもしれません(??)

  • classChannelSftpのような SFTP メソッドを実装しますget(String, OutputStream)。これは完璧に見えますが、それは低レベルのクラスであり、それをインスタンス化する方法さえ私にはまったく明らかではありません

SftpChannelSftp SftpChannelプロパティが私用でなければ、私はそれを使用でき、すべてが完璧になるようです。ただし、可能であれば、SharpSSH のハッキングは避けたいと思います。

何か不足していますか?

4

1 に答える 1

8

私は何かを解決し、それをテストしました。試してみて、お気軽に API をマッサージしてください。

まず、宛先ファイル名の代わりに sChannelSftpを呼び出すメソッドを利用できるようにするメソッドを明らかにする必要があります。OutputStreamリフレクションを使用したくない場合は、このメソッドを Sftp クラスに追加し、SharpSSH を再コンパイルします。

public void GetWithStream(string fromFilePath, Tamir.SharpSsh.java.io.OutputStream stream)
{
    cancelled = false;
    SftpChannel.get(fromFilePath, stream, m_monitor);
}

次に、以下のようなStreamと互換性のあるクラスのラッパーを作成します。Tamir.SharpSsh.java.io.OutputStream

using System.IO;
using Tamir.SharpSsh.java.io;

public class GenericSftpOutputStream : OutputStream
{
    Stream stream;
    public GenericSftpOutputStream(Stream stream)
    {
        this.stream = stream;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        stream.Write(buffer, offset, count);
    }

    public override void Flush()
    {
        stream.Flush();
    }

    public override void Close()
    {
        stream.Close();
    }

    public override bool CanSeek
    {
        get { return stream.CanSeek; }
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return stream.Seek(offset, origin);
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        if (this.stream != null)
        {
            this.stream.Dispose();
            this.stream = null;
        }
    }
}

これらの要素を使用して、OpenSSH を使用して、選択したストリームにデータをストリーミングできるようになりましたFileStream

System.IO の使用; Tamir.SharpSsh を使用。

class Program
{
    static void Main(string[] args)
    {
        var host = "hostname";
        var user = "username";
        var pass = "password";
        var file = "/some/remote/path.txt";
        var saveas = @"C:\some\local\path";

        var client = new Sftp(host, user, pass);
        client.Connect();

        using (var target = new GenericSftpOutputStream(File.Open(saveas, FileMode.OpenOrCreate)))
        {
            client.GetWithStream(file, target);
        }

        client.Close();
    }
}
于 2010-07-31T03:49:22.793 に答える