Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run shell commands from a Mac/MacRuby application?

I am trying to write a little MacRuby status bar application that runs a command from the command line and displays the output. I don't know how to do this. How can I do this from my Mac application?

Update: The other thing that it might need to do is ask for an administrator password. Sometimes when I run this script from the command line, it asks for my password. I don't know how I would prompt the user for their password (or embed the shell so they could type it directly).

like image 328
Andrew Avatar asked Dec 19 '11 16:12

Andrew


2 Answers

Using Cocoa and MacRuby, utilize NSTask. Example that executes ls -la and prints output:

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

Unfortunately, including admin privileges is no trivial task, especially using MacRuby. Have a look at the SecurityFoundation framework, and this link. Essentially, you need to call

AuthorizationExecuteWithPrivileges(...)

with a configured AuthorizationRef, path of the tool to execute, flags, arguments. There is a useful example here (in ObjC) showing how this works.

like image 52
jtomschroeder Avatar answered Nov 01 '22 14:11

jtomschroeder


You can simply use backticks:

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

If your command needs admin privileges to run, it won't run the command at all and won't return a response.

like image 40
ghstcode Avatar answered Nov 01 '22 13:11

ghstcode