web-dev-qa-db-fra.com

Java SFTP Transfer Library

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

J'ai essayé Zehon, mais c'est incroyable, et je pense que les fichiers 8 pots sont un peu fous pour si peu de fonctionnalités que j'exige.

Et la bibliothèque doit être gratuite (comme pour la bière gratuite) et de préférence Open Source (pas obligatoire).

Merci.

23
Claus Jørgensen

Edit: Je vais garder ma réponse précédente, car JSch est toujours utilisé dans de nombreux endroits, mais si vous avez besoin d'une bibliothèque mieux documentée, vous peut utiliser sshj . Un exemple sur 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 (a Java ssh lib, utilisé par Ant par exemple), vous pourriez 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();
    }
}

Vous pouvez utiliser JSch directement de cette façon, ou via Commons VFS , mais vous devrez alors avoir à la fois le pot commun vfs et le pot jsch.

42
Valentin Rocher

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();
        }
    }
}
8
Iraklis

La sortie () et la déconnexion () doivent être placées dans un bloc finalement. Dans cet exemple, nous avons un programme sans fin en cas d'exception car un deuxième thread ne se terminera pas.

4
tg1