2013-08-15 10 views
5

Czy można wykonać następujące polecenia potokowe za pośrednictwem System.Diagnostics.Process?Wykonywanie poleceń potokowych za pośrednictwem System.Diagnostics.Process on Mono

echo "test" | sudo -S shutdown -r +1 

Próbowałem ustawić nazwę pliku na "/ bin/bash", z powyższymi argumentami, bez powodzenia.

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

Odpowiedz

8

bash interpretuje Twoje polecenia jako nazwę pliku, a następnie argumenty, co oznacza, że ​​wywołuje echo i przekazuje całą resztę (w tym rury |), aby ją do drukowania, dzięki czemu dostanie test | sudo -S shutdown -r +1 echem i nie będzie sudo być straconym. Aby uzyskać polecenie, należy użyć opcji -c. Co więcej, powinieneś zacytować to polecenie, aby zostało przekazane jako pojedynczy argument. Coś takiego powinno zadziałać:

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

Działa na systemie Linux. Dziękuję Ci. –

+1

Ta metoda ujawnia twoje hasło roota, ponieważ utworzy proces taki jak "/ bin/bash -c echo test | sudo -S shutdown -r +1", więc jeśli uruchomisz "ps aux", każdy może go zobaczyć lub logować to. –

+0

Tak, spowoduje to ujawnienie hasła użytkownika i nie ma sensu używać 'echo', gdy możesz sam napisać do fajki. – Jester