我正在尝试以提升的权限运行一个进程 - 特别是 OpenVPN,它需要 root 权限才能将路由添加到系统。
四处寻找现有的例子让我找到了 AuthorizationExecuteWithPrivileges
,它现在似乎已被弃用。
我尝试了新的 SMJobBless
方法,但我对它为此目的的可行性有一些疑问。据我了解,我可以创建一个单独的特权工具并通过套接字与其通信以请求该工具执行特权命令。但是,我似乎无法弄清楚如何启动 OpenVPN 进程并以这种方式实时捕获其标准输出,因为主应用程序本身不会启动该进程。
另一种选择是在 OpenVPN
可执行文件上使用 setuid。我可以使用 SMJobBless
安装的帮助程序来设置可执行文件的文件权限和 setuid,然后通过 NSTask
正常运行它吗?
编辑:
最后,有没有什么方法可以只使用特权运行一个命令而无需永久安装任何东西?虽然这种新方法更安全,但看起来很笨重。
最佳答案
我设法通过使用助手并将其与 XPC 通信(Nathan de Vries's Blog 中显示的方法)来使用 SMJobBless
方法。使用这个助手,我将外部进程的权限设置为 04555(setuid,rx)。然后删除 SMJob,因为不再需要它。本质上模拟“一次性”特权工作。
之后,我能够使用 NSTask 启动进程并在我的主应用程序中捕获其输出。
此外,我在开始时检查是否在可执行文件上正确设置了权限,如果没有,则重新启用 SMJob 助手并设置权限。
如果有人有更简洁的解决方案,请随时分享。谢谢!
关于objective-c - 运行具有提升权限的进程 OS X 10.7 & 10.8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11497806/