Выполнение команд по 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.