2017-08-06 171 views
0

我對使用ProcessBuilder和Runtime.exec的sudo調用的命令有挑戰。我想到的ProcessBuilder是整體更好的解決方案,但都產生相同的結果 - 他們執行shell命令在Ubuntu上很好,但如果我嘗試,例如做了須藤,我mysql命令:Java和sudo命令執行

public static void runProcess(String[] process) { 
     String s = null; 
     try { 
      Process p = new ProcessBuilder(process).start(); 
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
      while ((s = stdInput.readLine()) != null) { System.out.println(s); } 
      while ((s = stdError.readLine()) != null) { System.out.println(s); } 
     } catch (IOException e) { e.printStackTrace(); } 
    } 

這兩個命令工作:

 String[] cmdArgs0 = { "sudo", "echo", "Done" }; 
     runProcess(cmdArgs0); 

     String[] cmdArgs1 = { "bash", usbDrivePath+"/ASWebUI/Install.sh" }; 
     runProcess(cmdArgs1); 

但這並不:

 String[] cmdArgs2 = { "sudo", "-i", "mysqldump", "Core", ">", cachePath+"/SQLDumps/Core.sql" }; 
     runProcess(cmdArgs2); 

錯誤:

mesg: ttyname failed: Inappropriate ioctl for device 
mysqldump: Couldn't find table: ">" 

回答

1

ProcessBuilder不允許您使用>字符重定向輸出。相反,您可以使用processBuilder.redirectOutput()方法來指定所需的輸出。

File dumpFile = new File("Core.sql"); 
processBuilder.redirectOutput(Redirect.to(dumpFile)); 

甚至使用mysqldump的--result-file選項來指定轉儲文件:

mysqldump [options] --result-file=dump.sql 
+0

謝謝!這工作。 – user3260912

+0

@ user3260912很高興幫助!請檢查我最後一次編輯的答案,我已將'Redirect.appendTo(dumpFile)'更改爲'Redirect.to(dumpFile)',因爲第一個對應於'>>'而不是'>'。 –