Übertragen einer Datei über SFTP in Java

1. Übersicht

In diesem Tutorial wird erläutert, wie Sie mit SFTP in Java Dateien von einem Remote-Server hochladen und herunterladen .

Wir werden drei verschiedene Bibliotheken verwenden: JSch, SSHJ und Apache Commons VFS.

2. Verwenden von JSch

Lassen Sie uns zunächst sehen, wie Sie mithilfe der JSch-Bibliothek Dateien von einem Remote-Server hochladen und herunterladen.

2.1. Maven-Konfiguration

Wir müssen die jsch- Abhängigkeit zu unserer pom.xml hinzufügen :

 com.jcraft jsch 0.1.55 

Die neueste Version von jsch finden Sie auf Maven Central.

2.2. JSch einrichten

Jetzt richten wir JSch ein.

Mit JSch können wir entweder die Kennwortauthentifizierung oder die Authentifizierung mit öffentlichem Schlüssel verwenden, um auf einen Remote-Server zuzugreifen. In diesem Beispiel verwenden wir die Kennwortauthentifizierung :

private ChannelSftp setupJsch() throws JSchException { JSch jsch = new JSch(); jsch.setKnownHosts("/Users/john/.ssh/known_hosts"); Session jschSession = jsch.getSession(username, remoteHost); jschSession.setPassword(password); jschSession.connect(); return (ChannelSftp) jschSession.openChannel("sftp"); }

Im obigen Beispiel repräsentiert der remoteHost den Namen oder die IP-Adresse des Remote-Servers (z. B. example.com ). Wir können die im Test verwendeten Variablen wie folgt definieren:

private String remoteHost = "HOST_NAME_HERE"; private String username = "USERNAME_HERE"; private String password = "PASSWORD_HERE";

Außerdem können wir die Datei unknown_hosts mit dem folgenden Befehl generieren :

ssh-keyscan -H -t rsa REMOTE_HOSTNAME >> known_hosts

2.3. Hochladen einer Datei mit JSch

Nun, eine Datei auf dem Remote - Server zu laden, werden wir die Methode verwenden ChannelSftp.put () :

@Test public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException { ChannelSftp channelSftp = setupJsch(); channelSftp.connect(); String localFile = "src/main/resources/sample.txt"; String remoteDir = "remote_sftp_test/"; channelSftp.put(localFile, remoteDir + "jschFile.txt"); channelSftp.exit(); }

In diesem Beispiel stellt der erste Parameter der Methode die zu übertragende lokale Datei dar, z. B. src / main / resources / sample.txt, während remoteDir der Pfad des Zielverzeichnisses auf dem Remote-Server ist.

2.4. Herunterladen einer Datei mit JSch

Wir können eine Datei auch mit ChannelSftp.get () vom Remote-Server herunterladen :

@Test public void whenDownloadFileUsingJsch_thenSuccess() throws JSchException, SftpException { ChannelSftp channelSftp = setupJsch(); channelSftp.connect(); String remoteFile = "welcome.txt"; String localDir = "src/main/resources/"; channelSftp.get(remoteFile, localDir + "jschFile.txt"); channelSftp.exit(); }

Die remoteFile ist der Pfad der herunterzuladenden Datei, und localDir repräsentiert den Pfad des lokalen Zielverzeichnisses:

3. Verwenden von SSHJ

Als Nächstes verwenden wir die SSHJ-Bibliothek, um Dateien von einem Remote-Server hoch- und herunterzuladen.

3.1. Maven-Konfiguration

Zuerst fügen wir die Abhängigkeit zu unserer pom.xml hinzu :

 com.hierynomus sshj 0.27.0 

Die neueste Version von sshj finden Sie auf Maven Central.

3.2. SSHJ einrichten

Als nächstes richten wir den SSHClient ein .

Mit SSHJ können wir auch die Kennwort- oder Public-Key-Authentifizierung verwenden, um auf den Remote-Server zuzugreifen.

In unserem Beispiel verwenden wir die Kennwortauthentifizierung:

private SSHClient setupSshj() throws IOException { SSHClient client = new SSHClient(); client.addHostKeyVerifier(new PromiscuousVerifier()); client.connect(remoteHost); client.authPassword(username, password); return client; }

3.3. Hochladen einer Datei mit SSHJ

Ähnlich wie bei JSch verwenden wir die Methode SFTPClient.put () , um eine Datei auf den Remote-Server hochzuladen :

@Test public void whenUploadFileUsingSshj_thenSuccess() throws IOException { SSHClient sshClient = setupSshj(); SFTPClient sftpClient = sshClient.newSFTPClient(); sftpClient.put(localFile, remoteDir + "sshjFile.txt"); sftpClient.close(); sshClient.disconnect(); }

Wir müssen hier zwei neue Variablen definieren:

private String localFile = "src/main/resources/input.txt"; private String remoteDir = "remote_sftp_test/";

3.4. Herunterladen einer Datei mit SSHJ

Gleiches gilt für das Herunterladen einer Datei vom Remote-Server - wir verwenden SFTPClient.get () :

@Test public void whenDownloadFileUsingSshj_thenSuccess() throws IOException { SSHClient sshClient = setupSshj(); SFTPClient sftpClient = sshClient.newSFTPClient(); sftpClient.get(remoteFile, localDir + "sshjFile.txt"); sftpClient.close(); sshClient.disconnect(); }

Und fügen wir die beiden oben verwendeten Variablen hinzu:

private String remoteFile = "welcome.txt"; private String localDir = "src/main/resources/";

4. Verwenden von Apache Commons VFS

Finally, we'll use Apache Commons VFS to transfer files to a remote server.

Actually, Apache Commons VFS uses JSch library internally.

4.1. Maven Configuration

We need to add the commons-vfs2 dependency to our pom.xml:

 org.apache.commons commons-vfs2 2.4 

The latest version of commons-vfs2 can be found on Maven Central.

4.2. Uploading a File With Apache Commons VFS

Apache Commons VFS is a little different.

We'll use a FileSystemManager to create FileObjects from our target files, then use the FileObjects to transfer our files.

In this example, we'll upload a file by using method FileObject.copyFrom():

@Test public void whenUploadFileUsingVfs_thenSuccess() throws IOException { FileSystemManager manager = VFS.getManager(); FileObject local = manager.resolveFile( System.getProperty("user.dir") + "/" + localFile); FileObject remote = manager.resolveFile( "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt"); remote.copyFrom(local, Selectors.SELECT_SELF); local.close(); remote.close(); }

Beachten Sie, dass der lokale Dateipfad absolut sein sollte und der entfernte Dateipfad mit sftp: // username: [email protected] beginnen sollte.

4.3. Herunterladen einer Datei mit Apache Commons VFS

Das Herunterladen einer Datei von einem Remote-Server ist sehr ähnlich. Wir verwenden auch FileObject.copyFrom (), um localFile von remoteFile zu kopieren :

@Test public void whenDownloadFileUsingVfs_thenSuccess() throws IOException { FileSystemManager manager = VFS.getManager(); FileObject local = manager.resolveFile( System.getProperty("user.dir") + "/" + localDir + "vfsFile.txt"); FileObject remote = manager.resolveFile( "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteFile); local.copyFrom(remote, Selectors.SELECT_SELF); local.close(); remote.close(); }

5. Schlussfolgerung

In diesem Artikel haben wir gelernt, wie Sie Dateien von einem Remote-SFTP-Server in Java hochladen und herunterladen. Dafür haben wir mehrere Bibliotheken verwendet: JSch, SSHJ und Apache Commons VFS.

Den vollständigen Quellcode finden Sie auf GitHub.