2011-12-19 89 views
5

我想写一个小的MacRuby状态栏应用程序,从命令行运行一个命令并显示输出。我不知道该怎么做。我怎样才能从我的Mac应用程序做到这一点?如何从Mac/MacRuby应用程序运行shell命令?

更新:可能需要做的另一件事是请求管理员密码。有时当我从命令行运行这个脚本时,它会询问我的密码。我不知道如何提示用户输入密码(或者嵌入shell以便直接输入密码)。

+0

你的脚本到底做了什么? – SeanNieuwoudt 2011-12-19 19:27:30

+0

最终,它将成为[vagrant](http://vagrantup.com)的GUI包装。所以我需要运行'vagrant up'并查看输出。 – Andrew 2011-12-19 19:33:53

回答

6

使用Cocoa和MacRuby,利用NSTask。例如执行LS -la并打印输出:

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 

不幸的是,包括管理权限并非易事,尤其是使用的MacRuby。看看SecurityFoundation框架,并且这个link。实质上,您需要致电

AuthorizationExecuteWithPrivileges(...) 

带有配置的AuthorizationRef,要执行的工具路径,标志,参数。有一个有用的示例here(在ObjC中)显示了这是如何工作的。

+0

已更新的答案。 – jtomschroeder 2012-02-16 15:38:56

+0

谢谢!这有帮助!从我所知道的情况来看,这会阻塞,直到完成。有没有办法异步运行命令并更新用户界面作为每一行输出? – Andrew 2012-02-16 16:39:04

+0

要异步更新,可以使用_readInBackgroundAndNotify_或在另一个线程中监视StandardOutput。 – jtomschroeder 2012-02-16 18:02:17

1

你可以简单地使用反引号:

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

如果你的命令需要管理员权限才能运行,它不会在所有运行该命令,不会返回响应。

+0

看起来它可能会工作,但我需要想出一个解决方案,允许我提示用户输入密码。当我从命令行运行时,有时在脚本的中途运行,它会尝试执行一些需要管理员权限的操作,因此它会提示用户输入密码。 – Andrew 2011-12-19 19:38:54

+0

如何尝试在macruby_main()之前读取objective-c main()方法中的受保护系统文件。这将强制授权。 – SeanNieuwoudt 2011-12-19 20:36:34

相关问题