Пустой файл при загрузке с использованием SSH.NET

Я использую SSH.NET для загрузки файла с SFTP, и вот мой код:

string host = ConfigurationManager.AppSettings["SFTPDomain"];
string username = ConfigurationManager.AppSettings["SFTPUser"];
string password = ConfigurationManager.AppSettings["SFTPPass"];
string remoteFileName = ConfigurationManager.AppSettings["SFTPFileName"].ToString();

using (var sftp = new SftpClient(host, username, password))
{
    sftp.Connect();

    using (var file = File.OpenWrite(FilePath))
    {
        sftp.DownloadFile(remoteFileName, file);
    }

    sftp.Disconnect();
}

Проблема в том, что файл csv загружается, но в нем нет данных. Я также изменил путь к удаленному файлу, но файл все равно загружается с нулевыми данными внутри. Я попытался проверить, существует ли файл, используя

if (sftp.Exists(remoteFileName))
{
}

Он всегда возвращает true, даже если я меняю remoteFileName на "pp".

Может ли кто-нибудь помочь мне, что я делаю неправильно? Или порекомендуйте мне другую другую библиотеку для загрузки файла с SFTP-сервера. Я пробовал WinSCP, но получаю ошибку ключа хоста, поэтому я попытался передать правильный SshHostKeyFingerprint в соответствии с учебником. Тем не менее я получаю ошибку hostkey. Есть ли какая-нибудь простая библиотека, которую мне просто нужно загрузить с SFTP?


person Coder    schedule 07.10.2014    source источник
comment
уже пробую sshnet   -  person Coder    schedule 07.10.2014
comment
проверьте sshnet.codeplex.com/discussions/358307   -  person Mate    schedule 07.10.2014
comment
Что касается проблемы с ключом хоста WinSCP: учебник, на который вы ссылаетесь, касается закрытого ключа вашей учетной записи, а не ключа сервера (хоста). См. статью WinSCP на тему Где взять отпечаток ключа хоста SSH для использования со сценариями или сборками .NET?. Обратите внимание, что поведение SShNet по умолчанию для принятия любого ключа хоста не является безопасным. С SshNet вы должны обработать событие HostKeyReceived и проверить ключ хоста. Проверка ключа осуществляется WinSCP для обеспечения безопасности.   -  person Martin Prikryl    schedule 07.10.2014
comment
Вы пытались отладить загрузку (поскольку SshNet имеет открытый исходный код)? У вас есть журналы на стороне сервера? К какому серверу (программному обеспечению) вы подключаетесь?   -  person Martin Prikryl    schedule 07.10.2014


Ответы (2)


Я видел ту же проблему. Использование SSH.NET ScpClient вместо SftpClient сработало для меня. Это замена:

using (ScpClient client = new ScpClient(host, username, password))
{
    client.Connect();

    using (Stream localFile = File.Create(localFilePath))
    {
         client.Download(remoteFilePath, localFile);
    }
}

С ScpClient вы получаете только функции загрузки/выгрузки вместо многих дополнительных функций SFTP, но этого может быть достаточно для вашего варианта использования.

person ahelwer    schedule 13.06.2018

Попробуйте использовать:

using (Stream file = File.OpenWrite(FilePath))
{
    sftp.DownloadFile(remoteFileName, file);
}

Вам необходимо прочитать поток с удаленного сервера перед сохранением локально.

person Peter Holloway    schedule 01.12.2017
comment
Престижность для решения, а не обхода. - person Will; 19.02.2019