Перечислите файлы, к которым получает доступ программа

htop большая замена к top. Это имеет... Цвета! Простые сочетания клавиш! Прокрутите список с помощью клавиш со стрелками! Уничтожьте процесс, не уезжая и без того, чтобы принимать во внимание PID! Mark несколько процессов и уничтожьте их всех!

Среди всех функций в странице справочника говорится, что можно нажать F для следования за процессом.

Действительно, необходимо попробовать htop. Я никогда не запускал top снова, после первого раза я использовал htop.

Отобразите единственный процесс:

htop -p PID

65
29.05.2014, 21:49
7 ответов

Я сдался и кодировал свой собственный инструмент. Заключить в кавычки из его документов:

SYNOPSIS
    tracefile [-adefnu] command
    tracefile [-adefnu] -p pid

OPTIONS
    -a        List all files
    -d        List only dirs
    -e        List only existing files
    -f        List only files
    -n        List only non-existing files
    -p pid    Trace process id
    -u        List only files once

Это только производит файлы, таким образом, Вы не должны иметь дело с выводом от strace.

https://gitlab.com/ole.tange/tangetools/tree/master/tracefile

55
27.01.2020, 19:32

Можно проследить системные вызовы с strace, но существует действительно неизбежный штраф скорости. Необходимо работать strace как базируются, если команда работает с поднятыми полномочиями:

sudo strace -f -o foo.trace su user -c 'mycommand'

Другой метод это, вероятно, будет быстрее, должен предварительно загрузить библиотеку, которая переносит функции доступа к файловой системе: LD_PRELOAD=/path/to/libmywrapper.so mycommand. LD_PRELOAD переменная среды не будет передана программам, вызванным с поднятыми полномочиями. Необходимо было бы написать код той библиотеки-оболочки (вот пример от “Создания переходников библиотеки для забавы и прибыли”); я не знаю, существует ли имеющийся в сети повторно используемый код.

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

loggedfs -c my-loggedfs.xml /logged-view
mycommand /logged-view/somedir

Для конфигурирования LoggedFS запустите с демонстрационной конфигурации, поставленной с программой, и считайте синтаксис конфигурационного файла LoggedFS.

Другая возможность является контрольной подсистемой Linux. Удостоверьтесь auditd демон запускается, затем настройте то, с чем Вы хотите зарегистрироваться auditctl. Каждая зарегистрированная операция зарегистрирована в /var/log/audit/audit.log (на типичных дистрибутивах). Начинать наблюдать конкретный файл:

auditctl -a exit,always -w /path/to/file

При помещении часов на каталог за файлами в нем и его подкаталогах рекурсивно также наблюдают. Заботьтесь для не наблюдения каталога, содержащего контрольные журналы. Можно ограничить вход определенными процессами, видеть auditctl страница справочника для доступных фильтров. Необходимо быть корнем для использования системы аудитов.

28
27.01.2020, 19:32
  • 1
    LD_PRELOAD также не будет работать над статическими двоичными файлами. –  David Given 17.05.2016, 23:41

Я думаю, что Вы хотите lsof (возможно переданный по каналу к grep на программе, и это - дети). Это скажет Вам каждый файл, к этому в настоящее время получают доступ в файловой системе. Для получения информации о которых файлах, к которым получает доступ процесс (отсюда):

lsof -n -p `pidof your_app`
7
27.01.2020, 19:32
  • 1
    Но это только дает мне снимок. То, в чем я нуждаюсь, - то, к каким файлам это пыталось получить доступ. Думайте о ситуации, где программа отказывается запускаться, потому что она говорит "Недостающий файл". Как я выясняю, какой файл это искало? –  Ole Tange 22.08.2011, 15:21

Я пробовал tracefile. Для меня он дал гораздо меньше совпадений, чем мой strace... | sed... | sort -u. Я даже добавил -s256в командную строку strace(1), но это мало помогло...

Затем я попробовал loggedfs. Сначала это не удалось, так как у меня не было доступа для чтения/записи к каталогу, который я пытался зарегистрировать с его помощью. После выполнения chmod 755 временно я получил несколько попаданий...

Но, на мой взгляд, лучше всего работает следующее:

inotifywait -m -r -e OPEN /path/to/traced/directory

А затем выполнить постобработку вывода после запуска интересующего процесса.

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

РЕДАКТИРОВАТЬ :inotifywait не перехватывает доступ к символической ссылке (только цели после разрешения символических ссылок ). Меня это поразило, когда я архивировал библиотеки доступны программе для будущего использования. Использовал дополнительный хакерский подход perl glob выбрать символические ссылки в уведомленных библиотеках, чтобы получить задание сделано в этом конкретном случае.

EDIT2 :по крайней мере, при inotification файлов и самих символических ссылок из командной строки inotifywait (например. Вывод inotifywait -m file symlinkилиinotifywait symlink file)покажет доступ к тому, какой из них находится первым в командной строке (, независимо от того, к какому fileиз symlinkосуществляется доступ ). inotifywait не поддерживает IN _DONT _FOLLOW --, который, когда Я пытался программно просто увидеть доступ к file(, который может, а может и не быть, как можно было ожидать... )независимо от порядка в командной строке

3
27.01.2020, 19:32

Хотя, возможно, это еще не дает вам достаточного контроля (? )Я написал программу, которая хотя бы частично удовлетворяет ваши потребности, использование fanotify и unshare ядра linux -для мониторинга только файлов, измененных (или прочитанных )определенным процессом и его дочерними процессами. По сравнению со strace это довольно быстро (;

Его можно найти наhttps://github.com/tycho-kirchner/shournal

Пример на оболочке:

$ shournal -e sh -c 'echo hi > foo1; echo hi2 > foo2'
$ shournal -q --history 1
  #...
  Written file(s):                                                                                                                                                                              
 /tmp/foo1 (3 bytes) Hash: 15349503233279147316                                                                                                                                             
 /tmp/foo2 (4 bytes) Hash: 2770363686119514911    
2
27.01.2020, 19:32

Для моих нужд этого достаточно:

strace [program] 2>&1 | grep 'openat'

Например:

$ strace sensors 2>&1 | grep 'openat'
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3                 
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libsensors.so.5", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3  
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3  
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3   
openat(AT_FDCWD, "/sys/class/i2c-adapter", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 
openat(AT_FDCWD, "/sys/class/i2c-adapter/i2c-3/name", O_RDONLY) = 4  
...        

Не совсем понимаю, почему все закончили -усложнять это

1
23.05.2020, 12:51

strace -f -e open [команда] 2>&1

0
09.07.2020, 20:15

Теги

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