Использование java jcabi S SH клиента (или другого) для выполнения нескольких команд в оболочке - PullRequest
0 голосов
/ 19 февраля 2020

Я понимаю, как создать sh оболочку

Shell ssh = new SshByPassword("192.168.1.5", 22, "admin", "password");

Я также понимаю, как выполнить команду

String output = new Shell.Plain(ssh).exec("some command");

, и я могу легко анализировать строку вывода

но как мне отправить в одной и той же «оболочке» одну команду за другой

и бонусный вопрос, иногда команды требуют подтверждения пользователя («нажмите Y, чтобы продолжить»)

это возможно с библиотекой?

1 Ответ

0 голосов
/ 19 февраля 2020

Как правило, большинство API Java S SH оставляют за разработчиком возможность разобраться в сложностях выполнения нескольких команд в оболочке. Это сложная проблема, потому что S SH не дает никаких указаний о том, где команды начинаются и заканчиваются в оболочке; протокол предоставляет только поток данных, который является необработанным выводом оболочки.

Я смиренно хотел бы представить мой проект Maverick Synergy . API с открытым исходным кодом (LGPL), который предоставляет интерфейс для интерактивных оболочек. Я задокументировал параметры для интерактивных команд в статье .

. Вот очень простой пример c, класс ExpectShell позволяет вам выполнять несколько команд, каждый раз возвращая ShellProcess, который инкапсулирует вывод команды. Вы можете использовать ShellProcess InputStream для чтения вывода, он вернет EOF после выполнения команды.

Вы также можете использовать ShellProcessController для взаимодействия с командой, как показано в этом примере.

SshClient ssh = new SshClient("localhost", 22, "lee", "xxxxxx".toCharArray());

ssh.runTask(new ShellTask(ssh) { 
    protected void onOpenSession(SessionChannelNG session) 
         throws IOException, SshException, ShellTimeoutException { 

         ExpectShell shell = new ExpectShell(this);

         // Execute the first command
         ShellProcess process = shell.executeCommand("ls -l");
         process.drain();
         String output = process.getCommandOutput();

         // After processing output execute another
         ShellProcessController controller =  
               new ShellProcessController(
                  shell.executeCommand("rm -i file.txt"));              

         if(controller.expect("remove")) {         
             controller.typeAndReturn("y");     
         }           

         controller.getProcess().drain();
   }
});

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