为什么我不能跟踪 `/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,这太过分了并且会在您的安全方面造成漏洞,但似乎是唯一的解决方案)
我想知道 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,这太过分了并且会在您的安全方面造成漏洞,但似乎是唯一的解决方案)