Fájlok átvitele SFTP-n keresztül Java-ban

1. Áttekintés

Ebben az oktatóanyagban megbeszéljük, hogyan lehet fájlokat feltölteni és letölteni egy távoli szerverről a Java-ban lévő SFTP segítségével.

Három különböző könyvtárat fogunk használni: JSch, SSHJ és Apache Commons VFS.

2. A JSch használata

Először nézzük meg, hogyan lehet fájlokat feltölteni és letölteni egy távoli szerverről a JSch könyvtár segítségével.

2.1. Maven konfiguráció

Hozzá kell adnunk a jsch függőség a mi pom.xml:

 com.jcraft jsch 0.1.55 

A legfrissebb verziója jsch megtalálható a Maven Central oldalon.

2.2. A JSch beállítása

Most felállítjuk a JSch-t.

A JSch lehetővé teszi számunkra, hogy jelszó-hitelesítést vagy nyilvános kulcs-hitelesítést használjunk a távoli kiszolgáló eléréséhez. Ebben a példában jelszó-hitelesítést fogunk használni:

private ChannelSftp setupJsch () dobja a JSchException {JSch jsch = new JSch (); jsch.setKnownHosts ("/ Felhasználók / john / .ssh / ismert_gazdák"); Munkamenet jschSession = jsch.getSession (felhasználónév, remoteHost); jschSession.setPassword (jelszó); jschSession.connect (); return (ChannelSftp) jschSession.openChannel ("sftp"); }

A fenti példában a remoteHost a távoli szerver nevét vagy IP-címét jelenti (azaz example.com). A tesztben használt változókat a következőképpen definiálhatjuk:

private String remoteHost = "HOST_NAME_HERE"; privát karakterlánc felhasználónév = "USERNAME_HERE"; privát karakterlánc jelszó = "PASSWORD_HERE";

Ezenkívül előállíthatjuk a ismert_gazdák fájl a következő paranccsal:

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

2.3. Fájl feltöltése JSch használatával

Most, fájl feltöltéséhez a távoli szerverre, ezt a módszert fogjuk használni ChannelSftp.put ():

@Test public void whenUploadFileUsingJsch_thenSuccess () dobja a 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 (); }

Ebben a példában a módszer első paramétere az átvinni kívánt helyi fájlt jelenti, például src / main / resources / sample.txt, míg remoteDir a cél könyvtár elérési útja a távoli kiszolgálón.

2.4. Fájl letöltése a JSch segítségével

Azt is megtehetjük fájl letöltése a távoli szerverről a ChannelSftp.get ():

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

A remoteFile a letöltendő fájl elérési útja, és localDir a helyi célkönyvtár elérési útját jelöli:

3. Az SSHJ használata

Ezután az SSHJ könyvtárat használjuk fájlok feltöltésére és letöltésére egy távoli szerverről.

3.1. Maven konfiguráció

Először hozzáadjuk a függőséget a sajátunkhoz pom.xml:

 com.hierynomus sshj 0.27.0 

A legfrissebb verziója sshj megtalálható a Maven Central oldalon.

3.2. Az SSHJ beállítása

Következő, felállítjuk a SSHClient.

Az SSHJ lehetővé teszi számunkra a jelszó vagy a nyilvános kulcs hitelesítés használatát is a távoli kiszolgáló eléréséhez.

A példánkban a jelszó hitelesítést fogjuk használni:

privát SSHClient setupSshj () dobja az IOException {SSHClient kliens = új SSHClient (); client.addHostKeyVerifier (új PromiscuousVerifier ()); client.connect (remoteHost); client.authPassword (felhasználónév, jelszó); visszatérő ügyfél; }

3.3. Fájl feltöltése SSHJ használatával

Hasonló a JSch-hez, használjuk a SFTPClient.put () módszer a fájl feltöltésére a távoli kiszolgálóra:

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

Két új változóval kell meghatároznunk:

privát karakterlánc localFile = "src / main / resources / input.txt"; private String remoteDir = "remote_sftp_test /";

3.4. Fájl letöltése SSHJ-vel

Ugyanez vonatkozik egy fájl letöltésére a távoli szerverről - mi ezt fogjuk használni SFTPClient.get ():

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

És tegyük hozzá a fent használt két változót:

private String remoteFile = "welcome.txt"; privát karakterlánc localDir = "src / main / resources /";

4. Az Apache Commons VFS használata

Végül az Apache Commons VFS-t használjuk a fájlok távoli kiszolgálóra történő átviteléhez.

Tulajdonképpen, Az Apache Commons VFS a JSch könyvtárat használja belsőleg.

4.1. Maven konfiguráció

Hozzá kell adnunk a commons-vfs2 függőség a mi pom.xml:

 org.apache.commons commons-vfs2 2.4 

A legfrissebb verziója commons-vfs2 megtalálható a Maven Central oldalon.

4.2. Fájl feltöltése Apache Commons VFS-sel

Az Apache Commons VFS egy kicsit más.

Használjuk a FileSystemManager készíteni FileObjects a célfájljainkból, majd használja a FileObjects fájljaink átvitelére.

Ebben a példában feltöltünk egy fájlt a metódus használatával FileObject.copyFrom ():

@Test public void, amikor aUUploadFileUsingVfs_thenSuccess () dobja az IOException {FileSystemManager manager = VFS.getManager (); FileObject local = manager.resolveFile (System.getProperty ("user.dir") + "/" + localFile); FileObject remote = manager.resolveFile ("sftp: //" + felhasználónév + ":" + jelszó + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt"); remote.copyFrom (helyi, Selectors.SELECT_SELF); helyi.zárja (); remote.close (); }

Vegye figyelembe, hogy a helyi fájl elérési útjának abszolútnak kell lennie, a távoli fájl elérési útjának pedig ezzel kell kezdődnie sftp: // felhasználónév: [e-mail védett]

4.3. Fájl letöltése Apache Commons VFS-sel

Egy fájl letöltése távoli szerverről nagyon hasonló - mi is használni fogjuk FileObject.copyFrom () másolni localFile tól től remoteFile:

@Test public void whenDownloadFileUsingVfs_thenSuccess () dobja az IOException {FileSystemManager manager = VFS.getManager (); FileObject local = manager.resolveFile (System.getProperty ("user.dir") + "/" + localDir + "vfsFile.txt"); FileObject remote = manager.resolveFile ("sftp: //" + felhasználónév + ":" + jelszó + "@" + remoteHost + "/" + remoteFile); local.copyFrom (távoli, Selectors.SELECT_SELF); helyi.zárja (); remote.close (); }

5. Következtetés

Ebben a cikkben megtanultuk, hogyan kell fájlokat feltölteni és letölteni egy távoli SFTP-szerverről a Java-ban. Ehhez több könyvtárat használtunk: JSch, SSHJ és Apache Commons VFS.

A teljes forráskód megtalálható a GitHub oldalon.