我已将系统调用挂钩到typedef int (*orig_open_f_type)(const char *__file, int __oflag, ...);
,因此,无论何时打开文件,我的代码都会在将事件传递给系统之前获取该事件。我创建了一个动态库来覆盖open
调用并使用DYLD_INSERT_LIBRARIES
注入此库 - 在Mac机器上工作并使用XCode。这是一个标准步骤,使我能够挂钩电话。
现在,我有bash脚本,其中有一些我要打开的文件。我尝试了xdg-open
,cat
,exec
- 但他们没有触发系统调用来打开文件。
我应该如何在bash脚本中调用此公开调用?
请注意,我已通过在C代码中打开文件来测试我的open
调用挂钩。
答案 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
将在完成时返回,而不像文本编辑器那样阻止。