выполнить несколько команд с помощью сеанса jsch и channelexec - PullRequest
0 голосов
/ 26 сентября 2018

Я изо всех сил пытался заставить это работать, но в конечном счете заставил скрипт выполнить команду (выполнение скрипта sh) на удаленном сервере Unix.Я пытаюсь выполнить вторую команду и постоянно получаю сообщение об ошибке либо при создании нового канала, либо при его использовании.

       try {


            ((ChannelExec) channel).setCommand(command);
            PrintStream out= new PrintStream(channel.getOutputStream());
            InputStream in = channel.getInputStream();

            channel.connect();

            BufferedReader scriptReader= new BufferedReader(new InputStreamReader(in));
            scriptOutput = scriptReader.readLine();

            sb = new StringBuilder();

            while ((scriptOutput = scriptReader.readLine())!= null) {
                sb.append(scriptOutput + "\n");

Это первый фрагмент выполнения канала, который работает нормально.Теперь следующий фрагмент кода метода вызывается сразу после использования указанного входного потока:

      try {

          StringBuilder sb = new StringBuilder();
          command = new_command;
          ((ChannelExec) channel).setCommand(command);

          InputStream in = channel.getInputStream();
          channel.connect();
          BufferedReader scriptReader= new BufferedReader(new InputStreamReader(in));
          scriptOutput = scriptReader.readLine();

            //StringBuilder sb = new StringBuilder();
          for(int c=0; c < consumerList.size(); c++){
           ....

Теперь возвращается следующая ошибка:

com.jcraft.jsch.JSchException: channel is not opened.

Теперь, если я создаю новый канал с тем же сеансомЯ получил нулевой ответ от возвращенного потока.Я протестировал команду в удаленной оболочке, и она отлично работает:

      int counter = 0;
      Channel channelII = session.openChannel("exec");

      try {

          StringBuilder sb = new StringBuilder();
          command = new_command;
          ((ChannelExec) channelII).setCommand(command);

          InputStream in = channelII.getInputStream();
          channelII.connect();
          BufferedReader scriptReader= new BufferedReader(
           new InputStreamReader(in));
          scriptOutput = scriptReader.readLine();

вторая команда следующая, и я хочу иметь возможность многократно выполнять ее для разных групп потребителей:

/usr/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 
    192.xxx.xx.xxx:9092 --describe -group consumergroup1

РЕДАКТИРОВАТЬ:

ответ второй команды:

TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  
   LAG        CONSUMER-ID                                       HOST                           
  CLIENT-ID
   output.influxDB    1          94919           2781796         
    2686877    -                                                 -                              
   -
   output.influxDB    0          94919           2781798         
    2686879    -                                                 -                              
   -
   output.influxDB    2          94918           2781795         
    2686877    -                                                 -                              
    -

1 Ответ

0 голосов
/ 26 сентября 2018

Спасибо Николасу и Мартину за их ответы.Я выяснил, что было не так, и хотел опубликовать ответ, так как я понимаю, что такие мелочи возникают для нас, «тупых» программистов, которые задают нелепые вопросы, которые вызывают отрицательные голоса.Выходные данные для второй команды возвращали ответ «предупреждение / ошибка» в первой строке, и, не учитывая следующее, я не видел этого, и чтение следующей строки было пустым.Я знаю, что это глупо, и я должен был понять это перед публикацией, потому что в этом смысл этого сайта: публиковать вопросы, которые не известны другим.Но так как я должен был знать это по сути:

В любом случае убедитесь, что включена следующая строка:

  ((ChannelExec)channelII).setErrStream(System.err);

, а также читайте поток с помощью цикла, а не просто проверяйте чтение первой строки.

     while ((scriptOutput = scriptReader.readLine())!= null) {
                sb.append(scriptOutput + "\n");
          }

Я надеюсь, что это может быть, по крайней мере, уроком для некоторых, если не решением проблемы.

...