Как подключиться к серверу SSH за другим сервером SSH, используя JSch? - PullRequest
5 голосов
/ 21 июля 2011

Мне нужно иметь возможность SSH из Java-программы на удаленный сервер, а оттуда SSH на другой сервер. У меня есть учетные данные для обоих серверов на моем клиенте.

Команды будут автоматически передаваться из приложения в виде обычных строк (без ввода пользователем). Мне нужно иметь возможность запускать эти пользовательские команды на втором сервере и иметь возможность решать, какие команды выполнять во время выполнения, основываясь на выводе и некоторой простой логике.

Могу ли я использовать JSch для этого и, если да, с чего мне начать изучать? (Примеры, информация)

=============================================== ==============

ДОБАВЛЕНО:

Исключение в потоке "main" com.jcraft.jsch.JSchException: UnknownHostKey: host.net. Отпечаток ключа RSA - «бла-бла-бла»

Как и до сих пор, я решаю эту проблему, изменяя файл known_hosts и добавляя туда хост вручную. Могу ли я обойти эту маленькую проблему, установив параметр где-нибудь, указывающий JSch автоматически нажимать YES, когда задают этот вопрос YES-NO?

Ответы [ 3 ]

10 голосов
/ 21 июля 2011

Для подключения ко второму серверу за брандмауэром, в принципе, есть два варианта.

Наивным было бы вызвать ssh на первом сервере (из канала exec), указав правильный сервер. Для этого потребуется переадресация агента с помощью JSch, а также не предоставляется API JSch для доступа ко второму серверу, только командная строка ssh.

Лучше было бы использовать соединение с первым сервером для создания туннеля TCP и использовать этот туннель для соединения со вторым сервером. JSch Wiki содержит класс ProxySSH (вместе с некоторым примером кода), который позволяет использовать сеанс JSch в качестве туннеля для второго сеанса JSch. (Отказ от ответственности: этот класс был написан главным образом мной, при некоторой поддержке автора JSch.)

Если у вас есть подключение ко второму серверу, используйте канал shell или серию каналов exec для выполнения ваших команд. (См. Shell, Exec или Subsystem Channel в JSch Wiki для обзора, и Javadocs для подробностей.)


Для вашей unknown-host-key проблемы:

Версия secure будет собирать все ключи хоста (безопасным способом) и помещать их в файл known_hosts. (Если вы просто доверяете ключу, который вам преподносится, вы уязвимы для атаки «человек посередине». Если это не имеет значения в вашей сети, поскольку она физически защищена, это хорошо для вас.)

удобная версия устанавливает параметр конфигурации StrictHostKeyChecking на no - это добавит неизвестные ключи хоста в файл ключей хоста:

JSch.setConfig("StrictHostKeyChecking", "no");

(Вы также можете установить его индивидуально для сеансов, если вы хотите установить его только для сеансов с прокси, а не для сеанса туннеля. Или переопределить его для сеанса туннеля с помощью yes или ask - там MITM опасность может быть больше.)

A middle way будет включать фактический запрос пользователя (который затем должен сравнить отпечатки пальцев с некоторым списком) - для этого реализуйте интерфейс UserInfo и предоставьте возражать против сессии. (JSch Wiki содержит пример реализации с использованием Swing JOptionPanes , который вы можете просто использовать, если ваша клиентская программа работает в системе с графическим интерфейсом.)

Чтобы сохранение принятых ключей хоста работало, вы должны использовать метод JSch.setKnownHosts с аргументом имени файла, а не метод с аргументом InputStream - иначе ваш прием должен быть повторен для каждый перезапуск вашего клиента.

1 голос
/ 02 мая 2018

Используйте SSH туннель , он же переадресация локального порта , чтобы открыть SSH / SFTP-соединение с B через A.

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 for shell/exec/sftp

Возможно, вам придется разобраться с UnknownHostKey исключением .

0 голосов
/ 26 июля 2018

Это может помочь любому. Работает нормально:

 public static void sesionA(){
     try {
        Session sessionA = jSch.getSession(username, hostA);  
        Properties config = new Properties(); 
        config.put("StrictHostKeyChecking", "no");
        sessionA.setConfig(config);
        sessionA.setPassword(passwordA);
        sessionA.connect();


        if(sessionA.isConnected()) {
            System.out.println("Connected host A!");
            forwardedPort = 2222;
            sessionA.setPortForwardingL(forwardedPort, hostB, 22);      
        }

    } catch (JSchException e) {
        e.printStackTrace();
    }
 }

 public static void sesionB(){


        try {
            Session sessionB = jSch.getSession(username, "localhost", forwardedPort);

            Properties config = new Properties(); 
            config.put("StrictHostKeyChecking", "no");
            sessionB.setConfig(config);
            sessionB.setPassword(passwordB);
            sessionB.connect();

          if(sessionB.isConnected()) {
             System.out.println("Connected host B!");
          }
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...