gpt4 book ai didi

objective-c - 使用 Objective C 更新根 Crontab

转载 作者:行者123 更新时间:2023-12-03 17:48:45 25 4
gpt4 key购买 nike

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

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

我创建了一个示例 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 而无需每次都进行提示,除非在安装过程中进行一次,或者如果不可能,则在安装后首次运行应用程序时进行一次?

最佳答案

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 不支持。

关于objective-c - 使用 Objective C 更新根 Crontab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35452209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com