2017-07-13 82 views
0

我想在遠程機器上運行一些命令並使用Java捕獲結果。我有一個shell腳本調用test.sh它具有以下命令:SSH到遠程主機使用sshpass和使用java獲取結果

sshpass -p 'password' ssh [email protected] echo hostname 

我用下面的java代碼運行它:

public void runCommand() throws IOException, InterruptedException { 

    ProcessBuilder builder = new ProcessBuilder(); 
    boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows"); 
    if (isWindows) { 
     builder.command("cmd.exe", "/c", "dir"); 
    } else { 
     builder.command("sh", "-c", "sh test.sh"); 
    } 
    builder.directory(new File(System.getProperty("user.home"))); 
    Process process; 
    BufferedReader reader = null; 
    try { 
     process = builder.start(); 
     reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     StringBuilder stringBuilder = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      stringBuilder.append(line); 
     } 
     String output = stringBuilder.toString(); 
     System.out.println(output); 
    } finally 

    { 
     if (reader != null) 
      try { 
       reader.close(); 
      } catch (IOException e) { 
      } 
    } 
} 

該命令執行,但我不是在得到任何東西輸出。如果我使用簡單的命令如echo,hostname,那麼我可以得到輸出結果。我知道JSch可以解決問題,但我無法使用它。

+0

也許yiu得到一些例外,不記錄它們? – talex

+0

@telex腳本運行沒有任何問題,如果我從終端運行它 – HyperioN

+0

它不回答我的問題。 – talex

回答

2

當開始在Java中的Process,你必須消耗標準輸出和標準錯誤輸出到avoid blocking,並應該你日誌或同時控制(避免消耗到丟棄)。現在使用ProcessBuilder的解決方案比鏈接的文章提到的更容易。

在這種情況下,您完全忽略命令輸出的錯誤。你說你的程序退出時的狀態碼是127,所以它可能打印在stderr上,所以你將通過使用ProcessBuilder.redirectErrorStream(true)來獲得更多關於錯誤的細節。

可能sshpass沒有安裝,或安裝,但不是在您的java進程$PATH

相關問題