В этой статье показано, как выполнить передачу файлов с удаленного сервера в локальную систему и наоборот, используя Протокол передачи файлов SSH (SFTP) на Java.
P.S Протестирован с JSch 0.1.55
1. Зависимость от JSch
com.jcraft jsch 0.1.55
2. Передача файлов – Примеры JSch
2.1 В JSch , мы можем использовать положить и получить для передачи файлов между серверами.
Мы используем put для передачи файлов из локальной системы на удаленный сервер.
channelSftp.put(localFile, remoteFile);
Мы используем get для загрузки файлов с удаленного сервера в локальную систему.
channelSftp.get(remoteFile, localFile);
2.2 Аутентификация по паролю.
JSch jsch = new JSch();
jsch.setKnownHosts("/home/mkyong/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
jschSession.setPassword(PASSWORD);
2.3 Аутентификация по открытым и закрытым ключам, прочитайте это Используйте аутентификацию с открытым ключом с помощью SSH
- Локальный закрытый ключ –
/home/mkyong/.ssh/id_rsa - Удаленный открытый ключ –
~/.ssh/авторизованные ключи
JSch jsch = new JSch();
jsch.setKnownHosts("/home/mkyong/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
jsch.addIdentity("/home/mkyong/.ssh/id_rsa");
2.4 Ознакомьтесь с этим полным JSch пример передачи файла из локальной системы на удаленный сервер 1.2.3.4 , аутентифицируйтесь с помощью пароля SSH.
package com.mkyong.io.howto;
import com.jcraft.jsch.*;
public class SFTPFileTransfer {
private static final String REMOTE_HOST = "1.2.3.4";
private static final String USERNAME = "";
private static final String PASSWORD = "";
private static final int REMOTE_PORT = 22;
private static final int SESSION_TIMEOUT = 10000;
private static final int CHANNEL_TIMEOUT = 5000;
public static void main(String[] args) {
String localFile = "/home/mkyong/local/random.txt";
String remoteFile = "/home/mkyong/remote/afile.txt";
Session jschSession = null;
try {
JSch jsch = new JSch();
jsch.setKnownHosts("/home/mkyong/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
// authenticate using private key
// jsch.addIdentity("/home/mkyong/.ssh/id_rsa");
// authenticate using password
jschSession.setPassword(PASSWORD);
// 10 seconds session timeout
jschSession.connect(SESSION_TIMEOUT);
Channel sftp = jschSession.openChannel("sftp");
// 5 seconds timeout
sftp.connect(CHANNEL_TIMEOUT);
ChannelSftp channelSftp = (ChannelSftp) sftp;
// transfer file from local to remote server
channelSftp.put(localFile, remoteFile);
// download file from remote server to local
// channelSftp.get(remoteFile, localFile);
channelSftp.exit();
} catch (JSchException | SftpException e) {
e.printStackTrace();
} finally {
if (jschSession != null) {
jschSession.disconnect();
}
}
System.out.println("Done");
}
}
3. ДЩ Исключения
Некоторые распространенные исключения.
3.1 Для исключения UnknownHostKey добавьте удаленный IP-адрес в known_hosts файл.
$ ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts
3.2 Для недействительного закрытого ключа преобразуйте закрытый ключ в другой формат.
$ ssh-keygen -p -f ~/.ssh/id_rsa -m pem
3.3 Для Ошибка авторизации убедитесь, что указанный пароль правильный.
com.jcraft.jsch.JSchException: Auth fail at com.jcraft.jsch.Session.connect(Session.java:519) at com.mkyong.io.howto.SFTPFileTransfer.main(SFTPFileTransfer.java:34)
Скачать Исходный Код
$клон git $клон git
$cd java-ввод-вывод
Рекомендации
- Википедия – Протокол передачи файлов SSH (SFTP)
- JSch – Примеры
- Исключение неизвестного хосткея JSch
- Недопустимый закрытый ключ JSch
Оригинал: “https://mkyong.com/java/file-transfer-using-sftp-in-java-jsch/”