Не удалось загрузить файл SFTP с помощью SSH.NET в C# — разрешение отклонено

Я пытаюсь загрузить файл по протоколу SFTP, используя С#, используя библиотеку SSH.NET. Ниже приведен код, который я использую

FileInfo f=new FileInfo("C:\\mdu\\abcd.xml");            
string uploadfile=f.FullName;    
Console.WriteLine(f.Name);
Console.WriteLine("uploadfile"+uploadfile);
var client = new SftpClient(host, port, username, password);
client.Connect();
if(client.IsConnected){
       Console.WriteLine("I AM CONNECTED");
}
var fileStream = new FileStream(uploadfile, FileMode.Open);  
if(fileStream!=null){
            Console.WriteLine("YOU ARE NOT NULL");
}
client.BufferSize = 4 * 1024; 
client.UploadFile(fileStream, f.Name,null);
client.Disconnect();
client.Dispose();

Я могу подключиться, и filestream тоже не NULL. Но я получаю PermissionDeniedException при попытке загрузить файл.

Unhandled Exception: Renci.SshNet.Common.SftpPermissionDeniedException: Permission denied
   at Renci.SshNet.Sftp.SftpSession.RequestOpen(String path, Flags flags, Boolean nullOnError)
   at Renci.SshNet.SftpClient.InternalUploadFile(Stream input, String path, Flags flags, SftpUploadAsyncResult asyncResult, Action`1 uploadCallback)
   at Renci.SshNet.SftpClient.UploadFile(Stream input, String path, Boolean canOverride, Action`1 uploadCallback)
   at Renci.SshNet.SftpClient.UploadFile(Stream input, String path, Action`1 uploadCallback)
   at movemsi.Program.UploadFile()
   at movemsi.Program.Main(String[] args)

Есть ли какие-либо настройки, которые мне не хватает в приведенном выше коде. Любая помощь горячо приветствуется.


person Timothy Rajan    schedule 01.10.2015    source источник


Ответы (3)


Вам нужно указать полный путь для загрузки файла.

Например:

client.UploadFile(fileStream, "/home/user/" + f.Name, null);

Без пути SFTP-сервер, вероятно, попытается записать файл в корневую папку или другую папку, к которой у вас нет доступа для записи (отсюда Отказано в доступе).

person Martin Prikryl    schedule 01.10.2015

Ты можешь сделать это:

FileInfo f = new FileInfo("C:\\mdu\\abcd.xml");            
string uploadfile = f.FullName;    
Console.WriteLine(f.Name);
Console.WriteLine("uploadfile" + uploadfile);

//Passing the sftp host without the "sftp://"
var client = new SftpClient("ftp.example.com", port, username, password);
client.Connect();
if(client.IsConnected)
{
    var fileStream = new FileStream(uploadfile, FileMode.Open);  
    if(fileStream != null)
    {
        //If you have a folder located at sftp://ftp.example.com/share
        //then you can add this like:
        client.UploadFile(fileStream, "/share/" + f.Name,null);
        client.Disconnect();
        client.Dispose();
    }
}
person Ernest    schedule 13.04.2016

Я получал эту ошибку, потому что использовал Path.Combine() в качестве аргумента UploadFile, например:

client.UploadFile(fileStream, Path.Combine("/home/user", f.Name), null);

Я думаю, что это делает косые черты неправильными. Так что просто выполните обычную конкатенацию строк, как в ответе выше:

client.UploadFile(fileStream, "/home/user/" + f.Name, null);
person Matt Kemp    schedule 28.08.2019