Запуск команд через ssh с Java - PullRequest
10 голосов
/ 20 февраля 2009

Scenerio: Я хотел бы запускать команды на удаленных машинах из Java-программы через ssh (я использую OpenSSH на моей машине разработки). Я также хотел бы установить ssh-соединение, передав пароль, а не настраивая ключи, как я сделал бы с помощью функции «ожидается».
Проблема: при попытке выполнить «ожидаемый» пароль, например, процесс, созданный с помощью ProcessBuilder, не может увидеть запрос пароля. При выполнении обычных команд не-ssh (например, «ls») я могу получать потоки и взаимодействовать с ними очень хорошо. Я объединяю стандартную ошибку и стандартную в один поток с redirectErrorStream(true);, поэтому я не пропускаю его в стандартной ошибке ... Когда я запускаю ssh с опцией -v, я вижу все записи в потоке, но я не вижу подсказки. Я впервые пытаюсь использовать ProcessBuilder для чего-то подобного. Я знаю, что было бы проще использовать Python, Perl или другие, но мой босс хочет использовать то, что мы пытаемся вернуть (удаленные файлы журналов и запуск скриптов), в рамках существующей Java-программы, поэтому я застрял.

Заранее спасибо за помощь!

Ответы [ 9 ]

11 голосов
/ 20 февраля 2009

Приглашение может отображаться, только если ssh подключено к TTY, чего нет в случае Java.

Вероятно, есть способ указать пароль в командной строке вашего приложения ssh. Это будет способ преодолеть подсказку.

В качестве альтернативы рассмотрите возможность подключения напрямую к хост-серверу из собственного кода Java, а не запускать внешнее приложение. миллион библиотек , которые будут делать это.

7 голосов
/ 20 февраля 2009

Вместо использования внешней программы ssh, почему бы не использовать библиотеку Java ssh:

Два из них я обнаружил в Google - это позволит избежать проблемы, связанной с тем, что openssh будет очень усердно работать, чтобы предотвратить ввод пароля на stdin, - это будет открытие терминала напрямую. ожидать, что нужно очень много работать, чтобы имитировать tty, чтобы работать.

6 голосов
/ 09 марта 2010

plug: см. этот пример выполнения команды через ssh с использованием sshj

4 голосов
/ 20 февраля 2009

Почему бы не использовать клиент Java ssh? Этот один имеет лицензию BSD, и в списке больше клиентов здесь .

2 голосов
/ 20 февраля 2009

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

1 голос
/ 06 мая 2011

Повторяет предложение других использовать библиотеку Java SSH. Но хотел прокомментировать ответ Коэна. Отправка пароля через командную строку при установлении соединения небезопасна и также не разрешена многими серверами sshd (в зависимости от конфигурации).

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

Основные шаги - используйте openssh для создания пары ключей (я сделал RSA, но я знаю, что сейчас есть лучший метод) - создайте каталог .ssh в своей домашней папке на компьютере SOURCE. - создать каталог .ssh в вашей домашней папке на машине TARGET - храните свой закрытый ключ в папке .ssh на исходном компьютере. - скопируйте ваш открытый ключ в файл с именем author_keys в целевой папке .ssh

Некоторые инструкции можно найти здесь

1 голос
/ 23 июня 2009

Взгляните на недавно выпущенный SSHD , основанный на проекте Apache MINA.

1 голос
/ 03 марта 2009

Я пользуюсь клиентом trilead ssh с большим успехом. Я также пробовал jsch (другой java ssh-клиент) и туннелирование на нативный ssh-клиент под linux. Trilead был безусловно лучшим.

0 голосов
/ 09 июня 2009

Вы можете запускать команды, используя edtFTPj / PRO , а также выполнять передачу файлов через SFTP. Это Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...