27 Stimmen

Java SFTP-Übertragungsbibliothek

Ich bin auf der Suche nach einer einfachen Java-Bibliothek, die ich für SFTP-Dateiübertragungen verwenden kann. Darüber hinaus benötige ich keine weiteren Funktionen.

Ich habe das von Zehon ausprobiert, aber es ist unglaublich nervig, und ich denke, 8 Jar-Dateien sind ein bisschen verrückt für so wenig Funktionalität, wie ich sie benötige.

Und die Bibliothek muss kostenlos sein (wie Freibier), und vorzugsweise Open Source (keine Voraussetzung).

Gracias.

2 Stimmen

3 Stimmen

Bitte verwenden Sie den Begriff "SFTP", wenn Sie das meinen. Zwischen FTP, SFTP/SSH, FTPS und dem Tunneln von regulärem FTP über SSH werden die Akronyme zweideutig.

0 Stimmen

Den Text für sftp bearbeitet

46voto

Valentin Rocher Punkte 11493

Bearbeiten: Ich werde meine vorherige Antwort beibehalten, da JSch immer noch an vielen Stellen verwendet wird, aber wenn Sie eine besser dokumentierte Bibliothek benötigen, können Sie sshj . Ein Beispiel dafür, wie man es für sftp verwendet, ist :

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

Verwendung von JSch (eine Java-SH-Lib, die z.B. von Ant verwendet wird), könnte man so etwas machen:

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

Sie können JSch direkt auf diese Weise verwenden oder über Commons VFS , aber dann müssen Sie sowohl das commons vfs jar als auch das jsch jar haben.

0 Stimmen

Ich habe eine einfachere Methode gefunden, ich werde meine Antwort ändern.

1 Stimmen

JSch ist eine großartige Bibliothek, aber es mangelt ihr stark an Dokumentation. Ich fand timarcher.com/node/57 war ein wirklich hilfreiches Beispiel.

0 Stimmen

Danke für den Link, ich werde ihn in die Antwort aufnehmen. In der Tat, JSch wirklich fehlt Dokumentation (und Quellcode Lesbarkeit, es ist wie sie es in freier Wildbahn veröffentlicht), aber es tut die Arbeit perfekt.

10voto

Iraklis Punkte 2714

Hier ist der vollständige Quellcode eines Beispiels mit JSch ohne sich um die Überprüfung der ssh-Schlüssel kümmern zu müssen.

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

6 Stimmen

Diese Antwort kümmert sich nicht um die Sicherheit, nicht um die Schlüsselüberprüfung. Durch die Verwendung StrictHostKeyChecking=no verlieren Sie jegliche Sicherheit. Empfehlen Sie niemandem, es zu benutzen, ohne die Konsequenzen zu erklären.

4voto

tg1 Punkte 49

Exit() und disconnect() müssen in einen finally-Block eingefügt werden. In diesem Beispiel haben wir ein Programm, das im Falle einer Ausnahme niemals endet, da ein zweiter Thread nicht beendet wird.

1 Stimmen

Dies ist nicht wirklich eine Antwort, sondern ein nützlicher Kommentar zur obigen Antwort von @Iraklis.

-5voto

Konrad Garus Punkte 51589

Wie wäre es mit FTPSClient von Apache Commons?

18 Stimmen

Was Sie vorschlagen, ist FTPS, nicht SFTP.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X