2011-12-19 25 views
5

Tôi đang cố gắng viết một ứng dụng thanh trạng thái MacRuby nhỏ chạy lệnh từ dòng lệnh và hiển thị đầu ra. Tôi không biết làm thế nào để làm điều này. Làm thế nào tôi có thể làm điều này từ ứng dụng Mac của tôi?Làm thế nào để chạy lệnh shell từ ứng dụng Mac/MacRuby?

Cập nhật: Điều khác mà bạn có thể cần làm là yêu cầu mật khẩu quản trị viên. Đôi khi khi tôi chạy tập lệnh này từ dòng lệnh, nó yêu cầu mật khẩu của tôi. Tôi không biết làm thế nào tôi sẽ nhắc người dùng cho mật khẩu của họ (hoặc nhúng vỏ để họ có thể gõ nó trực tiếp).

+0

Kịch bản lệnh của bạn chính xác là gì? – SeanNieuwoudt

+0

Cuối cùng, nó sẽ là một wrapper GUI cho [vagrant] (http://vagrantup.com). Vì vậy, tôi sẽ cần phải chạy 'vagrant up' và xem đầu ra. – Andrew

Trả lời

6

Sử dụng Cocoa và MacRuby, sử dụng NSTask. Ví dụ mà thực hiện ls -la đầu ra và in:

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 

Thật không may, trong đó có đặc quyền quản trị là nhiệm vụ không tầm thường, đặc biệt là sử dụng MacRuby. Hãy xem khung công tác SecurityFoundation và link này. Về cơ bản, bạn cần phải gọi

AuthorizationExecuteWithPrivileges(...) 

với một AuthorizationRef cấu hình, đường dẫn của công cụ này để thực hiện, cờ, lập luận. Có một ví dụ hữu ích here (trong ObjC) cho biết cách hoạt động của nó.

+0

Đã cập nhật câu trả lời. – jtomschroeder

+0

Xin cảm ơn! Những sự giúp đỡ đó! Từ những gì tôi có thể nói, điều này sẽ chặn cho đến khi kết thúc. Có cách nào để chạy không đồng bộ lệnh và cập nhật giao diện người dùng vì mỗi dòng là đầu ra không? – Andrew

+0

Để cập nhật không đồng bộ, bạn có thể sử dụng _readInBackgroundAndNotify_ hoặc theo dõi StandardOutput trong một chuỗi khác. – jtomschroeder

1

Bạn chỉ có thể sử dụng backticks:

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

Nếu lệnh của bạn cần đặc quyền quản trị để chạy, nó sẽ không chạy lệnh ở tất cả và sẽ không trở lại một phản ứng.

+0

Có vẻ như nó có thể hoạt động, nhưng tôi cần đưa ra giải pháp cho phép tôi nhắc người dùng nhập mật khẩu. Khi tôi chạy từ dòng lệnh, đôi khi, nửa chừng kịch bản, nó sẽ cố gắng làm điều gì đó yêu cầu đặc quyền quản trị viên, vì vậy nó sẽ nhắc người dùng nhập mật khẩu. – Andrew

+0

cách cố gắng đọc tệp hệ thống được bảo vệ bên trong phương thức main-c main() của bạn ngay trước macruby_main(). Điều đó sẽ buộc ủy quyền. – SeanNieuwoudt

Các vấn đề liên quan