sshj exec не отображает результаты так, как я ожидал

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

Вот мой фрагмент кода

        final Command cmd = session.exec("cd /app/t/backo/bin && ls -all && pwd && . setDBLApp && sudo -E -u deploy ./runDBLApp && sudo -E -u deploy ./nightlyDBL -type host ");

        System.out.println(IOUtils.readFully(cmd.getInputStream()).toString());
        cmd.join(30, TimeUnit.SECONDS);
        System.out.println("\n** exit status: " + cmd.getExitStatus());

Вот что я вижу на выходе. Я думаю, что это как-то связано с размером LocalWindow, но я не могу понять, как это исправить. Это происходит (или кажется), только когда я использую команды ssh, которые будут иметь много вывода на экран.

Это небольшой фрагмент, я получаю около 100 строк этого

14:56:48.957 [reader] INFO  n.s.s.c.c.direct.SessionChannel - Received window adjustment for 2097152 bytes
14:56:48.957 [reader] DEBUG n.s.s.c.channel.Window$Remote - Increasing by 2097152 up to 2097152
14:56:48.957 [reader] DEBUG net.schmizz.concurrent.Promise - Setting <<chan#0 / chanreq for exec>> to `SOME`
14:56:48.963 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 4096 down to 2093056
14:56:48.964 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 1002 down to 2092054
14:56:48.964 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 23 down to 2092031
14:56:49.090 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 141 down to 2091890
14:56:49.120 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 267 down to 2091623
14:56:49.230 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 309 down to 2091314
14:56:49.531 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 308 down to 2091006
14:56:49.532 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 306 down to 2090700

Что я хочу видеть, так это вывод на экран команд ssh, которые могут быть подробными.


person ducati1212    schedule 14.06.2012    source источник


Ответы (1)


Вы правы, думая, что это, вероятно, связано с размером окна. Локальное окно sshj, хранящееся для вывода, поступающего с сервера, могло быть заполнено. Правило по умолчанию заключается в том, что он расширяется, когда вы создаете пространство в буфере, читая из потоков stdout/stderr, предоставляемых API, т.е. channel.getInputStream()/channel.getErrorStream()

У вас есть два варианта:

  • Продолжайте сливать потоки stdout и stderr, пока выполняется команда. Основываясь на вашем фрагменте, вы на самом деле читаете из stdout, но не из stderr. Вы можете мультиплексировать чтение из двух потоков, используя метод available() для java.io.InputStream, который реализован.

  • Установите sessionChannel.setAutoExpand(true), но обратите внимание, что это означает, что независимо от того, сколько вывода производится, локальное окно будет продолжать расширяться, даже если вы не очищаете потоки stdout/stderr, читая из них. Таким образом, это может привести к высокому потреблению памяти.

person shikhar    schedule 18.06.2012