NSTask运行脚本

时间:2012-05-08 14:53:30

标签: objective-c nstask

我正在尝试使用NSTask运行以下命令:

$sudo launchctl load /Users/admin/Library/LaunchAgents/com.devdaily.crontabtest.plist

以下是我使用的代码:

NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/launchctl"];
[server setArguments:[NSArray arrayWithObjects:@"load",@"com.devdaily.crontabtest.plist",nil]];
[server setCurrentDirectoryPath:@"/Users/admin/Library/LaunchAgents/"];

NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];

[server launch];
[server waitUntilExit]; // Alternatively, make it asynchronous.
[server release];

但是,由于sudo命令,它不起作用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

不幸的是,你不能。因为无法输入密码。

但是,您仍然可以使用NSAppleScript代替NSTask来运行bash命令: 写一个类似的文章:

do shell script [your command] with administrator privileges

系统会要求您输入管理员密码。

示例:

NSDictionary *error = [NSDictionary new]; 
NSString *script =  @"do shell script \"launchctl load /Users/admin/Library/LaunchAgents/com.devdaily.crontabtest.plist\" with administrator privileges";  
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script]; 
if ([appleScript executeAndReturnError:&error]) {
  NSLog(@"success!"); 
} else {
  NSLog(@"failure!"); 
}

答案 1 :(得分:0)

阅读Apple的Secure Coding Guide并按照Elevating Privileges Safely的建议。

换句话说,不要使用sudo或类似的东西。使用SMJobBless()安装并启用启动代理。另请参阅SMJobBless sample project