2011-12-19 20 views
5

Próbuję napisać małą aplikację paska stanu MacRuby, która uruchamia polecenie z wiersza poleceń i wyświetla dane wyjściowe. Nie wiem, jak to zrobić. Jak mogę to zrobić z mojej aplikacji Mac?Jak uruchamiać polecenia powłoki z aplikacji Mac/MacRuby?

Aktualizacja: Inną rzeczą, którą może być konieczne, jest podanie hasła administratora. Czasami po uruchomieniu tego skryptu z wiersza poleceń, prosi o podanie mojego hasła. Nie wiem, w jaki sposób zachęciłbym użytkownika do podania hasła (lub osadzenia powłoki, aby mogli ją wpisać bezpośrednio).

+0

Co dokładnie robi twój skrypt? – SeanNieuwoudt

+0

W końcu będzie to opakowanie GUI dla [vagrant] (http://vagrantup.com). Tak więc będę musiał uruchomić 'vagrant up' i zobaczyć wynik. – Andrew

Odpowiedz

6

Korzystanie z kakao i MacRuby, użyj NSTask. Przykładem, który wykonuje ls -la wyjściu i nadrukami:

framework 'Cocoa' 

task = NSTask.alloc.init 
task.setLaunchPath("/bin/ls") 

arguments = NSArray.arrayWithObjects("-l", "-a", nil) 
task.setArguments(arguments) 

pipe = NSPipe.pipe 
task.setStandardOutput(pipe) 

file = pipe.fileHandleForReading 

task.launch 

data = file.readDataToEndOfFile 

string = NSString.alloc.initWithData(data, encoding: NSUTF8StringEncoding) 
puts "Command returned: " 
puts string 

Niestety, w tym uprawnienia administratora nie jest trywialne zadanie, zwłaszcza przy użyciu MacRuby. Spójrz na ramy SecurityFoundation, a to link. Zasadniczo należy wywołać

AuthorizationExecuteWithPrivileges(...) 

z skonfigurowanym AuthorizationRef, ścieżką narzędzia do wykonania, flagami, argumentami. Istnieje przydatny przykład here (w ObjC) pokazujący, jak to działa.

+0

Zaktualizowana odpowiedź. – jtomschroeder

+0

Dzięki! To pomaga! Z tego, co mogę powiedzieć, zablokuje się, aż do skończenia. Czy istnieje sposób na asynchroniczne uruchamianie komendy i aktualizowanie interfejsu użytkownika podczas wyprowadzania każdej linii? – Andrew

+0

Aby zaktualizować asynchronicznie, można użyć _readInBackgroundAndNotify_ lub monitorować StandardOutput w innym wątku. – jtomschroeder

1

można po prostu użyć odwrócone, pojedyncze apostrofy:

output = `cd ~ && ls` 
puts output # or assign to a label, textbox etc. 

Jeśli komenda musi przywileje administratora do uruchomienia, nie będzie uruchomić polecenie w ogóle nie zwróci odpowiedź.

+0

Wygląda na to, że to może zadziałać, ale muszę wymyślić rozwiązanie, które pozwoli mi poprosić użytkownika o podanie hasła. Kiedy uruchamiam z wiersza poleceń, czasami, w połowie skryptu, spróbuje zrobić coś, co wymaga uprawnień administratora, więc monituje użytkownika o hasło. – Andrew

+0

Jak o próbie odczytu chronionego pliku systemowego wewnątrz metody target-c main() tuż przed macruby_main(). To wymusi autoryzację. – SeanNieuwoudt

Powiązane problemy