Передача файла через SSH туннель с Java

Мне нужно получить некоторые файлы с удаленного компьютера, используя соединение SSH/SFTP, но проблема заключается в следующем:

Клиентский компьютер (под управлением Windows), на котором я буду запускать свое приложение, подключен к сети, где я вижу удаленный сервер (второй компьютер под управлением Unix в той же сети). Я могу делать с ним соединения SSH, однако компьютер, содержащий файлы (работающий под Unix), не находится в этой сети, я могу подключиться только через этот динамический туннель SSH, открытый на втором компьютере, где я обычно использую PuTTY для настройки это соединение, то у меня есть доступ к удаленным файлам.

Следующая картинка представляет архитектуру (брандмауэр похож на вторую машину)

Архитектура

Мне нужно сделать эту работу автоматически, поэтому я провел некоторый тест с Java и библиотекой JSch, вот код:

/* Direccion y puerto del host local */
String host = "localhost";
int lport = 5040;

/* Direccion y puerto del host remoto*/
String rhost = "localhost";
int rport = 80;

/* Usuario y password para conectarse al servidor ssh*/
String user = "test";
String pwd = "test";

JSch jsch=new JSch();

Session session=jsch.getSession(user, host, 22);
session.setPassword("test");

Properties config = new Properties();
config.put("StrictHostKeyChecking","no");
session.setConfig(config);
session.connect();

int assinged_port=session.setPortForwardingL(lport, rhost, rport);
System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);

Я получил соединение, однако, когда я запускаю команду, используя объект sessionответ со второй машины, а не с третьей машины, как я ожидал, я хотел бы знать, есть ли другая библиотека, которая помогает сделать это, или я использую неправильный JSch.

2 ответа

Это тот же ответ, что и на другой ваш вопрос (где вы используете соединение с оболочкой вместо передачи файла):

Поставь правильное hostName как rhostа именно имя целевого сервера, как видно из сервера брандмауэра.

Если он работает с HTTP, я предполагаю, что на сервере брандмауэра также работает прокси-сервер HTTP, который перенаправляет запросы на порт 80 на целевой порт... и, конечно, он не может сделать это для SSH, если он также должен быть SSH сам сервер.

Если вы хотите выполнить оба соединения из JSch, вместо переадресации локального порта, а затем подключения к этому перенаправленному порту, вы можете использовать мой ProxySSH класс, чтобы найти в вики JSch.

Используйте переадресацию локального порта, или туннель SSH, чтобы открыть соединение SSH/SFTP с сервером через брандмауэр. Затем вы можете напрямую загрузить файл на сервер с вашего локального компьютера:

Session firewallSession = jsch.getSession("firewall_username", "firewall", 22);
// ...
firewallSession.connect();

int forwardedPort = 2222; // any port number which is not in use on the local machine
firewallSession.setPortForwardingL(forwardedPort, "server", 22);

Session session = jsch.getSession("server_usernam", "localhost", forwardedPort);
// ...
session.connect();

Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp channelSftp = (ChannelSftp)channel;           

channelSftp.get("/remote/path/on/server/file.txt", "C:\\local\\path\\file.txt");
Другие вопросы по тегам