Prijenos datoteke putem SFTP-a u Javi

1. Pregled

U ovom vodiču, razgovarat ćemo o načinu prijenosa i preuzimanja datoteka s udaljenog poslužitelja pomoću SFTP-a u Javi.

Koristit ćemo tri različite knjižnice: JSch, SSHJ i Apache Commons VFS.

2. Korištenje JSch-a

Prvo, pogledajmo kako prenijeti i preuzeti datoteke s udaljenog poslužitelja pomoću JSch biblioteke.

2.1. Maven konfiguracija

Morat ćemo dodati jsch ovisnost o našoj pom.xml:

 com.jcraft jsch 0.1.55 

Najnovija verzija jsch možete pronaći na Maven Central.

2.2. Postavljanje JSch

Sad ćemo postaviti JSch.

JSch nam omogućuje upotrebu autentifikacije lozinkom ili autentifikacije javnog ključa za pristup udaljenom poslužitelju. U ovom primjeru, koristit ćemo provjeru autentičnosti lozinke:

private ChannelSftp setupJsch () baca JSchException {JSch jsch = novi JSch (); jsch.setKnownHosts ("/ Users / john / .ssh / known_hosts"); Sjednica jschSession = jsch.getSession (korisničko ime, remoteHost); jschSession.setPassword (lozinka); jschSession.connect (); return (ChannelSftp) jschSession.openChannel ("sftp"); }

U gornjem primjeru, remoteHost predstavlja ime ili IP adresu udaljenog poslužitelja (tj. primjer.com). Varijable korištene u testu možemo definirati kao:

privatni niz remoteHost = "HOST_NAME_HERE"; privatni niz korisničko ime = "USERNAME_HERE"; privatna lozinka niza = "PASSWORD_HERE";

Također, možemo generirati poznati_hostovi datoteku pomoću sljedeće naredbe:

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

2.3. Učitavanje datoteke pomoću JSch

Sada, za prijenos datoteke na udaljeni poslužitelj koristit ćemo metodu ChannelSftp.put ():

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

U ovom primjeru, prvi parametar metode predstavlja lokalnu datoteku za prijenos, na primjer, src / main / resources / sample.txt, dok remoteDir je staza ciljnog direktorija na udaljenom poslužitelju.

2.4. Preuzimanje datoteke pomoću JSch

Možemo i mi preuzmite datoteku s udaljenog poslužitelja pomoću ChannelSftp.get ():

@Test public void whenDownloadFileUsingJsch_thenSuccess () baca JSchException, SftpException {ChannelSftp channelSftp = setupJsch (); channelSftp.connect (); Niz remoteFile = "dobrodošli.txt"; Niz localDir = "src / main / resources /"; channelSftp.get (remoteFile, localDir + "jschFile.txt"); channelSftp.exit (); }

The remoteFile je put do datoteke koju treba preuzeti i localDir predstavlja stazu ciljnog lokalnog direktorija:

3. Korištenje SSHJ-a

Dalje ćemo koristiti SSHJ knjižnicu za prijenos i preuzimanje datoteka s udaljenog poslužitelja.

3.1. Maven konfiguracija

Prvo ćemo dodati ovisnost na našu pom.xml:

 com.hierynomus sshj 0.27.0 

Najnovija verzija sshj možete pronaći na Maven Central.

3.2. Postavljanje SSHJ-a

Sljedeći, mi ćemo postaviti SSHClient.

SSHJ nam također omogućuje upotrebu autentifikacije lozinkom ili javnim ključem za pristup udaljenom poslužitelju.

U našem ćemo primjeru koristiti autentifikaciju lozinke:

privatni SSHClient setupSshj () baca IOException {SSHClient klijent = novi SSHClient (); client.addHostKeyVerifier (novi PromiscuousVerifier ()); client.connect (remoteHost); client.authPassword (korisničko ime, lozinka); povratni klijent; }

3.3. Učitavanje datoteke pomoću SSHJ

Slično JSch, koristit ćemo SFTPClient.put () metoda za prijenos datoteke na udaljeni poslužitelj:

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

Ovdje imamo dvije nove varijable koje ćemo definirati:

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

3.4. Preuzimanje datoteke pomoću SSHJ-a

Isto vrijedi i za preuzimanje datoteke s udaljenog poslužitelja - mi ćemo koristiti SFTPClient.get ():

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

I dodajmo dvije gore korištene varijable:

privatni niz remoteFile = "welcome.txt"; privatni niz localDir = "src / main / resources /";

4. Korištenje Apache Commons VFS

Konačno, koristit ćemo Apache Commons VFS za prijenos datoteka na udaljeni poslužitelj.

Zapravo, Apache Commons VFS interno koristi JSch knjižnicu.

4.1. Maven konfiguracija

Moramo dodati commons-vfs2 ovisnost o našoj pom.xml:

 org.apache.commons commons-vfs2 2.4 

Najnovija verzija commons-vfs2 možete pronaći na Maven Central.

4.2. Učitavanje datoteke pomoću Apache Commons VFS

Apache Commons VFS malo je drugačiji.

Koristit ćemo a FileSystemManager stvoriti FileObjects iz naših ciljnih datoteka, a zatim upotrijebite FileObjects za prijenos naših datoteka.

U ovom ćemo primjeru datoteku prenijeti metodom FileObject.copyFrom ():

@Test public void whenUploadFileUsingVfs_thenSuccess () baca IOException {FileSystemManager manager = VFS.getManager (); FileObject local = manager.resolveFile (System.getProperty ("user.dir") + "/" + localFile); FileObject remote = manager.resolveFile ("sftp: //" + korisničko ime + ":" + lozinka + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt"); remote.copyFrom (lokalno, Selektori.SELECT_SELF); local.close (); remote.close (); }

Imajte na umu da lokalna staza datoteke treba biti apsolutna, a udaljena staza datoteke treba započeti s sftp: // korisničko ime: [zaštićen e-poštom]

4.3. Preuzimanje datoteke pomoću Apache Commons VFS

Preuzimanje datoteke s udaljenog poslužitelja vrlo je slično - mi ćemo također koristiti FileObject.copyFrom () kopirati localFile iz remoteFile:

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

5. Zaključak

U ovom smo članku naučili kako prenositi i preuzimati datoteke s udaljenog SFTP poslužitelja u Javi. Za to smo koristili više knjižnica: JSch, SSHJ i Apache Commons VFS.

Cjeloviti izvorni kod možete pronaći na GitHubu.