2013-07-27 198 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 我做的正是這一點,在這裏我想通過shell發送命令。

問題:

我試圖做到的是讓程序等待,直到服務器已準備好接收更多的命令(等待提示「rkscli」,因爲一些命令需要更多的時間)。我該怎麼做才能做到這一點?我目前使用pipedinput/output方法。

其他信息:

服務器將提示之前給我「」的(空與換行符的字符串)。其中幾個它會給我提示。我也注意到,如果我改變了代碼,使其看起來像這樣:

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; 
          } 

怪異的問題,我已經當我寫我的第一個問題什麼的外殼哪裏會繼續讀取線,而不是阻止時,我寫什麼殼是因爲它正在閱讀並閱讀該行。