我如何跟踪整个系统?

我如何跟踪整个系统?

斯特拉斯允许您监视特定程序的活动。如何监视所有程序的活动(sshd/bash/strace_itself 除外)?

目前我正在使用这样的黑客技术:

function ppid() { cat /proc/"$1"/status | grep PPid: | grep -o "[0-9]*"; };
function pidtree() { P=$1; while [ "$P" != "1" ]; do echo $P; P=`ppid $P`; done; echo 1; };
strace -fe execve `( pgrep ''; pidtree $$ ) | sort | uniq -u | sed 's/^/-p /'`

注意:使用此功能可能会冻结您的系统。

有没有更好的方法呢?

答案1

使用 systemtap 最简单的方式如下:

stap -e 'probe nd_syscall.* { println(execname(), pid(), " ", pn(), argstr) }'

(@Vi,不需要手动进行内核模块工作;systemtap 可以自行完成。但是,您需要有内核模块开发文件。)

答案2

从用户空间“跟踪整个系统”不太可行。正如我在你之前的问题中指出的那样,最好的方法是使用内核模式跟踪基础架构,例如kprobessystemtapdtrace。你看过其中任何一个吗?有没有理由说它们都不适用于你的用例?

真正可靠地从用户空间跟踪整个系统的唯一方法是从进程开始跟踪init......但我不确定init或者systemd会很高兴你跟踪它,因为它做了很多非常低级的事情,非常脆弱且容易被破坏(而且我想补充一下,在它周围注入包装命令也很难)。

这就是为什么最高质量的探测机制具有某种类型的内核模块,因为内核“看到一切”。这尤其重要,因为您正在尝试监视字符设备(如/dev/console和)上的活动/dev/tty*,并且内核可以直接监督对这些设备的调用,因为它们是在内核空间中实现的。

相关内容