Передача файлов через SSH туннель с Java - PullRequest
1 голос
/ 14 февраля 2012

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

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

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

Architecture

Мне нужно сделать эту работу автоматически, поэтому я провел некоторый тест с 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 ]

0 голосов
/ 16 мая 2018

Используйте переадресацию локального порта , или 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");
0 голосов
/ 15 февраля 2012

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

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

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

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

...