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 .