Передача файлу через SFTP в Java

1. Огляд

У цьому підручнику ми обговоримо, як завантажувати та завантажувати файли з віддаленого сервера за допомогою SFTP на Java .

Ми використовуватимемо три різні бібліотеки: JSch, SSHJ та Apache Commons VFS.

2. Використання JSch

Спочатку давайте подивимося, як завантажувати та завантажувати файли з віддаленого сервера за допомогою бібліотеки JSch.

2.1. Конфігурація Maven

Нам потрібно буде додати залежність jsch до нашого pom.xml :

 com.jcraft jsch 0.1.55 

Останню версію jsch можна знайти на Maven Central.

2.2. Налаштування JSch

Тепер ми налаштуємо JSch.

JSch дозволяє нам використовувати або автентифікацію пароля, або автентифікацію за відкритим ключем для доступу до віддаленого сервера. У цьому прикладі ми будемо використовувати автентифікацію за допомогою пароля :

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

У наведеному вище прикладі remoteHost представляє ім'я або IP-адресу віддаленого сервера (тобто example.com ). Ми можемо визначити змінні, що використовуються в тесті, як:

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

Крім того, ми можемо створити файл known_hosts, використовуючи таку команду:

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

2.3. Завантаження файлу за допомогою JSch

Тепер, щоб завантажити файл на віддалений сервер, ми використаємо метод 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(); }

У цьому прикладі перший параметр методу представляє локальний файл для передачі, наприклад, src / main / resources / sample.txt, тоді як remoteDir - шлях до цільового каталогу на віддаленому сервері.

2.4. Завантаження файлу за допомогою JSch

Ми також можемо завантажити файл із віддаленого сервера за допомогою 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(); }

Уд_файл це шлях файлу , який буде завантажений, і localDir є шлях до локальної директорії цільової:

3. Використання SSHJ

Далі ми будемо використовувати бібліотеку SSHJ для завантаження та завантаження файлів із віддаленого сервера.

3.1. Конфігурація Maven

Спочатку ми додамо залежність до нашого pom.xml :

 com.hierynomus sshj 0.27.0 

Останню версію sshj можна знайти на Maven Central.

3.2. Налаштування SSHJ

Далі ми налаштуємо SSHClient .

SSHJ також дозволяє нам використовувати автентифікацію за допомогою пароля або відкритого ключа для доступу до віддаленого сервера.

Ми використаємо автентифікацію пароля в нашому прикладі:

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

3.3. Завантаження файлу за допомогою SSHJ

Подібно до JSch, ми будемо використовувати метод SFTPClient.put () для завантаження файлу на віддалений сервер :

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

Ми маємо тут дві нові змінні для визначення:

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

3.4. Завантаження файлу за допомогою SSHJ

Те саме стосується завантаження файлу з віддаленого сервера - ми будемо використовувати 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(); }

І додамо дві змінні, використані вище:

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

4. Використання 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(); }

Зверніть увагу, що локальний шлях до файлу повинен бути абсолютним, а віддалений шлях до файлу повинен починатися з sftp: // ім'я користувача: [захищено електронною поштою]

4.3. Завантаження файлу за допомогою Apache Commons VFS

Завантаження файлу з віддаленого сервера дуже схоже - ми також використовуватимемо FileObject.copyFrom () для копіювання localFile з 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. Висновок

У цій статті ми дізналися, як завантажувати та завантажувати файли з віддаленого сервера SFTP на Java. Для цього ми використовували кілька бібліотек: JSch, SSHJ та Apache Commons VFS.

Повний вихідний код можна знайти на GitHub.