如何沙箱命令行工具?

时间:2012-10-18 17:04:20

标签: cocoa command-line sandbox

我有一个简单的unix工具,我从shell启动主要的cocoa应用程序。

我需要沙箱,但是当我运行它时,它崩溃并出现错误“非法指令:4”,在console.app上我可以看到以下错误消息

  

沙箱创建失败:容器对象初始化失败:NIL   容器信息对象没有visdiff的错误描述

使用codesign正确签名文件。

我已阅读帖子Mac OS app, sandbox with command line tool?,但没有帮助

4 个答案:

答案 0 :(得分:7)

我遇到了这个问题,当我添加了一个嵌入式Info.plist时它就消失了。

尝试使用这些clang标志(假设您在构建目录中有info.plist):

-Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker info.plist

答案 1 :(得分:4)

控制台应用程序是直接从控制台启动还是从主沙盒应用程序调用?我在尝试沙箱一些二进制文件时遇到了类似的错误,我只能使用以下权利使其工作:

<dict>                                                                                                                                                                       
  <key>com.apple.security.app-sandbox</key>                                                                                                                                  
  <true/>                                                                                                                                                                    
  <key>com.apple.security.inherit</key>                                                                                                                                      
  <true/>                                                                                                                                                                    
</dict> 

当然,之后你只能从已经沙盒化的父进程中调用二进制文件(这就是我问你的二进制文件是如何被调用的原因:)。

答案 2 :(得分:1)

虽然@Nick Moore的回答非常好,但在当今的Xcode中,“包装-在Binary中创建Info.plist”部分(CREATE_INFOPLIST_SECTION_IN_BINARY)中有一个选项。所有需要做的就是将thue设置为是。

答案 3 :(得分:0)

如果您使用com.apple.security.inherit签署可执行文件,它似乎只能由另一个已经沙箱化的应用程序调用。因此,在运行codesign后,您无法再从cmdline调用它。