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

Сначала я хочу подключиться через SSH к удаленному серверу. Я успешно попробовал это с «JSch».
После этого метод должен ввести в оболочку команду ls -l и дождаться ответа. Теперь он должен проанализировать вывод и действовать по-разному в зависимости от вывода.
Если есть папка с именем «folder123», следующие команды должны состоять в том, чтобы перейти в эту папку (cd folder123) и снова ввести туда ls -l. Затем этот список содержимого должен быть возвращен, и соединение ssh может быть закрыто.
Если папки не существует, программа должна создать ее (mkdir folder123), а затем вернуть код (-1).
В своей основной программе я буду использовать новые данные для принятия некоторых решений, а затем продолжу.
Я нашел способы с JSch выполнить одну команду, например ls -l, и даже несколько команд, и получить ответ в виде строки. К сожалению, для этого мне нужно передать все команды в одном блоке, поэтому у меня нет возможности принять решение в середине. Когда я хочу реализовать процесс принятия решений, я должен сначала закрыть соединение. Это приведет к большим накладным расходам при построении соединений, особенно когда нужно будет принять более одного решения, и у меня будет несколько шагов навигации между ними.
Итак, есть ли способ принять это решение, пока соединения остаются установленными, чтобы я мог напрямую ввести следующую команду после него?
Редактировать: Я сейчас просто играю. Итак, мое решение с несколькими командами - это в основном ответ Михаила в этом сообщение
Для этой части задачи было бы проще использовать способы, предложенные DaveyDaveDave и Aaron. Но мне нужно выполнить несколько более конкретных задач. Я подумал, что лучше сначала предоставить простой пример, но вот еще один, который требует использования программы на удаленном сервере:
После того, как соединение ssh установлено (единственный неграфический способ доступа к этому серверу), мне нужно войти в инструмент (то есть однострочно в командной строке).
В cmd и через это в моем ssh-соединении я получаю вывод после этого. Он показывает некоторую информацию о пользователе и заканчивается словом «КОНЕЦ» и выше, что у меня есть код возврата. Функция должна дождаться «КОНЕЦ», а затем проанализировать код возврата. В зависимости от этого функция должна повторить попытку или ввести следующую команду.
После следующей команды он должен выполнить ту же проверку, и когда все работало до сих пор, последний вывод должен быть возвращен в основную программу (в нем содержатся сетевые элементы и информация о них).
Является ли В самом деле требованием, чтобы вы использовали для этого SSH? Это кажется излишне запутанным и подверженным ошибкам подходом, который потребует огромных усилий, чтобы избежать создания уязвимостей в системе безопасности. Если вы находитесь в среде, где вы можете сопоставить целевой диск с местом, к которому можно получить доступ из вашего приложения, вы можете просто использовать встроенную функциональность файловой системы Java, что будет намного проще.
Как насчет того, чтобы вложить свою смекалку в сценарий оболочки? например [ -d folder123 ] && ls -l folder123.
Если вам просто нужно проверять файлы в удаленной системе и управлять ими, вам следует подумать об использовании SFTP, а не простого SSH. SFTP имеет команды для вывода списка содержимого каталога и создания новых каталогов. И Jsch включает клиента SFTP.
@Kenster К сожалению, дело не только в управлении файлами. Я попытался прояснить это на втором примере. Мне нужно связаться с приложением на удаленном сервере. Из-за ограничений безопасности единственный удаленный способ сделать это - через ssh.




Нашел подходящий ответ на мою проблему в другом потоке, где я задал более конкретный вопрос.
Если у вас похожие проблемы, посмотрите сюда:
Измените System.in и прочтите System.out программно на лету (Jsch)
Разместите свой код и проблемы с ним.