«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 для создания FileObjects из наших целевых файлов, а затем использовать FileObjects для передачи наших файлов.

В этом примере мы загрузим файл с помощью метода 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() для копирования локального файла с удаленного файла:

@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.

«