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 .