SFTP SSH.NET DLL вместо SharpSSH

Я искал бесплатную DLL для .net для обработки SFTP-соединений.

Я обнаружил этот проект SharpSSH, но в нем отсутствует документация.

Я потратил много времени, чтобы понять, как работает dll. Я создал тестовый проект и начал тестировать разные функции. Некоторые функции работают, например, удаление файлов.

У меня проблема с функцией putfile() и getfile().

Вот пример:

Dim ssh As SFTPUtil
ssh = New SFTPUtil("MY SERVER", "MY USER", "MY PW")
ssh.GetFile("/home/sftptest/test111.xml", "C:\\text.xml")

Обратите внимание, что параметры getfile():

Public Sub GetFile(remotePath As String, localPath As String)

Я вхожу в функции, но не нашел правильного способа передачи этих параметров.

Я действительно не знаю, следует ли мне использовать косую черту (/) или обратную косую черту (). Я знаю, что Linux использует (/)

Я заметил, например, что "C:\" был преобразован в "C:\\".

Просто упомянем, что SFTP находится на Linux-машине.

Спасибо.


person billybob    schedule 02.08.2012    source источник
comment
помните, что у вас также есть SSHnet sshnet.codeplex.com, что является значительным улучшением по сравнению с SharpSSH на основе Java.   -  person Thomas Andreè Wang    schedule 02.08.2012
comment
Я пробую это, не могу установить связь. Я вызываю sftp = New SftpClient(server, sftptest, sftptest), который является SftpClient. А затем я делаю sftp.Connect(). И это не удается. Я получил чистую версию dll 4.0. Я получаю сообщение об ошибке: Не найден подходящий метод аутентификации для завершения аутентификации.   -  person billybob    schedule 02.08.2012
comment
у вас есть хост для подключения? просто чтобы убедиться, что используйте шпатлевку и подключитесь, чтобы проверить, существует ли соединение. SftpClient sftp = New SftpClient (строка IP, строка имени пользователя, строка пароля); sftp.Connect();   -  person Thomas Andreè Wang    schedule 02.08.2012
comment
Я пробовал с замазкой, она работает... Любые другие подсказки :)   -  person billybob    schedule 02.08.2012
comment
Я узнал, что мне нужно активировать интерактивную аутентификацию с помощью клавиатуры. Я плохо нахожу, чтобы понять это.   -  person billybob    schedule 02.08.2012
comment
Теперь вы выбрали другой проект, но исходный код SharpSSH доступен по предоставленной вами ссылке и ChannelSftp.cs показывает, что использование косой черты (/) для удаленных путей и Path.DirectorySeparatorChar (\) для локальных путей жестко запрограммировано. К сожалению, на первый взгляд кажется, что он не продолжает использовать Path API при манипулировании локальными путями (по крайней мере).   -  person Mark Hurd    schedule 03.08.2012
comment
Да ты прав. Вчера я провел отладку в ChannelSftp.cs и обнаружил что иногда происходит сбой в функции GetPathAttributes(). Обработка ошибок очень плохая IMAO в проекте SharpSSH. Я переключился на SSH.net, и он работает как шарм. Я могу загружать, скачивать, удалять и т. д., это мощная библиотека.   -  person billybob    schedule 03.08.2012


Ответы (3)


Вот что я должен был сделать (код vb.net), чтобы установить соединение с ЭТОЙ библиотекой (SSHnet) , я не использовал SharpSHH:

Private Sub ButtonAction_Click(sender As Object, e As System.EventArgs) Handles ButtonAction.Click

    Dim PasswordConnection = New PasswordAuthenticationMethod("test", "test")
    Dim KeyboardInteractive = New KeyboardInteractiveAuthenticationMethod("test")
    Dim ConnectionInfo = New ConnectionInfo("192.168.1.1", 22, "test", PasswordConnection, KeyboardInteractive)

    AddHandler KeyboardInteractive.AuthenticationPrompt, _
    Sub(_sender As Object, _e As Renci.SshNet.Common.AuthenticationPromptEventArgs)
        For Each prompt In _e.Prompts
            Debug.Print(prompt.Request)
            If Not prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) = -1 Then
                prompt.Response = "test"
            End If
        Next
    End Sub

    sftp = New SftpClient(ConnectionInfo)
    sftp.Connect()

    sftp.disconnect()
End Sub
person billybob    schedule 03.08.2012
comment
Я использовал бесплатный SSH.NET, но в итоге использовал component pro sftp, потому что SSH.NET не хватало некоторые дополнительные функции, и нам нужна была быстрая поддержка. - person Peter; 24.12.2014

Эта библиотека полна ошибок. Я скачал версию от 11/2012, и у меня большие проблемы даже с такой простой функцией, как Disconnect. Приложение зависнет, и вам придется перезапустить его.

person opis    schedule 26.11.2012
comment
А "Эта библиотека..." есть? Который из? - person mynkow; 18.11.2014
comment
SharpSSH полон ошибок. Используйте SSH.NET - person billybob; 24.12.2014

У меня есть некоторые проблемы с пониманием того, что именно вы хотите, поэтому вот пример кода из пакета SSH.NET. (НЕ SharpSSH)

string IP = "192.168.1.1", User = "Testuser", Pass = "123";
SftpClient sftp;

private void UploadFileSFTP()
    {
        sftp = new SftpClient(IP, User, Pass);
        sftp.Connect();
        Uploader();
        Downloader();
        sftp.Disconnect();
    }

string FilePath="C:\\folder\\", Filename = "Filename.extention", 
       DeliveryPath = "/tmp/";

private void Uploader()
    {
        using (var file = File.OpenRead(FilePath + Filename))
        {
            sftp.UploadFile(file, DeliveryPath + Filename);
        }
    }

//there is possibly a simpler way to download but this is how i did it.
string FromPath = "/tmp/testfile.txt", StoragePath = ""; 
private void Downloader()
    {
        if (File.Exists(StoragePath))
            File.Delete(StoragePath);
        if (!Directory.GetDirectories(Path.GetTempPath()).Contains("WorkFiles"))
        {
            Directory.CreateDirectory(Path.GetTempPath() + "WorkFiles");
        }

        StoragePath = Path.GetTempPath() + "WorkFiles\\testFile.txt";

        Int64 iSize = sftp.ReadAllBytes(FromPath).Length;
        Int64 iRunningByteTotal = 0;
        using (Stream streamRemote = sftp.OpenRead(FromPath))
        {
            using (Stream streamLocal = new FileStream(StoragePath, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                int iByteSize = 0;
                byte[] byteBuffer = new byte[iSize];
                while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                {
                    streamLocal.Write(byteBuffer, 0, iByteSize);
                    iRunningByteTotal += iByteSize;
                }
            }
        }
    }
person Thomas Andreè Wang    schedule 02.08.2012
comment
Я нашел решение: здесь, я должен установить интерактивную аутентификацию с клавиатурой. У меня есть код С#, и я не могу перевести его на vb.net, лол. - person billybob; 02.08.2012
comment
Я не могу опубликовать свой ответ, потому что я новичок и у меня недостаточно репутации, другими словами, я нуб: p. - person billybob; 02.08.2012
comment
Интересно, почему в этом примере не используется sftp.DownloadFile()? - person billybob; 02.08.2012
comment
я не сделал этого просто потому, что это кусок кода, который у меня был. - person Thomas Andreè Wang; 06.08.2012