Пару месяцев назад начал работать над одним проектом, одной из частей которого, необходимо было выполнять bash-команды на удаленном сервере. Предварительно, установив SSH соединение. Проект написан на Java и для реализации вышеизложенного использовалась библиотека JSch. Все было хорошо, пока в один прекрасный момент не возникла необходимость кроме выполнения bash-скриптов еще и загружать на сервер файлы. Я потратил немало времени в попытках передать файлы по SSH в виде потоков и прочего в этом духе. В итоге, даже удалось наладить передачу файлов, но все же это решение казалось мне уж очень «костыльным». Потому я провел небольшей ресерч в интернете и нашел куда более изящное решение в рамках все той же библиотеки JSch, которым и хочу с вами поделится.

Если вы когда-нибудь работали с SSH вручную, через клиент типа Putty, у вас, наверняка, возникала аналогичная проблема: нужно передать файл с вашего локального компьютера на удаленный сервер. Можно конечно было поимпровизировать с vim и прочим, но эти импровизации годились только для небольших и текстовых файлов. Так что, зачастую, для решения этой проблемы приходилось устанавливать отдельный SFTP-клиент, к примеру, WinSCP, Far или что-то подобное. Что такое SFTP и как он связан с FTP? Связан он с FTP довольно слабо, кроме разьве что того, что оба протокола предполагают передачу файлов. SFTP(не путать с FTPS) является частью стандарта SSH и предоставляет возможность передачи файлов внутри протокола SSH, тем самым гарантируя безопастность данной передачи(в отличии от FTP, который никому и ничего не гарантирует).
К чему это все? А к тому, что вместо выдумывания велосипедов с перенаправлением потоков можно(и нужно) просто использовать готовый протокол SFTP. Как выяснилось, JSch его так же реализует, что дополнительно упрощает задачу.
Вот пример реализации загрузки файла по SFTP с использованием библиотеки JSch:

import java.io.InputStream;
import java.io.FileInputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class SFTPFileUpload {

public SFTPFileUpload() {
}

public static void main(String[] args) {
String SFTPHOST = "127.0.0.1";
int SFTPPORT = 22;
String SFTPLOGIN = "login";
String SFTPPASSWORD = "password";
String SFTPDESTINATION = "/tmp/examples/sftp/File.dat";
String SFTPSOURCE = "C:/outgoing/File.dat";

Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;

try {
FileInputStream is = new FileInputStream(SFTPSOURCE);
JSch jsch = new JSch();
session = jsch.getSession(SFTPLOGIN, SFTPHOST, SFTPPORT);
session.setPassword(SFTPPASSWORD);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
channel.put(is, SFTPDESTINATION);
} catch (Exception ex) {
ex.printStackTrace();
} finally{
if (is != null) {
is.close();
}
if (channel != null)
{
channel.disconnect();
}
if (session != null)
{
session.disconnect();
}
}
}
}
1

Комментарии

Для того, чтоб оставлять комментарии или зарегистрируйтесь.