Выполнение команд по ssh с помощью Java

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

Заранее благодарим за помощь!

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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