Überwachen von Links auf Zugriff

Anub1s

Lieutenant
Registriert
Aug. 2006
Beiträge
717
Hallo zusammen,

ich habe unter Linux einen Link auf eine Datei (./link.txt -> ./file.txt), den ich gerne auf Zugriff überwachen möchte. Ich möchte mitbekommen, wenn auf den Link zugegriffen wurde (bspw. ein "cat link.txt"), nicht aber wenn auf die Datei selbst zugegriffen wird ("cat file.txt"). Ist das irgendwie möglich? Was die Umsetzung angeht bin ich prinzipiell flexibel, kann gerne mit einem Shell-Skript sein, aber auch in Java, C oder sonstigem.

Ich habe versucht, das ganz mit inotify zu lösen (mit flag IN_ALL_EVENTS), dabei wird mir aber sowohl bei "cat link.txt" als auch bei "cat file.txt" ein Zugriff gemeldet. Der Parameter IN_DONT_FOLLOW hat mich leider auch nicht wie erwartet weiter gebracht, da dann weder der erste noch der zweite Zugriff mitgeloggt wird.


Kann man die Unterscheidung überhaupt mit inotify bewerkstelligen, oder muss ich anders an die Sache rangehen?


MfG Anub1s
 
dabei wird mir aber sowohl bei "cat link.txt" als auch bei "cat file.txt" ein Zugriff gemeldet.
Ist das ein Problem? Einfach das Event für die Datei, die du nicht überwachen möchtest, ignorieren - fertig.

Im Zweifel eben mit stat nachschauen, ob die Datei, für die ein Event gesendet wurde, ein Symlink ist oder nicht. Die Methode ist zwar streng genommen unsicher, funktioniert aber bei "normaler" Benutzung.
 
VikingGe schrieb:
Ist das ein Problem? Einfach das Event für die Datei, die du nicht überwachen möchtest, ignorieren - fertig.
Das Problem ist, dass ich sowohl beim Zugriff auf den Link als auch auf die Datei von inotify nur zurück bekomme, dass die Datei zugegriffen wurde, ich also keine Unterscheidung machen kann

blablub1212 schrieb:
Ich denke mit folgendem kannst du das basteln: https://pythonhosted.org/watchdog/index.html
Hier gibts die Möglichkeit per regexp oder pfad angaben nur bestimmte zugriffe zu loggen.
Hast du das mit den Links konkret damit schon ausprobiert? Ein kurzer Blick auf die Seite sieht für mich danach aus, als würde die Bibliothek ebenfalls auf inotify zugreifen, insofern weiß ich nicht ob ich damit weiter komme als ich gerade schon bin. Werde es mir aber auf jeden Fall die Tage mal anschauen, danke schon mal.
 
Mit IN_DONT_FOLLOW sollte zumindest ein open-Event für den Link gesendet werden. Bekommst du gar nichts?

Ich weiß auch nicht, was du konkret für Events erwartest, aber wenn du alle möglichen reads/writes überwachen willst, dann könnte das eventuell tatsächlich unmöglich sein. Ein Symlink enthält nur einen Dateipfad, ist aber keine Referenz auf eine andere Datei - mit einem Hardlink könnte das funktionieren, aber natürlich nur innerhalb einer Partition.
 
Watchdog habe ich vorhin ausprobiert, damit kann ich aber soweit ich erkennen kann nur Änderungen an Dateien verfolgen, nicht aber den reinen Zugriff ("cat link.txt").

Mit inotify habe ich nochmal alle Varianten durchprobiert, aber mein Problem besteht nach wie vor: beim Zugriff auf file.txt erscheint ein Event für link.txt, sogar unabhängig davon ob es ein Sym- oder Hardlink ist. Eine Unterscheidung, ob nun file.txt oder link.txt zugegriffen wurde ist nicht möglich.

Hat noch jemand eine Idee, was man sonst noch anderes machen könnte? Oder mache ich doch noch etwas falsch und es sollte eigentlich gehen? Kann das Problem jemand bei sich nachvollziehen?

MfG Anub1s
 
Hm, es funktioniert wirklich nicht mit dem Hardlink. Hätte ich jetzt nicht gedacht.

Das Problem ist wahrscheinlich, dass inotify-Events eine Ebene "zu tief" generiert werden - und dann mit einem relativ beliebigen Link gearbeitet wird. Das führt dann zu interessanten Ergebnissen, wenn man nen Hardlink "b" auf Datei "a" erstellt und dann "a" löscht.
Das nächste Problem ist, dass zu inotify keine wirkliche Alternative existiert, weil sowas Kernel-Support braucht.

Warum ist das mit dem Link eigentlich so wichtig? Vielleicht gibts nen Workaround.
 
Zurück
Oben