Wie kann ich geöffnete Dateien eines Prozesses in Echtzeit überwachen?

41

Ich weiß, dass ich die geöffneten Dateien eines Prozesses lsof zu diesem Zeitpunkt auf meinem Linux-Computer anzeigen kann . Ein Prozess kann eine Datei jedoch so schnell öffnen, ändern und schließen, dass ich sie nicht mehr sehen kann, wenn ich sie mit Standard-Shell-Skripten überwache (z. B. watchwie unter "Überwachen geöffneter Prozessdateien unter Linux (in Echtzeit)" erläutert ). .

Ich suche also nach einer einfachen Möglichkeit, einen Prozess zu prüfen und zu sehen, was er im Laufe der Zeit getan hat. Es wäre großartig, wenn Sie auch sehen könnten, welche Netzwerkverbindungen es herstellt (versucht hat), und wenn Sie das Audit starten könnten, bevor der Prozess ausgeführt werden kann, ohne dass das Audit gestartet wird.

Idealerweise würde ich das gerne machen:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

Wäre es mit straceund einigen Flags möglich, nicht jeden Systemaufruf zu sehen?

gertvdijk
quelle

Antworten:

50

Laufen es mit

strace -e trace=open,close,read,write,connect,accept your-command-here

würde wohl ausreichen.

Sie müssen die -oOption verwenden, um die Ausgabe von strace an einer anderen Stelle als auf der Konsole zu platzieren, wenn der Prozess auf stderr drucken kann. Wenn sich Ihr Prozess verzweigt, benötigen Sie auch -foder -ff.

Oh, und vielleicht möchten Sie es -tauch, damit Sie sehen können, wann die Anrufe getätigt wurden.


Beachten Sie, dass Sie die Liste der Funktionsaufrufe je nach dem, was Ihr Prozess tut, möglicherweise anpassen müssen. Ich musste Folgendes hinzufügen getdents, um ein besseres Beispiel zu erhalten ls:

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0
Nutzlos
quelle
1
Das geht in die richtige Richtung, danke! Möchte eine benutzerfreundlichere Ausgabe, aber es macht den Job. Ich könnte mir die Zeit nehmen, ein Tool mit einer top-ähnlichen Oberfläche dafür zu schreiben. Ich hatte gehofft, dass es ein ncurses-basiertes oder 'top'-ähnliches Tool geben würde, um die Aktionen der Binärdatei in Echtzeit zu untersuchen.
Gertvdijk
Wie soll es aussehen? Es ist wahrscheinlich möglich, die Ausgabe von strace in etwas Freundlicheres umzuwandeln.
Nutzlos
Sie möchten auf jeden Fall verwenden -o, um die Ausgabe in Dateien zu verschieben. Dann können Sie tail -F strace.outputin einem anderen Terminal laufen , um ein "Live" -Update zu erhalten.
Peterph
4
Sie können stracemit der -p PIDOption auch eine Verbindung zu einem laufenden Prozess herstellen .
Frank Breitling
Fügen Sie -yzu "[p] rint-Pfade, die mit Dateideskriptorargumenten
verknüpft sind