2013-05-08 49 views
0

我使用下面的代碼來獲得使用JSCH庫命令的輸出,bashrc中回聲jsch輸出流來

public SSHOutputBean executeCommand(String cmd, int timeOut) { 

      SSHOutputBean outputBean=new SSHOutputBean(); 
      Channel ch=null; 
     try { 
      ch= this.session.openChannel("exec"); 

      ChannelExec chExec= ((ChannelExec) ch); 
      chExec.setErrStream(System.err); 
      chExec.setInputStream(null); 
      chExec.setCommand("reset;"+cmd); 
      chExec.connect(); 
      outputBean.setInputStream(chExec.getInputStream()); 
      BufferedReader brInput = new BufferedReader(new InputStreamReader(outputBean.getInputStream())); 
      outputBean.setErrorStream(chExec.getErrStream()); 
      BufferedReader brError = new BufferedReader(new InputStreamReader(outputBean.getErrorStream())); 
      while (true) { 
       try { 

        String result = brInput.readLine(); 
        if (result == null) 
         break; 
        outputBean.getOutput().append(result+"\n"); 

       } catch (Exception ex) { 
         ex.printStackTrace(); 
         break; 
       } 
      } 

      while (true) { 
       try { 

        String result = brError.readLine(); 
        if (result == null) 
         break; 
        outputBean.getError().append(result+"\n"); 

       } catch (Exception ex) { 
         ex.printStackTrace(); 
         break; 
       } 
      } 

if (chExec.isClosed()) { 

       outputBean.setExitStatus(chExec.getExitStatus()); 

      } 
      chExec.disconnect(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSchException e){ 

      e.printStackTrace(); 
     } 
     finally 
     { 
      if(ch!=null) 
       ch.disconnect(); 
     } 

    return outputBean; 
} 

的問題是,如果客戶端上的.bashrc文件打印的東西在控制檯上,然後每次我打開一個ChannelExec並運行一個命令;在命令執行時給出的輸出包含命令的輸出以及bashrc輸出。我只想輸出命令而不是打印bashrc。

例如,

如果我已經把下面的代碼在.bashrc文件

回聲 「歡迎用戶」

和如果我運行命令使用jsch,

SSHOutputBean sshOutputBean = ssh.executeCommand( 「正常運行時間」);

然後輸出是,

歡迎用戶(.bashrc中輸出)

13時15分10秒達2天1:53,8個用戶,平均負載:0.14,0.06, 0.06(實際命令輸出)

但我想輸出是,

十三點15分10秒達2天1:53,8個用戶,平均負載:0.14,0.06,0.06(實際指令輸出)

請幫忙!

回答

0

我假設您不能簡單地將.bashrc更改爲安靜。如果您想要隔離由您的命令產生的輸出,並在此之前忽略任何內容,則Exec頻道可能不是您最好的選擇。當你運行命令時,你輸出的流將包含所有的輸出。

你可以嘗試使用shell代替。你可以讓它連接並讓你的流讀取所有的初始輸出(也就是.bashrc文件中的「歡迎用戶」或其他輸出)。然後刷新流,然後執行你的命令並讀取流,只看到命令本身的輸出。

或者,您可以使用channelExec來解決問題。使用channel.setEnv(name,value)設置PS1變量以包含一些分隔字符串。例如:

channel.setEnv("PS1","Command Starts Here::") 

然後,您可以分析你在你的提示輸出上的界定串「命令從這裏開始::」

+0

嘿感謝很多關於這樣一個清晰的答案。我也嘗試過使用shell,它會打印一次.bashrc輸出,但它還會打印每個命令的 [username @ hostname] $命令 。 解決方法非常好,但是我已經擁有了另一個在執行命令之前回顯一個字符串的地方,然後使用此字符串作爲分隔符。我正在尋找一些具體的解決方案,我們可以使用一些JSCH選項來執行所需的操作。 非常感謝。 – 2013-05-09 07:51:48

+0

[username @ hostname] $聽起來像一個提示。這些由PS1,PS2,PS3和PS4環境變量控制。您可以使用setEnv刪除您的頻道提示(使用exec或shell)。回聲是一個很好的簡單工作。我不認爲你會找到內置的東西來解決這個問題,因爲這個問題的本質 - 通道有一個輸出流,你的服務器正在向它發送輸出。你可以在服務器端靜默它,或者在客戶端進行解析/過濾。也許PaŭloEbermann會用一些絕密的jsch功能來加入:) – Damienknight 2013-05-09 15:04:45

+0

非常感謝回覆。是的,似乎沒有其他選項可以回顯,然後在服務器端執行解析器。 – 2013-05-13 06:43:10