2009-04-27 23 views
30

Estoy intentando ser barato y ejecutar un comando del sistema local (uname -a) en Java. Estoy buscando tomar el resultado de uname y almacenarlo en una cadena. Cual es la mejor manera de hacer esto? código actual:Cómo ejecutar comandos del sistema (linux/bsd) usando Java

public class lame { 

    public static void main(String args[]) { 
     try { 
      Process p = Runtime.getRuntime().exec("uname -a"); 
      p.waitFor(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line=reader.readLine(); 

      while (line != null) {  
       System.out.println(line); 
       line = reader.readLine(); 
      } 

     } 
     catch(IOException e1) {} 
     catch(InterruptedException e2) {} 

     System.out.println("finished."); 
    } 
} 

Respuesta

53

Su camino no está muy lejos de lo que probablemente haría:

Runtime r = Runtime.getRuntime(); 
Process p = r.exec("uname -a"); 
p.waitFor(); 
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream())); 
String line = ""; 

while ((line = b.readLine()) != null) { 
    System.out.println(line); 
} 

b.close(); 

manija que sea excepciones es que quiere, por supuesto.

+2

¿Te importaría cambiar 'b.Close()' por 'b.close()'? Lo editaría, pero necesito cambiar "al menos seis" caracteres. (A menos que sus ediciones también estén restringidas de esa manera) –

+1

@AndrewBreksa: hecho! gracias por atrapar el error tipográfico :) –

+1

'No hay problema. :) –

2

Lo que está haciendo se ve bien. Si su comando solo está devolviendo una sola cadena, no necesita el ciclo while, simplemente almacene el valor de reader.readLine() en una única variable String.

Además, probablemente deba hacer algo con esas excepciones, en lugar de simplemente tragarlas.

+0

Sí, no necesito el loop ¿no? ¡Perfecto gracias! –

7

Esa es la mejor manera de hacerlo. También se puede utilizar el ProcessBuilder que tiene un constructor de argumentos variable, por lo que podría ahorrar una o dos líneas de código

+0

No es la * mejor * forma ya que el comando se ejecuta con shell y, como resultado, es susceptible a la inyección de comandos del SO si los argumentos del comando se toman de la entrada del usuario. 'ProcessBuilder' es definitivamente más seguro en este aspecto. – kravietz

+0

"Estoy intentando ser barato y ejecutar un comando del sistema local (uname -a) ..." - es la MEJOR manera de ser barato y ejecutar un comando del sistema local. A lo que te refieres es la mejor forma de ser insensible a la inyección de comandos del sistema operativo;) – Azder

+2

Sabes, es un poco como pedirle a un programador la manera * más rápida * de bajar el acantilado ... :) He encontrado inyecciones de comandos del sistema operativo en un Las aplicaciones Java usan un patrón de ejecución inspirado en StackOverflow, así que creo que cualquier cosa que mencione Runtime.exec() merece una gran advertencia. – kravietz

Cuestiones relacionadas