Вы можете использовать API fanotify для прослушивания всех открытий файлов в данной файловой системе. Информация предоставляется в виде потока структур событий, которые включают дескриптор файла, который предоставляет имя открываемого файла и идентификатор процесса запрашивающей стороны.
Ваша программа может разрешить или отклонить открытие, что означает, что она может искать pid в / proc
, чтобы найти команду и пользователя, выполняющего открытие, прежде чем разрешить его продолжение, без возможности состояние гонки.
На странице руководства fanotify (7) представлена полная программа на C для получения событий и обработки открытых запросов, поэтому вам просто нужно добавить несколько дополнительных строк, чтобы получить нужные данные из / proc
. Обратите внимание: вы получите события для всех файлов во всей точке монтирования, поэтому проверьте свой код на специально смонтированной небольшой файловой системе.
Команда fatrace
показывает, как получить часть этой информации в простом тесте. Например, скопируйте / bin / bash
в / tmp / bash
, затем напишите небольшой скрипт ~ / test2
с
#!/tmp/bash
pwd
и запустите fatrace
только в файловой системе / tmp
(при условии, что это отдельное монтирование tmpfs) с помощью параметра -c
для прослушивания файловой системы текущего каталога и -f O
для прослушивания открытий:
cd /tmp
sudo fatrace -c -f O
Теперь, когда вы запустите
sh -c 'echo $$; ~/test2'
expect -c 'spawn /home/meuh/test2'
~/test2
, вы должны увидеть зарегистрированный
sh(7360): RO /tmp/bash
expect(7414): RO /tmp/bash
bash(7590): RO /tmp/bash