2017-08-06 4 views
0

Je rencontre un problème avec les commandes invoquées par sudo en utilisant à la fois ProcessBuilder et Runtime.exec. Je pense que ProcessBuilder est globalement la meilleure solution, mais les deux produisent le même résultat - ils exécutent des commandes shell bien sur Ubuntu, mais si je tente de faire une commande sudo -i mysql par exemple:Exécution de la commande Java et 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(); } 
    } 

Ces 2 commandes travail:

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

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

Mais cela ne:

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

erreur:

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

Répondre

1

ProcessBuilder ne vous permet pas de rediriger la sortie à l'aide du caractère >. Au lieu de cela, vous pouvez utiliser la méthode processBuilder.redirectOutput() pour spécifier la sortie souhaitée.

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

Ou encore utiliser --result-file de mysqldump pour spécifier le fichier de vidage:

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

Merci! Ça a marché. – user3260912

+0

@ user3260912 Content de vous aider! Veuillez vérifier ma dernière modification à la réponse, j'ai changé 'Redirect.appendTo (dumpFile)' en 'Redirect.to (dumpFile)' puisque le premier correspond à '>>' au lieu de '>'. –