3

strace позволяет отслеживать активность конкретной программы. Как я могу контролировать активность всех программ (кроме 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 /'`

Примечание: использование этого может заморозить вашу систему.

Есть ли лучший способ сделать это?

2 ответа2

1

Это не очень выполнимо "вывести всю систему" из пространства пользователя. Как я указывал в предыдущем вопросе, который вы задали, лучший способ - использовать инфраструктуру трассировки в режиме ядра, такую как kprobes , systemtap или dtrace . Вы смотрели на что-нибудь из этого? Есть ли причина, по которой ни один из них не подойдет для вашего варианта использования?

Единственный способ действительно надежно отделить всю систему от пространства пользователя - начать трассировку с процессом init ... но я не уверен, что init или systemd были бы очень рады, если бы вы использовали его, так как это очень низкоуровневый материал, который довольно хрупок и его легко сломать (и, к тому же, сложно внедрить в него команды-оболочки).

Вот почему механизмы проверки самого высокого качества имеют некоторый тип модуля ядра, потому что ядро "видит все". Это особенно актуально, так как вы пытаетесь отслеживать активность на символьных устройствах, таких как /dev/console и /dev/tty* , а ядро имеет прямой контроль над вызовами к этим устройствам, поскольку они реализованы в пространстве ядра.

1

Самый простой способ с systemtap это что-то вроде:

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

(@Vi, ручная работа модуля ядра не требуется; systemtap делает это для себя. Вам нужны доступные файлы для разработки модулей ядра.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .