«Умный» скриптинг через SSH с использованием Java

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

Вот блок-схема, показывающая, что должен делать этот метод: «Умный» скриптинг через SSH с использованием Java

Сначала я хочу подключиться через SSH к удаленному серверу. Я успешно попробовал это с «JSch».

После этого метод должен ввести в оболочку команду ls -l и дождаться ответа. Теперь он должен проанализировать вывод и действовать по-разному в зависимости от вывода.

Если есть папка с именем «folder123», следующие команды должны состоять в том, чтобы перейти в эту папку (cd folder123) и снова ввести туда ls -l. Затем этот список содержимого должен быть возвращен, и соединение ssh может быть закрыто.

Если папки не существует, программа должна создать ее (mkdir folder123), а затем вернуть код (-1).

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

Я нашел способы с JSch выполнить одну команду, например ls -l, и даже несколько команд, и получить ответ в виде строки. К сожалению, для этого мне нужно передать все команды в одном блоке, поэтому у меня нет возможности принять решение в середине. Когда я хочу реализовать процесс принятия решений, я должен сначала закрыть соединение. Это приведет к большим накладным расходам при построении соединений, особенно когда нужно будет принять более одного решения, и у меня будет несколько шагов навигации между ними.

Итак, есть ли способ принять это решение, пока соединения остаются установленными, чтобы я мог напрямую ввести следующую команду после него?

Редактировать: Я сейчас просто играю. Итак, мое решение с несколькими командами - это в основном ответ Михаила в этом сообщение

Для этой части задачи было бы проще использовать способы, предложенные DaveyDaveDave и Aaron. Но мне нужно выполнить несколько более конкретных задач. Я подумал, что лучше сначала предоставить простой пример, но вот еще один, который требует использования программы на удаленном сервере:

Другой пример

После того, как соединение ssh установлено (единственный неграфический способ доступа к этому серверу), мне нужно войти в инструмент (то есть однострочно в командной строке).

В cmd и через это в моем ssh-соединении я получаю вывод после этого. Он показывает некоторую информацию о пользователе и заканчивается словом «КОНЕЦ» и выше, что у меня есть код возврата. Функция должна дождаться «КОНЕЦ», а затем проанализировать код возврата. В зависимости от этого функция должна повторить попытку или ввести следующую команду.

После следующей команды он должен выполнить ту же проверку, и когда все работало до сих пор, последний вывод должен быть возвращен в основную программу (в нем содержатся сетевые элементы и информация о них).

Разместите свой код и проблемы с ним.

Strelok 21.08.2018 10:44

Является ли В самом деле требованием, чтобы вы использовали для этого SSH? Это кажется излишне запутанным и подверженным ошибкам подходом, который потребует огромных усилий, чтобы избежать создания уязвимостей в системе безопасности. Если вы находитесь в среде, где вы можете сопоставить целевой диск с местом, к которому можно получить доступ из вашего приложения, вы можете просто использовать встроенную функциональность файловой системы Java, что будет намного проще.

DaveyDaveDave 21.08.2018 10:47

Как насчет того, чтобы вложить свою смекалку в сценарий оболочки? например [ -d folder123 ] && ls -l folder123.

Aaron 21.08.2018 10:47

Если вам просто нужно проверять файлы в удаленной системе и управлять ими, вам следует подумать об использовании SFTP, а не простого SSH. SFTP имеет команды для вывода списка содержимого каталога и создания новых каталогов. И Jsch включает клиента SFTP.

Kenster 21.08.2018 14:09

@Kenster К сожалению, дело не только в управлении файлами. Я попытался прояснить это на втором примере. Мне нужно связаться с приложением на удаленном сервере. Из-за ограничений безопасности единственный удаленный способ сделать это - через ssh.

Maas 22.08.2018 07:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
139
1

Ответы 1

Нашел подходящий ответ на мою проблему в другом потоке, где я задал более конкретный вопрос.

Если у вас похожие проблемы, посмотрите сюда:

Измените System.in и прочтите System.out программно на лету (Jsch)

Другие вопросы по теме