Есть ли простой способ протоколировать все выполненные команды, включая аргументы командной строки?

Я пытаюсь найти, как регистрировать конкретное создание rrdtool чтобы узнать, rrdtool ли путь, который он получает.

Я знаю, что могу обернуть исполняемый файл в сценарий оболочки, который будет регистрировать параметры, но мне было интересно, есть ли для этого больше возможностей для мониторинга ядра, возможно, обратный вызов файловой системы, который видит, когда конкретный / proc / pid / exe соответствует данному двоичному файлу?

Да, есть ядро: подсистема аудита. Демон auditd выполняет регистрацию, а команда auditctl устанавливает правила ведения журнала. Вы можете регистрировать все вызовы для конкретной системы, используя некоторую фильтрацию. Если вы хотите зарегистрировать все выполненные команды и их аргументы, execve системный вызов execve :

 auditctl -a exit,always -S execve 

Чтобы специально отслеживать вызов конкретной программы, добавьте фильтр в исполняемый файл программы:

 auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool 

Журналы отображаются в /var/log/audit.log или везде, где их распределяет. Для управления подсистемой аудита вам необходимо быть root.

Для целей отладки замена программы на скрипт-оболочку дает вам больше возможностей для регистрации таких вещей, как среда, информация о родительском процессе и т. Д.

Вы можете использовать snoopy .

Snoopy – это более легкое решение, так как оно не требует сотрудничества с ядром. Все, что требуется, – это динамический загрузчик (dl), который предварительно загружает библиотеку snoopy, путь к которой указан в /etc/ld.so.preload .

Раскрытие информации: Я являюсь постоянным наблюдателем.