Рубрики
Без рубрики

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

Взгляните на несколько библиотек Java, которые позволяют загружать и скачивать файлы через STFP.

Автор оригинала: baeldung.

1. Обзор

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

Мы будем использовать три различные библиотеки: JSch, SSH и 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");
}

В приведенном выше примере удаленный хост представляет имя или 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, while 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

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

3.2. Настройка SSH

Далее/| мы настроим SSH-клиент .

SSH также позволяет нам использовать аутентификацию по паролю или открытому ключу для доступа к удаленному серверу.

В нашем примере мы будем использовать аутентификацию по паролю:

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

3.3. Загрузка Файла С Помощью SSH

Аналогично Джошу, мы будем использовать метод SFTP Client.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. Загрузка Файла С Помощью SSH

То же самое касается загрузки файла с удаленного сервера — мы будем использовать 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 :


    org.apache.commons
    commons-vfs2
    2.4

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

4.2. Загрузка Файла С Помощью Apache Commons VFS

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

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

В этом примере мы загрузим файл с помощью метода File Object.copy From() :

@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://имя пользователя: [email protected]

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, SSH и Apache Commons VFS.

Полный исходный код можно найти на GitHub .