2010-02-27 6 views
11

Je suis à la recherche d'une bibliothèque Java simple à utiliser pour les transferts de fichiers SFTP. Je n'ai pas besoin d'autres fonctionnalités au-delà de ça.Bibliothèque de transfert Java SFTP

J'ai essayé Zehon, mais c'est incroyable, et je pense que 8 fichiers jar est un peu fou pour si peu de fonctionnalités que j'ai besoin.

Et la bibliothèque doit être libre (comme dans la bière gratuite), et préférable Open Source (pas une exigence).

Merci.

+0

ftp sur un tunnel SSH? –

+2

http://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol –

+1

Veuillez utiliser le terme «SFTP» si c'est ce que vous voulez dire. Entre les protocoles FTP, SFTP/SSH, FTPS et le routage FTP sur SSH, les acronymes deviennent ambigus. – prestomation

Répondre

27

Edit: Je vais garder ma réponse précédente, comme JSch est encore utilisé dans de nombreux endroits, mais si vous avez besoin d'une bibliothèque mieux documenté, vous pouvez utiliser sshj. Un exemple dans la façon de l'utiliser pour faire sftp est:

SSHClient ssh = new SSHClient(); 
ssh.loadKnownHosts(); 
ssh.connect("host"); 
try { 
    ssh.authPassword("username", "password"); 
    SFTPClient sftp = ssh.newSFTPClient(); 
    try { 
     sftp.put(new FileSystemFile("/path/of/local/file"), "/path/of/ftp/file"); 
    } finally { 
     sftp.close(); 
    } 
} finally { 
    ssh.disconnect(); 
} 

En utilisant JSch (une lib ssh java, utilisé par Ant par exemple), vous pouvez faire quelque chose comme ça:

Session session = null; 
Channel channel = null; 
try { 
    JSch ssh = new JSch(); 
    ssh.setKnownHosts("/path/of/known_hosts/file"); 
    session = ssh.getSession("username", "host", 22); 
    session.setPassword("password"); 
    session.connect(); 
    channel = session.openChannel("sftp"); 
    channel.connect(); 
    ChannelSftp sftp = (ChannelSftp) channel; 
    sftp.put("/path/of/local/file", "/path/of/ftp/file"); 
} catch (JSchException e) { 
    e.printStackTrace(); 
} catch (SftpException e) { 
    e.printStackTrace(); 
} finally { 
    if (channel != null) { 
     channel.disconnect(); 
    } 
    if (session != null) { 
     session.disconnect(); 
    } 
} 

Voici another link en utilisant JSch pour faire SFTP.

Vous pouvez utiliser JSch directement de cette façon, ou par le biais de Commons VFS, mais vous devrez alors avoir les deux communs vfs jar et jsch jar.

+0

J'ai trouvé une façon plus simple de le faire, je vais éditer ma réponse. –

+1

JSch est une excellente bibliothèque mais manque cruellement de documentation. J'ai trouvé http://timarcher.com/node/57 était un exemple très utile. – UmYeah

+0

Merci pour le lien, je vais l'ajouter à la réponse. En effet, JSch manque vraiment de documentation (et la lisibilité du code source, c'est comme s'ils l'avaient sorti dans la nature), mais ça fait parfaitement l'affaire. –

-2

Comment sur FTPSClient de Apache Commons?

+13

Ce que vous suggérez est FTPS, pas SFTP. –

6

Voici le code source complet d'un exemple utilisant JSch sans avoir à vous soucier de la vérification de la clé ssh.

import com.jcraft.jsch.*; 

public class TestJSch { 
    public static void main(String args[]) { 
     JSch jsch = new JSch(); 
     Session session = null; 
     try { 
      session = jsch.getSession("username", "127.0.0.1", 22); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setPassword("password"); 
      session.connect(); 

      Channel channel = session.openChannel("sftp"); 
      channel.connect(); 
      ChannelSftp sftpChannel = (ChannelSftp) channel; 
      sftpChannel.get("remotefile.txt", "localfile.txt"); 
      sftpChannel.exit(); 
      session.disconnect(); 
     } catch (JSchException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } catch (SftpException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+3

Cette réponse ne vous inquiétez pas à propos de la sécurité, pas sur la vérification des clés. En utilisant 'StrictHostKeyChecking = no' vous perdez toute sécurité. Ne recommandez à personne de l'utiliser, sans en expliquer les conséquences. –

3

La sortie() et la déconnexion() doivent être placées dans un bloc finally. Dans cet exemple, nous avons un programme sans fin en cas d'exception, car un second thread ne s'arrêtera pas.

+0

Ce n'est pas vraiment une réponse, mais un commentaire utile sur la réponse de @Iraklis ci-dessus. – hotshot309