【问题标题】:NSTask run scriptNSTask 运行脚本
【发布时间】:2012-05-08 14:53:30
【问题描述】:

我正在尝试使用 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 命令,它不起作用。我该如何解决这个问题?

【问题讨论】:

  • 在非控制台环境中使用sudo 不是很有用,因为没有简单的方法来输入密码(是的,您可以使用标准输入管道,但最好使用 OS X 的内置升级实用程序)。其次,我猜 sudo 没有被sh 加载,因为它没有加载路径。

标签: objective-c nstask


【解决方案1】:

很遗憾,你不能。因为没有办法输入密码。

但是,您仍然可以使用 NSAppleScript 而不是 NSTask 来运行 bash 命令: 写一个像这样的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!"); 
}

【讨论】:

    【解决方案2】:

    阅读 Apple 的 Secure Coding Guide 并遵循 Elevating Privileges Safely 的建议。

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

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多