为什么我不能跟踪 `/bin/echo` 发出的系统调用?

Why can't I trace syscalls made by `/bin/echo`?

我想知道 echo(命令,而不是 shell 内置)进行了哪些系统调用,所以我决定通过 dtrace 窥探它。具体来说,我使用了 dtruss.

考虑以下工作(跟踪 sed 进行的所有系统调用):

 sudo dtruss /usr/local/bin/sed 's/a/e/' <<< 'cat'
SYSCALL(args)        = return
thread_selfid(0x0, 0x0, 0x0)         = 470642 0
# and many more…

但是如果我用 echo 尝试相同的方法,我会得到以下结果:

 sudo dtruss /bin/echo 'cat'
dtrace: failed to execute /bin/echo: unknown error

事实上:有许多个命令导致了这个错误。共同点是这些命令都在 /bin/usr/bin.

Brendan's blog表示可以在ls等命令上使用dtruss(他的例子是sudo dtruss ls -l hfsslower.d,其中hfsslower.d是一个普通的文本文件)。博客 post 写于 2011 年,涉及 Mac OS X。但我知道 OS X 从那时起就进行了各种安全增强。

难道我遇到了 OS 某种 X 安全性?我正在使用 OS X 10.12 Sierra。

我应该尝试搜索错误消息。

Looks like it is indeed System Integrity Protection.

You can no longer attach DTrace to «restricted» processes on your Mac. And by «restricted» I mean every single built-in utility, daemon or application.

我对文章的解读是:

  • csrutil enable --without dtrace 不足以将 DTrace 附加到内置可执行文件
  • 您需要做一个完整的 csrutil disable(这会完全关闭 SIP,这太过分了并且会在您的安全方面造成漏洞,但似乎是唯一的解决方案)