Ich arbeite an einer Software, für die ich wissen muss, auf welche Dateien und Ressourcen ein bestimmter gestarteter Prozess zugreift.
Ich habe nicht vor, zu verfolgen, worauf jedes einzelne Skript, jede Anwendung und jeder Daemon zugreift, sondern nur auf einen bestimmten, vom Benutzer bereitgestellten Prozess.
Gibt es eine Möglichkeit, dies in Python (oder einer anderen Sprache) zu tun? Ich werde selbst ein wenig recherchieren und dachte mir, ich frage einfach mal hier, ob es da draußen sachkundige Benutzer gibt, die sich mit so etwas auskennen und etwas mehr Erklärungen liefern können.
Antwort1
Sie können dieSystemaufrufedie ein Programm macht. Dies ist die übliche Methode, um herauszufinden, auf welche Dateien es zugreift. Das Tool dafür heißttruss
in vielen Unix-Systemen,dtruss
unter OSX,strace
unter Linux. Ich beschreibe hier die Verwendung unter Linux. Lesen Sie das Handbuch für andere Systeme.
Die einfachste Form ist
strace myprogram arg1 arg2
Dadurch wird ein Protokoll aller von durchgeführten Systemaufrufe gedruckt myprogram
. (Beispiel.) Um das Protokoll in einer Datei zu speichern, verwenden Sie die Option -o
. Um auch Aufrufe von Unterprozessen zu protokollieren, verwenden Sie die Option -f
. Um auszuwählen, welche Systemaufrufe protokolliert werden, verwenden Sie die Option -e
. Einzelheiten dazu, was Sie als Argument für verwenden können, finden Sie im Handbuch -e
. Beispielsweise protokolliert der folgende Aufruf dateibezogene Systemaufrufe (Öffnen und Schließen, Verzeichnisauflistung usw.) außer read
und write
.
strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2
Antwort2
Entsprechenddieser Beitrag, Sie können dies in Python tun, indem SiepsutilModul. Wenn Sie nicht auf Python beschränkt sind, dannlsofUndstracesind die beiden Befehlszeilenprogramme, die für diesen Zweck am häufigsten verwendet werden.
Antwort3
Die einzige absolut zuverlässige Möglichkeit, dies zu tun, besteht darin, Systemaufrufe zu verfolgen. Das strace
Programm (erwähnt von @gowenfawr) macht dies korrekt und ist in Bezug auf den ptrace(2)
Systemaufruf implementiert. Beachten Sie jedoch, dass der ptrace
Aufruf schwierig korrekt zu verwenden ist. Wenn Sie ihn nicht direkt verwenden können strace -e open
, ziehen Sie die zweite Möglichkeit in Betracht:
Für die meisten Prozesse können Sie stattdessen die Aufrufe der C-Bibliotheksfunktion open
über abfangen LD_PRELOAD
. Es isttrivialfür ein feindliches C-Programm, dies zu vermeiden; wenn Sie jedoch darauf vertrauen, dass ein Programm selbst keine Systemaufrufe durchführt, ist die Implementierung einfacher als programmgesteuert ptrace
.
Bei einem Prozess, von dem Sie wissen, dass er in einer höheren Programmiersprache wie Python geschrieben ist, könnten Sie stattdessen die open
Aufrufe auf höherer Ebene abfangen. Dies dürfte jedoch schwieriger sein als das Abfangen von Aufrufen auf C-Ebene, es sei denn, die Sprache ist so konzipiert, dass sie ein solches Abfangen unterstützt (bei Python ist dies nicht der Fall).
Abschließend – alle obigen Absätze gehen davon aus, dass Dateien mit geöffnet werden open
. Dies ist nicht immer der Fall, es gibt auch openat
, open64
, recvmsg
Zusatzdaten und vom übergeordneten Element geerbte Dateideskriptoren.