Java和sudo命令执行

问题描述:

我对使用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: ">" 

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)',因为第一个对应于'>>'而不是'>'。 –