Как мне связать всю систему?

1843
Vi.

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 /'` 

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

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

3

2 ответа на вопрос

1
Horn OK Please

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

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

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

Подход модуля ядра не удобен, когда вы хотите просто подключить SSH к какой-либо удаленной системе и запустить мониторинг. Vi. 11 лет назад 0
Хорошо, если вы подключаетесь по SSH к удаленной системе с целью просмотра системных вызовов или вызовов libc всех процессов в системе, я должен предположить, что у вас есть root-доступ, верно? Потому что без рута вы также можете отказаться сейчас, потому что нет ** способа (кроме использования уязвимости безопасности) отследить процессы, которые не принадлежат вашему пользователю, если вы не являетесь пользователем root. И root может загружать модули ядра, так что ......... Horn OK Please 11 лет назад 0
Да, от имени пользователя root, например, чтобы определить, какой процесс пытается открыть какой-либо файл. Решение не обязательно должно подходить для производственных серверов, так же как инструмент разработки или личного использования. Vi. 11 лет назад 0
1
fche

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

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

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

Формат стэпа очень отличается от стрейса. "-e execve" это просто для примера. Мне может понадобиться метка времени, открытые файлы, сокеты и другие вещи. Vi. 11 лет назад 0
Пробовал это: `семантическая ошибка: неразрешенная функция arity-0: идентификатор 'pn' в : 1: 54` Vi. 11 лет назад 0
Vi, попробуйте pp () вместо pn (), если ваша копия stap старше версии 1.3 (два года назад). Вы можете управлять форматом вывода с помощью printf ("..."), добавлять временные метки и т. Д. Я полагаю, что кто-то написал приблизительный сценарий STP-формата. fche 11 лет назад 0
Теперь он показывает «error:` CLONE_STOPPED 'undeclared here »и другие ошибки C. Это в целом более хрупкий способ, и я не ожидаю, что он будет работать из коробки на разных системах. Vi. 11 лет назад 0
(Vi., Пожалуйста, рассмотрите возможность отправки отчета о проблеме в наш список рассылки, .) fche 11 лет назад 0

Похожие вопросы