尽管自Mac OS X Leopard以来API已经打开,但令人惊讶的是,很少有关于如何正确使用SMJobBless()创建特权助手工具的文档.即使直接从Apple的示例项目中复制代码,也会有很多问题.幸运的是,我已经找到了解决这个问题的方法,并且已经为我的帮助工具工作奠定了基础.
但是,它似乎SMJobBless()只是祝福工具并将其复制,但不会运行它.我已经包括在我的帮助工具的代码main()功能应该运行,但不会(因为NSLog()莫名其妙地不工作,根据我的信息点点已经发现-我试图syslog()荷兰国际集团的一些"世界,你好"类型的字符串,但系统控制台上没有任何内容.没有任何迹象表明辅助工具完全启动.
文档大多没用.它简单地说,在SMJobBless()调用之后,辅助工具是"准备好的",没有任何"准备好"的指示.
此外,Apple的示例不包含任何进程间通信代码,也没有解释应该如何与辅助工具进行交互.你使用分布式对象吗?马赫口?谁知道?关于如何做到这一点,没有官方的说法.
那么,有没有人知道如何完成这项工作?我已经确认已经安装了帮助工具,并且身份验证工作正常,但我根本无法弄清楚如何启动帮助工具并与之通信 - 文档中存在这样的差距,这对于现在来说这是一个谜.这非常令人沮丧; 我不可能是唯一一个有这个问题的人(但在任何地方都没有提到它),并且SMJobBless()显然在某种程度上起作用,因为它是Apple使用的.
(请不要提AuthorizationExecuteWithPrivileges().我没有使用它:它已被弃用,肯定会消失,并且是一个主要的安全漏洞.不,谢谢.)
我正在开发一个需要使用dd的应用程序(我在应用程序包中使用shell脚本执行此操作,从应用程序本身收集参数,进行一些检查然后启动dd).
要进行此操作,我需要使用root调用dd,我已经在StackOverflow上查看了几个解决方案.最简单的实现在我看来这个http://www.sveinbjorn.org/STPrivilegedTask
问题是我的NSTask进行了一些复杂的读/写操作(不存在于STPrivilegedTask中),并且不需要全部特权.
所以我在c中编写了一个小帮手工具,用我的应用程序中的正确参数调用我的脚本.我认为解决方案是使用STPrivilegedTask来启动我的小助手工具,所以我可以用root启动它(以及我的脚本和dd),并且在成功启动后不久我将帮助工具设置为非SUID(如果有任何错误,在app退出,应用程序启动等,我也会这样做...更安全).
我实现它并且工作得很好,也许它并不完美,但我认为完全在捆绑中,并且在SUID中使用辅助工具只是为了发射声音足够安全.
有什么想法吗?
谢谢!