来自可可的sudo chmod命令

时间:2013-11-19 01:38:14

标签: cocoa popen sudo nstask

我想从我的Cocoa项目中运行以下命令。 (隐藏聚光灯图标)

sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search

我找到了两种方法来调用命令并获得以下输出

1)使用NSTask

NSTask *writeTask = [[NSTask alloc] init];
[writeTask setLaunchPath:@"/bin/chmod"];

[writeTask setArguments: @[@"755",@"/System/Library/CoreServices/Search.bundle/Contents/MacOS/Search"]];

[writeTask launch];

>>chmod: Unable to change file mode on /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search: Operation not permitted

2)管道

NSString *command = @"sudo chmod 755/System/Library/CoreServices/Search.bundle/Contents/MacOS/Search";
fp = popen([command UTF8String], "r");

>>sudo: no tty present and no askpass program specified

我还没有找到一种方法如何在超级用户模式下运行任何这些。如何提示用户输入密码并最终使用所需权限运行此命令?

3 个答案:

答案 0 :(得分:2)

在10.7之前,您可以使用AuthorizationExecuteWithPrivileges()执行具有权限的任务。但是,这在10.7中已被弃用,Apple建议使用ServiceManagement框架来执行特权任务。

  

SMJobBless演示了如何安全地安装辅助工具   执行特权操作以及如何将工具与a关联   调用它的应用程序。

     

SMJobBless使用Mac中引入的ServiceManagement.framework   OS X v10.6 Snow Leopard。

     

从Snow Leopard开始,这是管理权限的首选方法   在Mac OS X上升级,应该使用而不是更早   诸如BetterAuthorizationSample或直接调用等方法   AuthorizationExecuteWithPrivileges。

Apple的sample code

答案 1 :(得分:1)

使用Apple Script Editor撰写以下苹果脚本,并将其保存在.scpt文件中。

do shell script "sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search" with administrator privileges

现在将此文件添加到您的包中。

然后从程序中调用此脚本,请使用以下代码:

- (void) runEmbeddedScriptFile: (NSString*)fileName
{
    NSString* path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"scpt"];
    NSURL* url = [NSURL fileURLWithPath:path];
    NSDictionary* errors = [NSDictionary dictionary];
    NSAppleScript* appleScript = [[NSAppleScript alloc] initWithContentsOfURL:url error:&errors];
   [appleScript executeAndReturnError:nil];
   [appleScript release];
}

这将提示用户输入密码。

答案 2 :(得分:0)

您需要使用Authorization Services获取root权限,然后使用sys / stat.h中的chmod()