Чтобы подключиться ко второму серверу за брандмауэром, в принципе есть два варианта.
Наивным было бы вызвать ssh
на первом сервере (из exec-канала), указав правильный сервер. Для этого потребуется переадресация агента с помощью JSch, а также не предоставляется API JSch для доступа ко второму серверу, только командная строка ssh.
Лучше было бы использовать подключение к первому серверу для создания туннеля TCP и использовать этот туннель для подключения ко второму серверу. JSch Wiki содержит класс ProxySSH (вместе с некоторым примером кода ), что позволяет использовать сеанс JSch в качестве туннеля для второго сеанса JSch. (Отказ от ответственности: этот класс был написан в основном мной при некоторой поддержке автора JSch.)
Когда у вас есть подключение ко второму серверу, используйте либо канал shell
, либо серию каналов exec
для выполнения ваших команд. (См. Канал Shell, Exec или Subsystem в JSch Wiki для обзора и Javadocs для подробностей.)
Для вашей проблемы с неизвестным ключом хоста:
В безопасной версии все ключи хоста собираются (безопасным способом) и помещаются в файл known_hosts. (Если вы просто доверяете представленному вам ключу, вы уязвимы для атаки «человек посередине». Если это не представляет опасности для вашей сети, поскольку она физически защищена, это хорошо для вас.)
удобная версия устанавливает параметр конфигурации StrictHostKeyChecking
to no
— это добавит неизвестные ключи хоста в файл ключей хоста:
JSch.setConfig("StrictHostKeyChecking", "no");
(Вы также можете установить его индивидуально для сеансов, если вы хотите установить его только для проксируемых сеансов, а не для сеанса туннеля. Или переопределить его для сеанса туннеля с помощью yes
или ask
— там опасность MITM может быть больше.)
срединным способом было бы включить фактический запрос пользователя (который затем должен сравнить отпечатки пальцев с некоторым списком) - для этого реализуйте UserInfo
и предоставить объект сеансу. (Вики JSch содержит пример реализации с использованием Swing JOptionPanes, который вы можете просто использовать, если ваша клиентская программа работает в системе с графическим интерфейсом.)
Чтобы сохранение принятых ключей хоста работало, необходимо использовать ссылку JSch.setKnownHosts
с аргументом имени файла, а не с аргументом InputStream, иначе вам придется повторять принятие для каждого перезапуска вашего клиента.
person
Paŭlo Ebermann
schedule
21.07.2011