从objective-c运行sudo命令

时间:2014-12-08 14:21:35

标签: objective-c

如何从objective-c运行sudo命令?我可以使用以下方法运行不需要sudo的简单命令:

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];

NSArray *arguments = [NSArray arrayWithObjects:@"-c" ,[NSString stringWithFormat:@"%@", cmd], nil];


NSLog(@"run command: %@",cmd);
[task setArguments: arguments];

NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[task launch];

NSData *data;
data = [file readDataToEndOfFile];

NSString *output;
output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
return output;

当我运行sudo命令时,我收到错误:不允许操作。

根据我在网上找到的内容,我需要获得授权。我阅读了Apple的授权文档,但我没有说明一个说明点。

Apple的示例EvenBetterAuthorizationSample不起作用。

该应用程序使用Apple ID签名。

1 个答案:

答案 0 :(得分:2)

您应该学习Authorization Services Programming Guide,但如果您想使用sudo来学习,可以。

sudo需要的密码是授权执行,通常是从终端获取 - 与标准输入相同但在命令shell默认情况下标准输入也连接到终端。 -S的{​​{1}}选项指示它从标准输入中读取密码。

按照现有设计,您可以:

1)将sudo添加到-S命令

2)密码提示和任何错误消息(如无效密码)将由sudo写入标准错误。创建管道并将其附加到任务sudo,或将现有管道附加到standardErrorstandardOutput,以捕获此输出。

3)创建另一个管道并将其附加到任务standardError。写入密码后跟换行符到该管道。当任务运行standardInput时,将读取密码并执行您的命令。当然,如果命令本身需要也可以从管道读取的输入 - 那么你必须将它写入管道。

HTH

相关问题