web-dev-qa-db-fra.com

Impossible de télécharger un fichier SFTP à l'aide de SSH.NET en C # - Autorisation refusée

J'essaie de télécharger un fichier en utilisant le protocole SFTP en utilisant C # en utilisant la bibliothèque SSH.NET. Voici le code que j'utilise

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();

Je peux me connecter et le filestream n'est pas non plus NULL. Mais j'obtiens PermissionDeniedException en essayant de télécharger un fichier.

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)

Y a-t-il des paramètres qui me manquent dans le code ci-dessus. Toute aide est très appréciée.

22
Timothy Rajan

Vous devez spécifier un chemin d'accès complet vers lequel télécharger le fichier.

Par exemple:

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

Sans le chemin, le serveur SFTP essaie probablement d'écrire le fichier dans un dossier racine ou un autre dossier auquel vous n'avez pas accès en écriture (d'où le Autorisation refusée).

33
Martin Prikryl

Tu peux le faire:

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();
    }
}
9
Ernest

J'obtenais cette erreur parce que j'utilisais Path.Combine() pour mon argument UploadFile, comme ceci:

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

Je pense que cela rend les barres obliques dans le mauvais sens. Il suffit donc de faire une concaténation de chaîne normale comme la réponse ci-dessus:

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