如何从Mac/MacRuby应用程序运行Shell命令?

5

我想编写一个小的MacRuby状态栏应用程序,该应用程序从命令行运行一个命令并显示输出。我不知道如何做到这一点。如何从我的Mac应用程序中实现呢?

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


你的脚本究竟是做什么的? - ghstcode
最终,它将成为vagrant的GUI包装器。因此,我需要运行vagrant up并查看输出。 - Andrew
2个回答

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框架和这个链接。基本上,您需要调用

AuthorizationExecuteWithPrivileges(...)

通过已配置的AuthorizationRef、要执行的工具路径、标志和参数来运行工具。这里有一个有用的例子(使用ObjC),展示了这个过程如何工作。


谢谢!这很有帮助!据我所知,这将会阻塞直到完成。有没有一种方法可以异步运行命令并在每行输出时更新UI? - Andrew
要异步更新,您可以使用 readInBackgroundAndNotify 或在另一个线程中监视 StandardOutput。 - jtomschroeder

1
您可以简单地使用反引号:
output = `cd ~ && ls`
puts output # or assign to a label, textbox etc.

如果您的命令需要管理员权限才能运行,它将根本不会运行该命令,并且不会返回任何响应。

看起来这可能有效,但我需要想出一个解决方案,允许我提示用户输入密码。当我从命令行运行时,有时候在脚本进行到一半时,它会尝试执行需要管理员权限的操作,因此会提示用户输入密码。 - Andrew
在macruby_main()之前的objective-c main()方法中尝试读取受保护的系统文件,这样可以强制进行授权。 - ghstcode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接