Trasferimento di un file tramite SFTP in Java

1. Panoramica

In questo tutorial, discuteremo come caricare e scaricare file da un server remoto utilizzando SFTP in Java .

Useremo tre diverse librerie: JSch, SSHJ e Apache Commons VFS.

2. Utilizzo di JSch

Per prima cosa, vediamo come caricare e scaricare file da un server remoto utilizzando la libreria JSch.

2.1. Configurazione Maven

Dovremo aggiungere la dipendenza jsch al nostro pom.xml :

 com.jcraft jsch 0.1.55 

L'ultima versione di jsch può essere trovata su Maven Central.

2.2. Configurazione di JSch

Ora configureremo JSch.

JSch ci consente di utilizzare l'autenticazione con password o l'autenticazione con chiave pubblica per accedere a un server remoto. In questo esempio, useremo l'autenticazione tramite password :

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

Nell'esempio sopra, remoteHost rappresenta il nome o l'indirizzo IP del server remoto (cioè example.com ). Possiamo definire le variabili utilizzate nel test come:

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

Inoltre, possiamo generare il file known_hosts utilizzando il seguente comando:

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

2.3. Caricamento di un file con JSch

Ora, per caricare un file sul server remoto, useremo il metodo 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 questo esempio, il primo parametro del metodo rappresenta il file locale da trasferire, ad esempio, src / main / resources / sample.txt, mentre remoteDir è il percorso della directory di destinazione sul server remoto.

2.4. Download di un file con JSch

Possiamo anche scaricare un file dal server remoto usando ChannelSftp.get () :

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

Il fileremoto è il percorso del file da scaricare, e localdir rappresenta il percorso della directory locale di destinazione:

3. Utilizzo di SSHJ

Successivamente, utilizzeremo la libreria SSHJ per caricare e scaricare file da un server remoto.

3.1. Configurazione Maven

Innanzitutto, aggiungeremo la dipendenza al nostro pom.xml :

 com.hierynomus sshj 0.27.0 

L'ultima versione di sshj può essere trovata su Maven Central.

3.2. Configurazione di SSHJ

Successivamente, configureremo SSHClient .

SSHJ ci consente inoltre di utilizzare l'autenticazione tramite password o chiave pubblica per accedere al server remoto.

Useremo l'autenticazione con password nel nostro esempio:

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

3.3. Caricamento di un file con SSHJ

Simile a JSch, useremo il metodo SFTPClient.put () per caricare un file sul server remoto :

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

Abbiamo qui due nuove variabili da definire:

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

3.4. Download di un file con SSHJ

Lo stesso vale per il download di un file dal server remoto: useremo 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(); }

E aggiungiamo le due variabili usate sopra:

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

4. Utilizzo di 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(); }

Tieni presente che il percorso del file locale dovrebbe essere assoluto e il percorso del file remoto dovrebbe iniziare con sftp: // username: [email protected]

4.3. Download di un file con Apache Commons VFS

Scaricare un file da un server remoto è molto simile: useremo anche FileObject.copyFrom () per copiare localFile da remoteFile :

@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. conclusione

In questo articolo, abbiamo imparato come caricare e scaricare file da un server SFTP remoto in Java. Per questo, abbiamo utilizzato più librerie: JSch, SSHJ e Apache Commons VFS.

Il codice sorgente completo può essere trovato su GitHub.