4

我正在尝试使用 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但是,由于命令,它不起作用。我怎样才能解决这个问题?

4

2 回答 2

1

不幸的是,你不能。因为没有办法输入密码。

但是,您仍然可以使用NSAppleScript而不是运行您的 bash 命令NSTask: 编写一个 applescript,如:

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!"); 
}
于 2013-03-24T11:30:10.193 回答
0

阅读 Apple 的安全编码指南并遵循安全提升权限的建议。

换句话说,不要使用sudo或类似的东西。用于SMJobBless()安装和启用您的启动代理。另请参阅SMJobBless 示例项目

于 2013-03-24T11:59:11.950 回答