Загрузка файла в SFTP с помощью SSH.NET: не удается подключиться

Я создал консольное приложение для загрузки файла на FTP-сервер. Поскольку этот FTP-сервер принимает только протокол SFTP, я использую библиотеку с открытым исходным кодом SSH.NET, поскольку в .NET нет встроенного метода (меньше для .NET 3.5, который я использую в Visual Studio 2008 Professional).

Я видел много примеров. Я реализовал быстрое тестовое приложение для подключения к общедоступному серверу SFTP и загрузки файла по протоколу SFTP.

Я использую ниже общедоступный бесплатный SFTP-сервер, полученный здесь:

server   : demo.wftpserver.com
user     : demo-user
password : demo-user
port     : 2222

А вот код:

    const string host             = "demo.wftpserver.com";
    const string username         = "demo-user";
    const string password         = "demo-user";
    const string workingdirectory = "/upload";
    const string uploadfile       = @"C:\test.txt";
    const int    port             = 2222;

    static void Main(string[] args)
    {
        try
        {                
            using (SftpClient client = new SftpClient(host, port, username, password))
            {
                {
                    client.Connect();
                    Console.WriteLine("Connected to {0}", host);

                    client.ChangeDirectory(workingdirectory);
                    Console.WriteLine("Changed directory to {0}", workingdirectory);

                    var listDirectory = client.ListDirectory(workingdirectory, null);
                    Console.WriteLine("Listing directory:");
                    foreach (var fi in listDirectory)
                    {
                        Console.WriteLine(" - " + fi.Name);
                    }

                    using (var fileStream = new FileStream(uploadfile, FileMode.Open))
                    {
                        Console.WriteLine("Uploading {0} ({1:N0} bytes)", uploadfile, fileStream.Length);
                        client.BufferSize = 4 * 1024; // bypass Payload error large files
                        client.UploadFile(fileStream, Path.GetFileName(uploadfile), null);
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.Out.WriteLine(e.Message);
        }

Проблема в следующем:

При попытке подключиться к серверу, используя предложение ниже:

client.Connect();

У меня исключение. Исключение гласит следующее:

"Value cannot be null. \r\nParameter name: All lists are either null or empty."

StackTrace  "   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)\r\n   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle)\r\n   at Renci.SshNet.Session.Connect()\r\n   at Renci.SshNet.BaseClient.Connect()\r\n   at ConsoleApplication2.Program.Main(String[] args) at C:\\Users\\Win7\\Downloads\\ConsoleApplication2\\ConsoleApplication2\\Program.cs:line 61"    string

Кроме того, я попытался изменить время ожидания, как описано здесь но безуспешно.

Однако, если я попытаюсь подключиться к тому же серверу SFTP, используя те же учетные данные от клиента FileZilla, я смогу подключиться без проблем и даже загрузить файл.

Поэтому я не понимаю, что происходит. Кто-нибудь может мне помочь?

ОБНОВЛЕНИЕ: я нашел это исправление. Патч был применен в ветке разработки 22 января 2017 г., но последний двоичный файл для загрузки - 14 декабря 2016 г. Итак, как я могу получить двоичные файлы, содержащие это исправление?


person Ralph    schedule 11.04.2017    source источник


Ответы (2)


Я решил.

Я скачал исходный код из ветки разработчика, в которой исправлена ​​эта ошибка. Затем я открываю проект .NET Framework 3.5 в Visual Studio 2015 и создаю его. Итак, я получил двоичные файлы, DLL для выпуска и отладки. Затем я возвращаюсь к своему проекту Visual Studio 2008 и добавляю эту ссылку. И я проверил, что с тем же кодом теперь я могу подключиться к FTP-серверу с такими же учетными данными.

Последний двоичный файл, представленный в сети SSH.NET, не содержит исправления этой ошибки.

person Ralph    schedule 12.04.2017

Я использовал Tamir.SharpSSH для отправки файла по нашему SFTP. Попробуйте использовать этот, приведенный ниже код - это самый простой способ отправить файл на ваш sftp.

Sftp sftpBase = new Tamir.SharpSsh.Sftp(_sftpHost, _sftpUid, Up_decryptPass);
sftpBase.Connect(int.Parse(_sftpPort));
sftpBase.Put(Dir + filename, sftpDir);
person Francis Magsuci    schedule 12.04.2017
comment
SharpSSH - мертвый проект. Не используйте это. Его веб-сайт даже не работает, атм. - person Martin Prikryl; 12.04.2017
comment
Он не мертв. В настоящее время мы используем его в наших проектах. - person Francis Magsuci; 12.04.2017
comment
Последняя версия выпущена в 2011 году, а веб-страница не обновлялась с 2007 года. Это то, что я называю мертвым для библиотеки, связанной с безопасностью. Он не может даже поддерживать какие-либо современные шифры. - person Martin Prikryl; 12.04.2017
comment
Предложение использовать устаревшую и небезопасную библиотеку вместо хорошо поддерживаемой и современной библиотеки заслуживает -1 = ›Вы должны удалить свой ответ, чтобы убрать -1. - person Martin Prikryl; 12.04.2017