Есть ли способ точно узнать, к каким файлам обращается команда?

Есть ли способ точно узнать, к каким файлам обращается команда?

Я работаю над программным обеспечением, которое требует от меня знать, к каким файлам и ресурсам обращается тот или иной запущенный процесс.

Я не собираюсь отслеживать, к чему обращается каждый скрипт, приложение и демон, а только определенный процесс, запущенный пользователем.

Есть ли способ сделать это на Python (или на любом другом языке, если на то пошло)? Я собираюсь провести собственное исследование, просто подумал, что спрошу здесь, вдруг есть знающие пользователи, которые разбираются в таких вещах и могут дать немного больше объяснений.

решение1

Вы можете проследитьсистемные вызовычто делает программа. Это обычный метод узнать, к каким файлам она обращается. Инструмент, который это делает, называетсяtrussво многих системах Unix,dtrussна OSX,straceна Linux. Я опишу использование Linux здесь; для других систем смотрите руководство.

Самая простая форма —

strace myprogram arg1 arg2

Это выведет журнал всех системных вызовов, выполненных myprogram. (Пример.) Чтобы сохранить журнал в файле, используйте параметр -o. Чтобы также регистрировать вызовы, выполненные подпроцессами, используйте параметр -f. Чтобы выбрать, какие системные вызовы регистрировать, используйте параметр -e. Подробную информацию о том, что можно использовать в качестве аргумента для , см. в руководстве -e. Например, следующий вызов регистрирует системные вызовы, связанные с файлами (открытие и закрытие, листинг каталогов и т. д.), за исключением readи write.

strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2

решение2

В соответствии сэта почта, вы можете сделать это в Python, используяpsutilмодуль. Если вы не ограничены питоном, тоlsofислед— две утилиты командной строки, наиболее часто используемые для этой цели.

решение3

Единственный полностью надежный способ сделать это — отследить системные вызовы. Программа strace(упомянутая @gowenfawr) делает это правильно и реализована в терминах ptrace(2)системного вызова. Однако следует отметить, что ptraceвызов трудно использовать правильно; если вы не можете использовать его strace -e openнапрямую, рассмотрите второй способ:

Для большинства процессов вы можете вместо этого перехватывать вызовы openфункции библиотеки C через LD_PRELOAD. ЭтотривиальныйОднако для вредоносной программы на языке C это можно обойти; но если вы уверены, что программа сама не будет выполнять системные вызовы, это реализовать проще, чем программно ptrace.

Для процесса, который, как вы знаете, написан на языке более высокого уровня, таком как Python, вы можете вместо этого перехватывать высокоуровневые openвызовы, но это, вероятно, будет сложнее, чем перехват вызовов уровня C, если только язык не был разработан с поддержкой такого перехвата (Python не поддерживает).

Наконец - все вышеприведенные параграфы предполагают, что файлы открываются с помощью open. Это не всегда верно, есть также openat, open64, recvmsgвспомогательные данные и унаследованные дескрипторы файлов от родителя.

Связанный контент