【问题标题】:Update Root Crontab with Objective C使用 Objective C 更新根 Crontab
【发布时间】:2016-05-28 21:24:34
【问题描述】:

考虑使用需要在 OSX 上以 root 身份运行的命令行应用程序的第三方 SDK。您在 Objective C 中构建了一个 Cocoa 应用程序,并将其安装在 /Applications 中的“root:wheel”(用户:root,组:wheel)所有权下。我已经拥有该文件夹/文件所有权,因为我的安装程序应用程序使用 AppleScript 提示输入 root,然后为此执行 chown 和 chmod。

那么,对于 Cocoa 应用程序更新根的 crontab 以便第三方命令行应用程序在根上下文下运行的首选编程方式是什么?我的意思是,当我运行 Cocoa 应用程序时,它是否在 root 下运行,因为这就是我在安装程序中设置文件所有权的方式?或者,Apple 是否以登录用户身份启动它?如果应用程序在根上下文下运行,那么我猜普通文件 I/O 可以工作。如果,即使我已经安装了具有 root 所有权的 Cocoa 应用程序,它以登录到笔记本电脑的用户身份运行,那么我需要以某种方式升级权限以以 root 身份执行该文件 I/O。而且我想这样做,而不必每次都提示访问钥匙串。

我创建了一个示例 OSX Cocoa 应用程序 (MyApp.app),它在 applicationDidFinishLaunching 类方法中具有以下内容:

std::ofstream outfile;

outfile.open("/tmp/test.txt");
NSString *sUser = NSUserName();
outfile << "\n" << [sUser UTF8String] << "\n";

std::ofstream outfile2;
outfile2.open("/var/at/tabs/root");
outfile2 << "\n#DEMO";

然后我将其复制到 /Applications 并执行chown -R root:wheel /Applications/MyApp.app

当我运行它时,/tmp/test.txt 显示“mike”(不是我希望的 root),并且 /var/at/tabs/root 文件没有附加“#DEMO”。

我猜它没有权限,就像我希望的那样。那么,让我的应用程序能够更新 /var/at/tabs/root 而不提示每次更新的技巧是什么?

【问题讨论】:

  • 看看ServiceManagement Reference(例如SMJobBless)
  • 这个Q不是编程相关的,而是管理相关的。基本上它是“我该怎么做才能运行具有root权限的应用程序?”
  • @AminNegm-Awad 我还不确定。我将尝试一些实验,看看我想出了什么,然后添加到这个问题中。
  • 谁触发了关闭标志,请重新考虑这个问题,因为我已经添加了更好地演示问题的代码。
  • @AminNegm-Awad 是您触发关闭触发器的人,因为您认为这个 Q 与编程无关?如果是这样,请考虑我下面的答案,其中有一个指向代码的链接。

标签: objective-c macos cocoa process elevated-privileges


【解决方案1】:

Apple 推荐的使用您的代码执行此操作的方法是:

http://atnan.com/blog/2012/02/29/modern-privileged-helper-tools-using-smjobbless-plus-xpc/

SMJobBless + XPC

它非常精致。您必须创建一个 XPC 服务,以您需要的权限安装它,以特殊方式安装它,然后向它发送 XPC 消息以使其执行特权任务。它还涉及代码签名,以确保您正在运行以与 XPC 服务通信的应用程序得到正确授权。

因此,XPC 服务将成为更新 /var/at/tabs/root 的服务。也就是说,除非你用另一种方式来做——XPC 服务自己做时钟检查,看看它什么时候需要执行一些事情。

另一种方法是使用SUID,尽管 Apple 不支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2012-12-11
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2010-12-04
    • 2011-11-03
    相关资源
    最近更新 更多