2011-12-19 18 views
5

Estoy tratando de escribir una pequeña aplicación de barra de estado MacRuby que ejecuta un comando desde la línea de comando y muestra el resultado. No se como hacer esto. ¿Cómo puedo hacer esto desde mi aplicación Mac?¿Cómo ejecutar comandos de shell desde una aplicación Mac/MacRuby?

Actualización: La otra cosa que podría necesitar hacer es pedir una contraseña de administrador. A veces, cuando ejecuto este script desde la línea de comando, solicita mi contraseña. No sé cómo solicitaría al usuario su contraseña (o incrusta el shell para que puedan escribirlo directamente).

+0

¿Qué hace exactamente tu script? – SeanNieuwoudt

+0

Eventualmente, va a ser un contenedor GUI para [vagabundo] (http://vagrantup.com). Así que tendré que ejecutar 'vagrant up' y ver la salida. – Andrew

Respuesta

6

Usando Cocoa y MacRuby, utilice NSTask. Ejemplo que ejecuta ls -la salida y grabados:

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 

Desafortunadamente, incluyendo los privilegios de administrador no es una tarea trivial, especialmente usando MacRuby. Eche un vistazo al marco de SecurityFoundation, y este link. En esencia, es necesario llamar a

AuthorizationExecuteWithPrivileges(...) 

con un AuthorizationRef configurado, trayectoria de la herramienta para ejecutar, banderas, los argumentos. Hay un ejemplo útil here (en ObjC) que muestra cómo funciona esto.

+0

Respuesta actualizada. – jtomschroeder

+0

¡Gracias! ¡Eso ayuda! Por lo que puedo decir, esto se bloqueará hasta que termine. ¿Hay alguna manera de ejecutar asincrónicamente el comando y actualizar la UI a medida que se genera cada línea? – Andrew

+0

Para actualizar de forma asincrónica, puede usar _readInBackgroundAndNotify_ o supervisar StandardOutput en otro hilo. – jtomschroeder

1

Usted puede simplemente utilizar acentos abiertos:

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

Si el comando necesita privilegios de administrador para ejecutar, no se ejecutará el comando en absoluto y no va a devolver una respuesta.

+0

Parece que podría funcionar, pero necesito encontrar una solución que me permita pedirle al usuario una contraseña. Cuando corro desde la línea de comandos, a veces, a la mitad del guión, intentará hacer algo que requiera privilegios de administrador, por lo que pedirá al usuario la contraseña. – Andrew

+0

¿Qué tal si intentas leer un archivo de sistema protegido dentro de tu método main-c main() justo antes de macruby_main(). Eso forzará la autorización. – SeanNieuwoudt

Cuestiones relacionadas