如何从 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 进行签名。
你应该学习授权服务编程指南 https://developer.apple.com/library/mac/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995,但如果你想使用sudo
你可以。
What sudo
需要是授权执行的密码,它通常从terminal- 那是not与标准输入相同,但在命令 shell 中标准输入默认也连接到终端。这-S
的选项sudo
指示它从标准输入读取密码。
按照您现有的设计,您可以:
1) Add -S
to the sudo
command
2) 输入密码的提示以及任何错误信息,例如密码无效,将由sudo
到标准误。创建管道并将其附加到任务standardError
,或将现有管道连接到两者standardOutput
and standardError
,捕获此输出。
3)创建另一个管道并将其附加到任务standardInput
。将密码后跟换行符写入该管道。当任务运行时sudo
将读取密码并执行您的命令。当然,如果命令本身需要输入也将从管道中读取 - 所以您必须将其写入管道。
HTH
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)