Gibt es eine Möglichkeit, genau festzustellen, auf welche Dateien ein Befehl zugreift?

Gibt es eine Möglichkeit, genau festzustellen, auf welche Dateien ein Befehl zugreift?

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ßttrussin vielen Unix-Systemen,dtrussunter OSX,straceunter 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 readund 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 straceProgramm (erwähnt von @gowenfawr) macht dies korrekt und ist in Bezug auf den ptrace(2)Systemaufruf implementiert. Beachten Sie jedoch, dass der ptraceAufruf 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 openAufrufe 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, recvmsgZusatzdaten und vom übergeordneten Element geerbte Dateideskriptoren.

verwandte Informationen