Dateien auf Änderung überwachen

Andy_m4

Well-Known Member
Gibt es eine FreeBSD-eigene Möglichkeit, die Änderungen von Dateien zu überwachen? Also speziell für die Verwendungen in Shell-Skripten und so?
Also ich weiß, das es da z.B. kqueue gibt (und auf der dortigen Manpage ist auch ein Beispielprogramm, welches funktioniert und das man mit geringen Anpassungen nehmen kann). Also quasi sowas wie fswatch-mon (fswatch-Manpage).
Aber gibts auch im Base-System ein Tool, welches man direkt nutzen kann?
 
Wäre eine while-Schleife und {md5,sha256}sum ungeeignet?
Ja. Das ist ein gangbarer Weg.. Mir gehts auch primär nicht darum irgendeine Lösung zu haben (da führen viele Wege hin), sondern (auch um des lernens willen) zu wissen, ob es da ein Standard-Tool unter FreeBSD gibt, welches event-basiert (kqueue und Co.) eine solche Abfrage ermöglicht. Vielleicht gibts da auch nichts, aber falls ja, würde ich diese Wissenslücke gerne schließen.

Aber trotzdem danke für Deine Anregung.
Und wo wir gerade schon dabei sind und lernen und so:
Welches wäre denn das schnellste Prüfsummenprogramm? Also md5 dürfte vermutlich ziemlich flott sein. Aber gibts schnellere Varianten (maybe cksum - also CRC - dürfte recht schnell sein ; ist natürlich nicht so genau/zuverlässig wie z.B. md5, aber für manche Szenarios reicht das ja)?
 
dtrace entsprechend vergewaltigen.
Ja. :-)
Guter Gedanke. Die Idee hatte ich tatsächlich auch schon, weil ich dtrace sehr gerne beispielsweise dafür verwende um zu gucken, welcher Prozess welche Datei anfasst (dwatch -X open , siehe: dwatch(1)).
Das kann man jetzt noch ein bisschen runterfiltern, in dem man nur die open-Arufe filtert, wo Dateien fürs schreiben geöffnet werden. Laut der Manpage zu open gibts dafür z.B. das Flag O_WRONLY. Das entspricht laut fcntl.h dem Zahlenwert 1.

Man könnte ein entsprechendes Testbedingungen definieren. Allerdings matcht das open-Profil von dwatch auf open und openat und die werden geringfügig anders aufgerufen. Außerdem ist die Ausgabe von dwatch relativ verbose. Für den Zweck zuviel. Der Pfad/Dateiname reicht ja eigentlich.

Also könnte man direkt dtrace nehmen:
Code:
dtrace -q -n 'syscall::open:entry { if (arg1 & 0x1 ==0x1 )  {
printf("%s\n", copyinstr(arg0));
}}' -n 'syscall::openat:entry { if ((arg2 & 0x1 ==0x1 )) {
printf("%s\n", copyinstr(arg1));
}}'
Code:
dtrace -q -n 'syscall::open:entry /arg1 & 0x1==0x1/  {
printf("%s\n", copyinstr(arg0));
}' -n 'syscall::openat:entry /arg2 & 0x1==0x1/ {
printf("%s\n", copyinstr(arg1));
}'

Man kann dann noch ein | grep /meine/datei hinten ranhängen, um nach einer spezifischen Datei zu gucken. Vermutlich kann man das auch irgendwie die if-"Abfrage" packen, aber irgendwie ist das mit den Strings und vergleichen in dtrace immer etwas tricky. Kurzum: Ich hab das auf Schlag nicht parat. Sowas wie copyinstr(arg0)=="/meine/datei" funktioniert jedenfalls nicht so einfach und ein strcmp gibts unter dtrace nicht. Aber vielleicht hat ja jemand einen Hinweis dazu parat.

Problem dabei: öffnen heißt natürlich nicht, das die Datei dann schon fertig geschrieben ist. Steng genommen müsste man eigentlich noch den File-Descriptor merken und ein entsprechendes close abwarten.
In der Praxis reicht es vermutlich aber, wenn man einfach nur zur Sicherheit ne Sekunde abwartet, bevor man was mit der Datei macht.
Diese Timing-Probleme hat man übrigens auch potentiell bei der Prüfsummenabfrage.
 
Die Idee ist ganz nett. Also das mit der -i Option. Wo man dann bei der Angabe mehrerer Dateien, via Exit-Code mitgeteilt wird, welche Datei von der Änderung betroffen ist.
Und auch sonst werden Exit-Codes geschickt genutzt, was es ganz angenehm fürs Skripting macht.
Insofern ist es nicht ganz das, was ich suche aber dennoch ein guter Tipp.

das Tool nutzt die kqueue
Ja. Das ist einfach bei solchen Sachen the-way-to-go. Mit allem anderen hat fängt man sich zu schnell Nachteile an und/oder es wird umständlicher.
 
Nicht im Base, aber ein super tool. Damit überwache ich alle meine Server.

 
Ja. Aber das ist eigentlich nicht mein Anliegen. Also quasi alle Dateien zu überwachen.
Es geht mir eher um: Datei via Skript im Blick zu behalten und instant eine Aktion starten, wenn die sich ändern

btw.: Gibts übrigens eine ähnliche (kleinere) Lösung auch in Base-System. Nämlich mtree(8)

Zum snapshotten:
mtree -c -p /path/to/watchdir > /path/to/mtree.log

Und später zum auf-Veränderung-prüfen:
mtree -p /path/to/watchdir -f /path/to/mtree.log
 
Ja, das geht ja mit aide.

Aide überwacht NICHT ALLE dateien, sondern jene, welche du in der Konfig vorgibst. Danach kannst du Aide per Script laufen lassen und dessen Ausgabe auswerten. Aide zeigt dir welche Datei genädert hat und somit kannst du eine Aktion ausführen.

Ja, dann nimm mtree. Ist doch auch gut.
 
Zurück
Oben