Memindahkan Fail Melalui SFTP di Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membincangkan cara memuat naik dan memuat turun fail dari pelayan jauh menggunakan SFTP di Java .

Kami akan menggunakan tiga perpustakaan yang berbeza: JSch, SSHJ, dan Apache Commons VFS.

2. Menggunakan JSch

Pertama, mari kita lihat bagaimana memuat naik dan memuat turun fail dari pelayan jauh menggunakan perpustakaan JSch.

2.1. Konfigurasi Maven

Kami perlu menambahkan kebergantungan jsch ke pom.xml kami :

 com.jcraft jsch 0.1.55 

Versi terbaru dari jsch boleh didapati di Maven Central.

2.2. Menyiapkan JSch

Sekarang, kita akan menubuhkan JSch.

JSch membolehkan kami menggunakan Pengesahan Kata Laluan atau Pengesahan Kunci Awam untuk mengakses pelayan jauh. Dalam contoh ini, kami akan menggunakan pengesahan kata laluan :

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

Dalam contoh di atas, remoteHost mewakili nama atau alamat IP pelayan jauh (mis. Example.com ). Kita boleh menentukan pemboleh ubah yang digunakan dalam ujian sebagai:

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

Juga, kita dapat menghasilkan fail yang dikenali_hosts menggunakan arahan berikut:

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

2.3. Memuat naik Fail Dengan JSch

Sekarang, untuk memuat naik fail ke pelayan jauh, kami akan menggunakan kaedah 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(); }

Dalam contoh ini, parameter pertama metode mewakili fail lokal yang akan dipindahkan, misalnya, src / main / resources / sample.txt, sementara remoteDir adalah jalan dari direktori sasaran di pelayan jauh.

2.4. Memuat turun Fail Dengan JSch

Kami juga boleh memuat turun fail dari pelayan jauh menggunakan 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(); }

The remoteFile adalah jalan bagi fail yang hendak dimuat turun, dan localDir mewakili jalan direktori sasaran tempatan:

3. Menggunakan SSHJ

Seterusnya, kami akan menggunakan perpustakaan SSHJ untuk memuat naik dan memuat turun fail dari pelayan jauh.

3.1. Konfigurasi Maven

Pertama, kami akan menambahkan kebergantungan pada pom.xml kami :

 com.hierynomus sshj 0.27.0 

Versi terbaru dari sshj boleh didapati di Maven Central.

3.2. Menyiapkan SSHJ

Seterusnya, kami akan menyediakan SSHClient .

SSHJ juga membolehkan kami menggunakan Kata Laluan atau Pengesahan Kunci Awam untuk mengakses pelayan jauh.

Kami akan menggunakan Pengesahan Kata Laluan dalam contoh kami:

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

3.3. Memuat naik Fail Dengan SSHJ

Sama dengan JSch, kami akan menggunakan kaedah SFTPClient.put () untuk memuat naik fail ke pelayan jauh :

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

Kami mempunyai dua pemboleh ubah baru di sini untuk menentukan:

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

3.4. Memuat turun Fail Dengan SSHJ

Begitu juga dengan memuat turun fail dari pelayan jauh - kita akan menggunakan 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(); }

Dan mari kita tambahkan dua pemboleh ubah yang digunakan di atas:

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

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

Perhatikan bahawa jalan fail tempatan harus mutlak, dan laluan fail jauh harus dimulakan dengan sftp: // nama pengguna: [dilindungi e-mel]

4.3. Memuat turun Fail Dengan Apache Commons VFS

Memuat turun fail dari pelayan jauh sangat serupa - kami juga akan menggunakan FileObject.copyFrom () untuk menyalin localFile dari 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. Kesimpulan

Dalam artikel ini, kami belajar bagaimana memuat naik dan memuat turun fail dari pelayan SFTP jauh di Java. Untuk ini, kami menggunakan pelbagai perpustakaan: JSch, SSHJ, dan Apache Commons VFS.

Kod sumber lengkap boleh didapati di GitHub.