time
to genialne polecenie, jeśli chcesz dowiedzieć się, ile czasu zajmuje procesor.
Szukam czegoś podobnego, który może wyświetlić listę plików, do których program i jego dzieci mają dostęp. Albo w czasie rzeczywistym, albo jako raport później.
Obecnie używam:
#!/bin/bash
strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
ale kończy się niepowodzeniem, jeśli polecenie do uruchomienia dotyczy sudo
. Nie jest zbyt inteligentny (byłoby miło, gdyby mógł wyświetlać tylko listę istniejących plików, które miały problemy z uprawnieniami lub pogrupować je w odczytywane pliki i zapisywane). strace
Jest również powolny, więc dobrze by było z szybszym wyborem.
files
monitoring
strace
Ole Tange
źródło
źródło
strace
, zakładam, że jesteś szczególnie zainteresowany Linuksem. Poprawny?Odpowiedzi:
Zrezygnowałem i kodowałem własne narzędzie. Cytując z jego dokumentów:
Wysyła tylko pliki, więc nie musisz zajmować się danymi wyjściowymi
strace
.https://gitlab.com/ole.tange/tangetools/tree/master/tracefile
źródło
make && sudo make install
. Potem możesz biecman tracefile
.yum -y install https://extras.getpagespeed.com/release-el7-latest.rpm
iyum -y install tracefile
Możesz śledzić wywołania systemowe
strace
, ale rzeczywiście istnieje nieunikniona kara za prędkość. Musisz uruchomićstrace
jako root, jeśli polecenie działa z podwyższonymi uprawnieniami:Inna metoda to prawdopodobnie szybciej jest przekręceniem biblioteki, który owija się wokół funkcji dostępu do systemu plików:
LD_PRELOAD=/path/to/libmywrapper.so mycommand
.LD_PRELOAD
Zmienna środowiskowa nie zostanie przekazana do programów wywołany z podwyższonymi uprawnieniami. Musiałbyś napisać kod tej biblioteki opakowań ( oto przykład z „Budowania pośredników bibliotek dla zabawy i zysku” ); Nie wiem, czy w sieci dostępny jest kod wielokrotnego użytku.Jeśli monitorujesz pliki w określonej hierarchii katalogów, możesz utworzyć widok systemu plików za pomocą LoggedFS, tak aby wszystkie dostępy przez ten widok były rejestrowane.
Aby skonfigurować LoggedFS, zacznij od przykładowej konfiguracji dostarczonej z programem i przeczytaj składnię pliku konfiguracyjnego LoggedFS .
Inną możliwością jest podsystem kontroli systemu Linux . Upewnij się, że
auditd
demon jest uruchomiony, a następnie skonfiguruj, z czym chcesz się zalogowaćauditctl
. Każda zarejestrowana operacja jest rejestrowana w/var/log/audit/audit.log
(w typowych dystrybucjach). Aby rozpocząć oglądanie określonego pliku:Jeśli umieścisz zegarek w katalogu, pliki w nim i jego podkatalogi będą również rekurencyjnie oglądane. Uważaj, aby nie oglądać katalogu zawierającego dzienniki kontroli. Możesz ograniczyć rejestrowanie do niektórych procesów, zobacz
auditctl
stronę podręcznika dla dostępnych filtrów. Musisz być rootem, aby korzystać z systemu kontroli.źródło
LD_PRELOAD
nie działa również na statycznych plikach binarnych.Myślę, że chcesz lsof (prawdopodobnie dołączony do grepa w programie i to dzieci). Powie ci każdy plik, który jest aktualnie dostępny w systemie plików. Aby uzyskać informacje o tym, do których plików można uzyskać dostęp przez proces ( stąd ):
źródło
Próbowałem tego
tracefile
. Dla mnie dało to znacznie mniej wyników niż moje własnestrace ... | sed ... | sort -u
. Dodałem nawet-s256
dostrace(1)
wiersza poleceń, ale niewiele to pomogło ...Potem spróbowałem
loggedfs
. Po pierwsze nie powiodło się, ponieważ nie miałem dostępu do odczytu / zapisu do katalogu, w którym próbowałem się zalogować. Po tymczasowym zrobieniu chmod 755 dostałem kilka hitów ...Ale dla mnie najlepsze wydaje się wykonanie następujących czynności:
inotifywait -m -r -e OPEN /path/to/traced/directory
A następnie przetwarzaj dane wyjściowe po przetworzeniu interesującego Cię procesu.
Nie łapie to dostępu do procesu procesowego dostępu do katalogu śledzonego ani nie wie, czy jakiś inny proces uzyskał dostęp do tego samego drzewa katalogów, ale w wielu przypadkach jest to wystarczające narzędzie do wykonania zadania.
EDYCJA: inotifywait nie przechwytuje dostępu do dowiązań symbolicznych (tylko cele po rozwiązaniu dowiązań symbolicznych). Uderzyło mnie to, gdy zarchiwizowałem biblioteki, do których program ma dostęp w przyszłości. Użyłem dodatkowej globalnej hackery w Perlu, aby wybrać dowiązania symboliczne wzdłuż powiadomionych bibliotek, aby wykonać zadanie w tym konkretnym przypadku.
EDYCJA 2: przynajmniej podczas powiadamiania samych plików i dowiązań symbolicznych z wiersza poleceń inotifywait (np.
inotifywait -m file symlink
Lubinotifywait symlink file
) pokaże dostęp do tego, który z nich jest pierwszy w wierszu poleceń (niezależnie od tego, któryfile
z nichsymlink
jest dostępny). inotifywait nie obsługuje IN_DONT_FOLLOW - co, gdy próbowałem programowo, pozwala tylko zobaczyć dostępfile
(który może, ale nie musi, być tym, czego się spodziewa ...) niezależnie od kolejności w wierszu poleceńźródło
tracefile
braku dostępu do pliku?Chociaż może nie dać ci wystarczającej kontroli (jeszcze?) Napisałem program, który przynajmniej częściowo spełnia twoje potrzeby, używając fanotify i nieudostępniania jądra linux-to do monitorowania tylko plików zmodyfikowanych (lub odczytanych) przez określony proces i jego potomków . W porównaniu do strace jest dość szybki (;
Można go znaleźć na https://github.com/tycho-kirchner/shournal
Przykład na powłoce:
źródło