如何从bash脚本调用系统open

时间:2016-12-21 20:17:02

标签: bash macos shell

我已将系统调用挂钩到typedef int (*orig_open_f_type)(const char *__file, int __oflag, ...);,因此,无论何时打开文件,我的代码都会在将事件传递给系统之前获取该事件。我创建了一个动态库来覆盖open调用并使用DYLD_INSERT_LIBRARIES注入此库 - 在Mac机器上工作并使用XCode。这是一个标准步骤,使我能够挂钩电话。

现在,我有bash脚本,其中有一些我要打开的文件。我尝试了xdg-opencatexec - 但他们没有触发系统调用来打开文件。

我应该如何在bash脚本中调用此公开调用?

请注意,我已通过在C代码中打开文件来测试我的open调用挂钩。

3 个答案:

答案 0 :(得分:3)

我相信你违反了Apple的SIP(系统完整性保护),该系统旨在阻止人们使用系统提供的可执行文件执行此类操作。 SIP被添加到Mac OS X El Capitan(10.11)并继续在macOS Sierra(10.12)。

要证明这是否是问题,请考虑将/bin/cat复制到/usr/local/bin/cat,然后尝试挂钩(运行)本地副本。你可能会在那里侥幸逃脱。这个'解决方法'纯粹是出于演示目的。基本上,如果我是对的,那么SIP就是Apple的说法,而不是去搞乱我们的软件"。

您可以关注Can Mac OS X El Capitan run software compiled for Yosemite that expects libraries in /usr/gnu/lib?中的链接,了解有关SIP的更多信息。通过What is the "rootless" feature in El Capitan, really?上的Ask Different链接到System Integrity Protection上的博客文章,它明确说明:

  

运行时保护

     

SIP的保护不仅限于保护系统免受文件系统更改的影响。还有系统调用,现在它们的功能受到限制。

     
      
  • task_for_pid()/ processor_set_tasks()因EPERM
  • 而失败   
  • 在exec(2)
  • 上重置Mach特殊端口   
  • dyld环境变量被忽略
  •   
  • DTrace探测器不可用
  •   
     

但是,SIP不会阻止开发人员在开发过程中检查自己的应用程序。 Xcode的工具将继续允许在开发过程中检查和调试应用程序。

     

有关详细信息,建议您查看Apple’s developer documentation for SIP

强调增加

基本上,这意味着您无法挂断对系统目录中安装的Apple提供的软件的open()系统调用的调用。你需要重新考虑你想要做的事情。

答案 1 :(得分:2)

运行任何处理文件的正常命令(如cat)将导致文件被open编辑。您还可以使用shell语法打开文件(并立即关闭它):

: < /path/to/file

如果你的系统调用挂钩没有被调用,那么你的钩子肯定有问题 - 如果没有打开文件,这些命令就无法工作。唉,你还没有解释你是如何实现你的钩子的,所以我们无法调试它。

答案 2 :(得分:-1)

file命令打开文件以查看其内容。

$ file /path/to/file

我建议这样做是因为它最终导致系统调用打开,可以使用strace确认。

$ strace file /path/to/file 2>&1 | grep open

我认为使用file的一个好处是它以只读模式打开文件。与其他想法相比,与cat不同,它不必遍历整个文件,只是其中的一部分,因此使用file的时间复杂度可能是不变的。与某人建议的vim不同,file将在完成时返回,而不像文本编辑器那样阻止。