【问题标题】:Run sudo command from objective-c从objective-c运行sudo命令
【发布时间】:2014-12-08 14:21:34
【问题描述】:

如何从 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 签名。

【问题讨论】:

  • 是的,您需要获得授权。这是你的问题吗?
  • 您是尝试以 root 身份运行命令,还是实际上尝试通过 sudo 命令使用它?如果您想通过sudo,您需要拥有/etc/sudoers 中拥有该进程的用户的权限。
  • 我要执行命令:“sudo discoveryutil udnsflushcaches”来清理DNS缓存。
  • 是的,我需要获得授权。但是如何使用授权来执行命令。

标签: objective-c


【解决方案1】:

你应该学习Authorization Services Programming Guide,但如果你想使用sudo来做这件事,你可以。

sudo 需要一个密码来授权执行,它通常从 终端 获取 - 这与标准输入相同,尽管在命令中shell 默认情况下标准输入也连接到终端。 sudo-S 选项指示它从标准输入读取密码。

按照您现有的设计,您可以:

1) 将-S 添加到sudo 命令

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

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

HTH

【讨论】:

  • 指南开头是:“重要提示:应用沙箱中不支持授权服务 API,因为它允许权限提升。”我的应用程序是一个沙盒。
  • 如果您在沙箱中,那您就不走运了 - 尝试调用 sudo 应该会失败,因为您调用的任何其他应用程序都会继承您的应用程序沙箱限制。你要么不需要沙箱化你的应用,要么找到一种非特权的方式来实现你的目标。
  • 非常感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 2013-01-13
  • 2012-07-29
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
相关资源
最近更新 更多