Перейти к основному содержимому

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

· 5 мин. чтения

1. Обзор

В этом руководстве мы обсудим, как загружать и скачивать файлы с удаленного сервера с помощью SFTP в Java .

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

2. Использование JSch

Во-первых, давайте посмотрим, как загружать и скачивать файлы с удаленного сервера с помощью библиотеки JSch.

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

Нам нужно добавить зависимость jsch в наш pom.xml :

<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>

Последнюю версию 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();
}

RemoteFile — это путь к загружаемому файлу, а localDir путь к целевому локальному каталогу.

3. Использование SSHJ

Далее мы будем использовать библиотеку SSHJ для загрузки и скачивания файлов с удаленного сервера.

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

Во-первых, мы добавим зависимость в наш pom.xml :

<dependency>
<groupId>com.hierynomus</groupId>
<artifactId>sshj</artifactId>
<version>0.27.0</version>
</dependency>

Последнюю версию 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

Наконец, мы будем использовать Apache Commons VFS для передачи файлов на удаленный сервер.

Фактически, Apache Commons VFS использует внутреннюю библиотеку JSch .

4.1. Конфигурация Maven

Нам нужно добавить зависимость commons-vfs2 к нашему pom.xml :

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.4</version>
</dependency>

Последнюю версию commons-vfs2 можно найти на Maven Central .

4.2. Загрузка файла с помощью Apache Commons VFS

Apache Commons VFS немного отличается.

Мы будем использовать FileSystemManager для создания FileObject из наших целевых файлов, а затем использовать FileObject для передачи наших файлов.

В этом примере мы загрузим файл с помощью метода 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://username: password@remoteHost.

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 .