Перерахуйте файли, до яких звертається програма


64

time - це геніальна команда, якщо ви хочете розібратися, скільки часу займає процесор для даної команди.

Я шукаю щось подібне, яке може перелічити файли, до яких звертається програма та її діти. Або в режимі реального часу, або як звіт після цього.

В даний час я використовую:

#!/bin/bash

strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'

але його не вдається, якщо команда для запуску включає sudo. Він не дуже розумний (було б непогано, якби він міг лише перелічити наявні файли або мали проблеми з дозволом або згрупувати їх у файли, які читаються, та файли, що записуються). Також straceповільно, тому було б добре з швидшим вибором.


Зважаючи на ваше використання strace, я припускаю, що ви спеціально зацікавлені в Linux. Правильно?
Жиль

Linux - це моя головна проблема.
Оле Танге

Відповіді:


51

Я здався і зашифрував власний інструмент. Цитувати його документи:

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


Дякую! вихід strace абсолютно не читабельний. Я не знаю, де знайти документи, хоча - було б непогано, щоб у нього була опція -h / - help. Я також вдячний за варіант, який показує лише редагування файлів, а не доступ.
Xerus

@Xerus Clone gitlab.com/ole.tange/tangetools і запустіть make && sudo make install. Тоді можна бігти man tracefile.
Оле Танге

4
Гарний інструмент. Упакували його, щоб встановити: yum -y install https://extras.getpagespeed.com/release-el7-latest.rpmіyum -y install tracefile
Данила Вершинін

27

Ви можете простежити системні дзвінки strace, але дійсно неминуче покарання за швидкість. Вам потрібно запустити straceяк root, якщо команда працює з підвищеними привілеями:

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головну сторінку доступних фільтрів. Щоб користуватися системою аудиту, вам потрібно мати root права.


LD_PRELOADтакож не працюватиме на статичних бінарних файлах.
Девід Даний

6

Я думаю, що ви хочете lsof (можливо, підключений до програми і це діти). Він розповість вам про кожен файл, до якого зараз доступ у файловій системі. Інформація про те, до яких файлів можна отримати процес ( звідси ):

lsof -n -p `pidof your_app`

11
Але це дає мені лише знімок. Що мені потрібно - це до яких файлів він намагався отримати доступ. Подумайте про ситуацію, коли програма відмовляється запускатись, оскільки там написано "Файл відсутній". Як визначити, який файл він шукав?
Оле Танге

2

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

Тоді я спробував це loggedfs. По-перше, це не вдалося, оскільки я не мав доступу до читання / запису до каталогу, я намагався ввійти в нього. Після тимчасового виконання chmod 755 я отримав кілька хітів ...

Але, як мені здається, найкраще працює таке:

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

А потім післяобробляйте результат після запуску процесу, що цікавить.

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

EDIT: inotifywait не отримує доступ до символьного посилання (лише цілі після усунення посилань). Мене це вразило, коли я архівував бібліотеки, до яких зверталася програма для подальшого використання. Використовували кілька додаткових хакерських програм Perl для вибору символьних посилань уздовж повідомлених бібліотек, щоб виконати роботу в цьому конкретному випадку.

EDIT2: щонайменше, коли ініціація файлів і посилань на них із командного рядка inotifywait (наприклад, inotifywait -m file symlinkабо inotifywait symlink file) вихід буде показувати доступ до якого перший в командному рядку (незалежно fileвід того symlink, до якого з них звертається). inotifywait не підтримує IN_DONT_FOLLOW - який, коли я спробував програматично, просто дозволяє отримати доступ до доступу file(який може бути, а може, і не бути таким, якого ви очікуєте ...) незалежно від порядку в командному рядку


"Для мене це дало набагато менше збігів, ніж моє" Ви можете поділитися прикладом tracefileвідсутності доступу до файлу?
Оле Танге

Я не впевнений, що ви точно запитуєте:) ... Якщо я спробую шукати файли всередині / шлях / до / простежений / каталог / я бачу ВІДКРИТИ у вихідному ініціативному виході ... АЛЕ стат (1) з файлами, здається щоб не отримати результатів у кількох випадках, які я намагався (мені цікаво чому, чи є певне кешування приховування читання вмісту каталогів з виду)
Tomi Ollila

Я коментую повідомлення про фанотизацію нижче (у мене лише 21 репутація, хоча я мав на увазі більше десяти років; вимагати 50 для коментування завжди було для мене перешкодою ...) - фанотизувати це добре, але не можу обійдіть проблему з перенаправленням посилання (тобто у випадку посилань, остаточний файл можна знайти, прочитавши / proc / self / fd / <fd> .. у будь-якому разі +1: відповідь: D
Tomi Ollila

1

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

Її можна знайти на 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    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.