Запускать удаленные команды через SSH-туннель в Java - PullRequest
1 голос
/ 14 февраля 2012

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

Клиентский компьютер (под управлением Windows) подключен к сети, где я вижу удаленный сервер (второй компьютер * nix, в той же сети). Я могу делать с ним соединения SSH, однако компьютер, содержащий файлы (работающий * nix), не находится в этой сети, я могу подключиться только через этот динамический туннель 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.

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Конечно, если вы установите rhost = "localhost", соединение будет поступать на сервер SSH, а не на сервер «Ресурс».Введите правильное имя хоста, и это не должно быть проблемой.(Я сделал это один раз.)

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

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

Вы должны открыть другой сеанс, который использует перенаправленный порт.

Session sessionA = jsch.getSession("usernameA", "hostA");
// ...
sessionA.connect();

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

Session sessionB = jsch.getSession("usernameB", "localhost", forwardedPort);
// ...
sessionB.connect();

// Use sessionB here to execute your command
0 голосов
/ 21 мая 2016

Вы должны создать сеанс на втором сервере после переадресации порта.Затем устанавливается соединение с сервером за брандмауэром.

Посмотрите на этот код для пример . Что делает этот код - создает локальный порт, перенаправляющий на порт ssh в целевой системе, а затем соединяется через него.Запуск команды hostname показывает, что она действительно выполняется в перенаправленной системе.

...