2013-07-27 3 views
0

Проблема: я не могу выбраться из «бесконечного цикла/блока» из буферизованного reader.readline(). Он передает его один раз, а затем просто зависает там после того, как второй оторвался от цикла while.Jsch - Передача команд через ssh

Вот мой код:

public void sendCommand(String command){ 
     { 
      String line; 
      try{ 
       while((line = consoleOutput.readLine())!= null) 
        { 
         System.out.println(line); 
         if(line.equals("rkscli:") || line.equals("password :") || line.equals("Please login: ")){ 
          pin.write((command + "\n\r").getBytes()); 
         } 
        } 
       } 

Я использую метод, используемый nilbot от: Here Я делаю именно это, когда я пытаюсь послать команды через оболочку.

Проблема:

То, что я пытаюсь выполнить получает программу ждать, пока сервер не будет готов получить больше команд (ждать скорейшего «rkscli», потому что некоторые команды займет больше времени). Что я могу сделать для этого? В настоящее время я использую метод pipedinput/output.

Дополнительная информация:

Сервер даст мне «» 'S (пустые строки с символами новой строки) перед подсказкой. После нескольких из них это даст мне подсказку. Я также заметил, что если бы я изменил код так, чтобы он выглядел следующим образом:

public void sendCommand(String command){ 
    { 
     String line; 
     try{ 
      while((line = consoleOutput.readLine())!= null) 
       { 
        System.out.println(line); 
            pin.write("\r\n".getBytes());//Added line 
        if(line.equals("rkscli:") || line.equals("password :") || line.equals("Please login: ")){ 
         pin.write((command + "\n\r").getBytes()); 
        } 
       } 
      } 

Это не будет висеть на bufferedReader.readline(), но будет идти до конца и пропустить запись (Это не похоже, ничего писать к оболочке, а иногда она будет и не предсказуема)

Любые идеи относительно того, что я могу сделать?

ответ

0

Хорошо, я считаю, что я решил проблему, прочитав каждый символ (символ по символу) вместо того, чтобы читать строку, потому что, поскольку его оболочка никогда не будет давать завершающий (нулевой) символ «/ 00», и если я не ошибаюсь, читаемая строка ищет это и будет продолжать ждать, пока она не найдет его, поэтому блокирует и не продолжает.

здесь пересмотренный код:

line = new StringBuilder(); 
       boolean ready = false; 
       int c = 0; 
         Thread.sleep(1000);//needs to sleep, it isnt ready :(
         while((ready = consoleOutput.ready()) == true){ 
          ready = consoleOutput.ready(); 
          c = consoleOutput.read();//read char by char 
          line.append((char)c); 
          if((char)c == ':' && (c=consoleOutput.read()) == 0x20 && (consoleOutput.ready()!= true)){ 
           pin.write((command + "\n\r").getBytes());//writing after ready 
           pin.flush(); 
           System.out.println(line.toString() + command); 
           line = null; 
           break; 
          } 

Странный вопрос, который я имел, когда я написал что-то к оболочке в моем первом вопросе, где он будет продолжать читать строки, а не блокировать, когда я написал что-нибудь к оболочке потому что он читал это и читал строку.

Смежные вопросы