如何从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签名。
答案 0 :(得分:2)
您应该学习Authorization Services Programming Guide,但如果您想使用sudo
来学习,可以。
sudo
需要的密码是授权执行,通常是从终端获取 - 不与标准输入相同但在命令shell默认情况下标准输入也连接到终端。 -S
的{{1}}选项指示它从标准输入中读取密码。
按照现有设计,您可以:
1)将sudo
添加到-S
命令
2)密码提示和任何错误消息(如无效密码)将由sudo
写入标准错误。创建管道并将其附加到任务sudo
,或将现有管道附加到standardError
和standardOutput
,以捕获此输出。
3)创建另一个管道并将其附加到任务standardError
。写入密码后跟换行符到该管道。当任务运行standardInput
时,将读取密码并执行您的命令。当然,如果命令本身需要也可以从管道读取的输入 - 那么你必须将它写入管道。
HTH