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.