2013-08-15 10 views
5

Kann ich die folgenden Piped-Befehle über System.Diagnostics.Process ausführen?Ausgeführte Piped-Befehle über System.Diagnostics.Process on Mono

Ich habe versucht, den Dateinamen zu "/ bin/bash", mit den oben genannten als Argumente, ohne Erfolg.

... 
var processStartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = "echo \"test\" | sudo -S shutdown -r +1" }; 
process.StartInfo = processStartInfo; 
... 

Antwort

8

bash wird Ihren Befehl als ein Dateinamen mit Argumenten gefolgt Interpretation, es ruft echo Sinn und leitet den Rest (einschließlich dem Rohr |), um es für den Druck, so dass Sie test | sudo -S shutdown -r +1 und sudo Echo bekommen nicht ausgeführt werden.

Sie sollten die Option -c verwenden, um einen Befehl auszuführen. Außerdem sollten Sie den Befehl selbst angeben, damit er als einzelnes Argument übergeben wird. So etwas sollte funktionieren:

var processStartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = "-c \"echo test | sudo -S shutdown -r +1\"" }; 
+1

Es funktioniert auf Linux. Vielen Dank. –

+1

Diese Methode macht Ihr root-Passwort verfügbar, da es einen Prozess wie "/ bin/bash -c Echotest | sudo -S shutdown -r +1" erzeugt. Wenn Sie also "ps aux" ausführen, kann jeder es sehen oder sich anmelden es. –

+0

Ja, es wird das Passwort des Benutzers verfügbar machen, und es ist ein wenig sinnlos, echo zu verwenden, wenn Sie selbst in die Pipe schreiben können. – Jester