cómo ejecutar un comando en la terminal del progtwig java?

Necesito ejecutar un comando en la terminal en Fedora 16 desde un progtwig JAVA. Intenté usar

Runtime.getRuntime().exec("xterm"); 

pero esto solo abre la terminal, no puedo ejecutar ningún comando.

También intenté esto:

 OutputStream out = null; Process proc = new ProcessBuilder("xterm").start(); out = proc.getOutputStream(); out.write("any command".getBytes()); out.flush(); 

pero aún así solo puedo abrir el terminal, pero no puedo ejecutar el comando. ¿Alguna idea de cómo hacerlo?

Debes ejecutarlo usando el ejecutable bash así:

 Runtime.getRuntime().exec("/bin/bash -c your_command"); 

Actualización: según lo sugerido por xav , es aconsejable usar ProcessBuilder en su lugar:

 String[] args = new String[] {"/bin/bash", "-c", "your_command", "with", "args"}; Process proc = new ProcessBuilder(args).start(); 

Voto la respuesta de Karthik T. no necesita abrir una terminal para ejecutar comandos.

Por ejemplo,

 // file: RunShellCommandFromJava.java import java.io.BufferedReader; import java.io.InputStreamReader; public class RunShellCommandFromJava { public static void main(String[] args) { String command = "ping -c 3 www.google.com"; Process proc = Runtime.getRuntime().exec(command); // Read the output BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = ""; while((line = reader.readLine()) != null) { System.out.print(line + "\n"); } proc.waitFor(); } } 

La salida:

 $ javac RunShellCommandFromJava.java $ java RunShellCommandFromJava PING http://google.com (123.125.81.12): 56 data bytes 64 bytes from 123.125.81.12: icmp_seq=0 ttl=59 time=108.771 ms 64 bytes from 123.125.81.12: icmp_seq=1 ttl=59 time=119.601 ms 64 bytes from 123.125.81.12: icmp_seq=2 ttl=59 time=11.004 ms --- http://google.com ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 11.004/79.792/119.601/48.841 ms 

En realidad, no necesita ejecutar un comando desde una sesión xterm, puede ejecutarlo directamente:

 String[] arguments = new String[] {"/path/to/executable", "arg0", "arg1", "etc"}; Process proc = new ProcessBuilder(arguments).start(); 

Si el proceso responde interactivamente al flujo de entrada, y desea inyectar valores, entonces haga lo que hizo antes:

 OutputStream out = proc.getOutputStream(); out.write("command\n"); out.flush(); 

Sin embargo, no se olvide de ‘\ n’ al final, ya que la mayoría de las aplicaciones lo usarán para identificar el final de la entrada de un solo comando.

Como dijeron otros, puede ejecutar su progtwig externo sin xterm. Sin embargo, si desea ejecutarlo en una ventana de terminal, por ejemplo, para permitir que el usuario interactúe con él, xterm le permite especificar el progtwig para que se ejecute como parámetro.

 xterm -e any command 

En código Java esto se convierte en:

 String[] command = { "xterm", "-e", "my", "command", "with", "parameters" }; Runtime.getRuntime().exec(command); 

O, usando ProcessBuilder:

 String[] command = { "xterm", "-e", "my", "command", "with", "parameters" }; Process proc = new ProcessBuilder(command).start(); 

No sé por qué, pero por alguna razón, la versión “/ bin / bash” no funcionó para mí. En cambio, la versión más simple funcionó, siguiendo el ejemplo dado aquí en Oracle Docs.

 String[] args = new String[] {"ping", "www.google.com"}; Process proc = new ProcessBuilder(args).start(); 

Sé que esta pregunta es bastante antigua, pero aquí hay una biblioteca que encapsula la API de ProcessBuilder.