Назад | Перейти на главную страницу

Удаленная команда SSH через программу Java

Прежде всего, мои знания Linux ограничены! Я больше разработчик, который случайно управляет некоторыми серверами :-)

Итак, я работаю на ферме серверов RHEL5 / 6 (смешанных), и вот что я хочу сделать: у меня есть программа Java на одном главном сервере, которая выполняет команды на некоторых удаленных машинах. Программа на Java правильно отправляет мои команды в ОС - локальные команды могут выполняться без проблем. Моя проблема - выполнение команд на удаленных серверах:

Попытка №1

$ ssh root@192.168.1.1
Pseudo-terminal will not be allocated because stdin is not a terminal.
Host key verification failed.

Итак, будучи знакомым с Google, я читал о tty, который должен был решить проблему, но только к:

Попытка №2

$ ssh -t -t root@192.168.1.1
tcgetattr: Invalid argument
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is <somehex>.

Итак, мое приложение застряло на этом этапе, как ни странно, после нажатия Ctrl + C я увидел следующий текст:

Are you sure you want to continue connecting (yes/no)? Killed by signal 2.

Итак, я предполагаю, что что-то работало, оно просто застряло на входе. Однако мне не удалось найти ничего убедительного в этой ошибке. Один намек где-то был отредактировать /etc/sudoers и закомментируйте (я знаю, что не рекомендую)

# Defaults    requiretty

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

У меня вопрос: ведет ли это к чему-нибудь или мои попытки бесполезны? Или есть лучший способ запускать удаленные команды на подчиненных устройствах, запускаемых программой на главной машине? Пожалуйста, имейте в виду, что я не буду перекомпилировать свое ядро ​​или выполнять какие-либо сложные махинации, так как мне просто не хватает опыта работы с Linux ..

Помощь очень ценится!

У меня есть ключи SSH

Эти ключи настроены под учетной записью root?

Ошибка проверки ключа хоста.

Подлинность хоста 192.168.1.1 (192.168.1.1) не может быть установлена. Отпечаток ключа RSA -.

Ваша программа не выполняет запись в файл known_hosts. Хост, к которому вы пытаетесь подключиться, не использовался из учетной записи, которую использует Java-процесс. Вам нужно будет сгенерировать действительный файл known_hosts перед его использованием. Или, возможно, если вы достаточно доверчивый человек, вы могли бы установить StrictHostKeyChecking no вариант.

Если он использовался под этой учетной записью, то в среде что-то не так. Возможно, вы захотите серьезно подумать о настройке файла конфигурации для клиента ssh и определении пути для ключей и файла known_host. Попросите вашу Java-программу ссылаться на файл конфигурации, используя ssh -f configfile.

Решил мою проблему с помощью библиотеки Java JSCH, который представляет собой чистую реализацию SSH2 на Java. Я подумал, что мои настройки SSH в моей среде также испорчены, поэтому мне это показалось более эффективной альтернативой.

Мне потребовалось 1-2 часа, чтобы заставить его работать - очень легко реализовать.

В любом случае спасибо за предложения. Мне особенно пришлось использовать StrictHostKeyChecking=no вариант (который также доступен в библиотеке Java), чтобы иметь возможность подключиться.

Плюсы и минусы:

  • (-) Документация Jsch довольно плохая
  • (-) Сделаны некоторые предположения, которые вам нужно выяснить при первом использовании.
  • (+) Однако в сети есть много вопросов и ответов, потому что библиотекой пользуется довольно много людей.
  • (+) Есть несколько хорошо иллюстрированных примеров, демонстрирующих, как работают разные функции, но это не полностью заменяет хорошую документацию.