2016-07-27 13 views
1

Ich verwende derzeit ProcessBuilder, um eine Datei wie test.out auszuführen. Hier einige meiner CodeVerwendung von Java ProcessBuilder zum Ausführen von ./Dateiname in Linux

ArrayList cmd = new ArrayList(); 
cmd.add("sudo"); 
cmd.add("./test.out"); 
String s = ""; 
try{ 
ProcessBuilder pb = new ProcessBuilder(cmd); 
pb.directory(new File("/myPath")); 
pb.redircErrorStream(true); 
Process p = pb.start(); 
InputStream is = p.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferReader br = new BufferReader(isr); 
String line = ""; 
    while((line = br.readLine()) !=null) 
    { 
    s+=line; 
    } 
System.out.println(s); 
} 

I Ausgang der Weg, der richtig ist ("/ myPath"). wenn ich Zeile entfernen

`cmd.add("sudo")` 

die Ausgabe geben Sie mir einen String:

oneoflib:must be root. Did you forgot sudo? 

Aber sobald ich hinzufügen

cmd.add ("sudo");

gibt es nichts Ausgabe.

Ist irgendjemand falsch damit?

Ich kann sudo ./test.out vom Terminal laufen, die gut funktioniert. Ich benutze Eclipse BTW. Vielen Dank.

+0

Warum haben Sie Variable s in Ihrem Code definiert? Wollten Sie das nicht vielleicht in Ihrer Abschlusserklärung drucken? Mit anderen Worten: System.out.println (s); – mdewit

+0

@mdewit sry, du warst richtig, ich habe den Code geändert, danke. Ich möchte nur die Ausgabe des Terminals bekommen. – Kun

Antwort

2

Ich denke, dass das Abrufen des Fehlerstroms aus dem Prozess hier hilfreich sein könnte, um das Problem zu beheben.

Dies sollte helfen, betrachten Sie die folgenden Bash-Skript und nennen wir es IhreExecutable. Nehmen wir an, dass es die richtigen Berechtigungen hat:

if [ "$EUID" -ne 0 ] 
    then echo "Please run as root" 
    exit 
fi 
echo "You are running as root" 

Wenn ohne sudo laufen druckt "Please run as root" andere weise es "You are running as root"

Der Befehl druckt, dh erste Argument in der Liste sein sollte bash, wenn das ist die Shell, die Sie verwenden. Das erste Argument sollte -c lauten, damit die Befehle aus der folgenden Zeichenfolge gelesen werden. Die Zeichenfolge sollte echo <password> | sudo -S ./yourExecutable lauten. Dies ist nicht gerade der beste Weg, um das Passwort an sudo zu senden, aber ich denke nicht, dass das hier der Punkt ist. Die -S zu sudo wird zur Eingabe des Passworts auffordern, das in stdout geschrieben und an sudo weitergeleitet wird.

public static void main(String[] args) throws IOException { 
    Process process = new ProcessBuilder("bash", "-c", "echo <password> | sudo -S ./yourExecutable").start(); 

    BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
    String string; 
    while((string = errorReader.readLine()) != null){ 
     System.out.println(string); 
    } 

    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    while((string = reader.readLine()) != null){ 
     System.out.println(string); 
    } 
} 

Ausgang auf meinem Rechner wie folgt aussieht:

Password: 
You are running as root 
+0

Vielen Dank für deine Antwort, im echo Teil zum Beispiel ist mein Passwort 123456, also sollte ich schreiben wie "echo <123456>" oder ohne das "<>". – Kun

+0

ohne die <> ist was du willst. – Imposter

+0

nachdem ich den Code ausgeführt habe, bleibt die Ausgabe leer. – Kun

Verwandte Themen