webentwicklung-frage-antwort-db.com.de

wie führt man einen Befehl am Terminal aus einem Java-Programm aus?

Ich muss einen Befehl am Terminal in Fedora 16 von einem Java-Programm aus ausführen. Ich habe es versucht

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

aber dies öffnet nur das Terminal, ich kann keinen Befehl ausführen.

Ich habe auch folgendes versucht:

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

aber trotzdem kann ich nur das Terminal öffnen, aber den Befehl nicht ausführen.

19
phoenix

Sie müssen es mit bash ausführbar wie folgt ausführen:

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

Update: Wie von xav vorgeschlagen, ist es ratsam, stattdessen ProcessBuilder zu verwenden:

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

Ich stimme für die Antwort von Karthik T. Sie müssen kein Terminal öffnen, um Befehle auszuführen. 

Zum Beispiel,

// 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();   

    }
} 

Die Ausgabe: 

$ 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
11
Scott YAN

Sie müssen einen Befehl nicht tatsächlich von einer xterm-Sitzung aus ausführen, sondern können ihn direkt ausführen:

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

Wenn der Prozess interaktiv auf den Eingabestrom reagiert und Sie Werte einfügen möchten, tun Sie das, was Sie zuvor getan haben:

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

Vergessen Sie nicht das '\ n' am Ende, da die meisten Apps es verwenden, um das Ende der Eingabe eines einzelnen Befehls zu identifizieren.

8
Chris Cooper

Wie bereits erwähnt, können Sie Ihr externes Programm ohne xterm ausführen. Wenn Sie es jedoch in einem Terminalfenster ausführen möchten, z. Damit der Benutzer mit ihm interagieren kann, können Sie mit xterm das als Parameter auszuführende Programm angeben.

xterm -e any command

In Java-Code wird dies zu:

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

Oder mit ProcessBuilder:

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

Ich weiß nicht warum, aber aus irgendeinem Grund funktionierte die "/ bin/bash" -Version nicht für mich . Stattdessen funktionierte die einfachere Version entsprechend dem angegebenen hier bei Oracle Docs.

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

Ich weiß, dass diese Frage ziemlich alt ist, aber hier ist eine library , die die ProcessBuilder-API einkapselt.

1
UpsideDownTree