Frage

Ich verwende dtrace, um alle gelöschten Dateien aufzuzeichnen.

Ist es möglich herauszufinden, was das Symlink-Ziel ist (wenn es sich um einen Symlink handelt)?Ich möchte den Symlink-Dateinamen und den Zieldateinamen für die Protokollierung ausgeben, falls ich den Link später wiederherstellen muss.

Eine Lösung, die ich mir ausgedacht habe, besteht darin, die dtrace "System" -Funktion zu verwenden, um mein eigenes Programm aufzurufen, das das Symlink-Ziel ausgibt:system ("Meinprogramm%s"), wobei%s der vollständige Name des Symlinks ist, für den ich das Ziel ausdrucken möchte.

Das funktioniert in Ordnung (es ist ein sehr kurzes C-Programm und erledigt den Job) - aber gibt es eine Möglichkeit, die Informationen direkt über dtrace abzurufen, da wir die Datei sowieso bearbeiten, sollten wir in der Lage sein, das Symlink-Ziel nachzuschlagen?

Ich habe mir die Struktur fileinfo_t angesehen, aber sie hat nicht das Symlink-Ziel:http://docs.oracle.com/cd/E18752_01/html/817-6223/chp-io-args.html#chp-io-fileinfo

Das ist bisher mein Skript:Dies ist in Solaris 10.(Dies sucht eher nach fop_remove als nach syscall::unlink und der Grund dafür ist, dass das Symlink-Verzeichnis abgerufen werden kann, falls der Benutzer das Verzeichnis im Aufruf von rm nicht angibt).

    #!/usr/sbin/dtrace -s

    #pragma D option quiet

    fbt::fop_remove:entry
    {
           self->dir = stringof(args[0]->v_path);
           self->file = stringof(args[1]);
    }

    fbt::fop_remove:return
    /self->file != NULL/
    {
           printf("%s/%s\n", self->dir, self->file);
           self->file = 0;
           self->dir = 0;
    }

danke!

War es hilfreich?

Lösung

Auf Solaris VFS-Ebene (auch bekannt als vnode_t struktur), ist das Symlink-Ziel nicht an den Knoten für den Symlink selbst angehängt.Es ist ein Detail der Dateisystemimplementierung.

Wenn bei UFS-Dateisystemen der Pfadname des Linkziels kürzer als 48 Byte ist (was UFS einen 'schnellen Symlink' nennt), wird er inline mit dem aufgezeichnet inode_t struct , und Sie können den Wert über DTrace drucken über:

vnode = args[0];
inode = (inode_t*)vnode->v_data;

printf("symlink tgt: %47s\n",
    vnode->v_type != VLNK ||
    vnode->v_op != ufs_vnodeops ||
    inode->i_flags & I_FASTSYMLINK == 0 ?
        "[unresolved]" :
        (char *)inode->i_db);

Für andere Dateisysteme / im generischen Fall müssten Sie ein verwenden fsinfo::readlink:return (oder fop::fop_readlink:return) sondenpunkte, um den Zielzugriff zu erhalten, das heißt, er wird (normalerweise) nicht direkt vom Ziel abgerufen werden können vnode_t.

Andere Tipps

Ich habe die folgende mögliche Lösung - auf Zugriff, wie Sie gesagt haben:

generasacodicetagpre.

(ich beschränke hier die Rückverfolgung auf MyDirectory hier).

Das dauert also die Tatsache, dass der ARG0 beim Eintrag der Symlinkname ist, und bei der Rendite ist der File Deskriptor verfügbar, um den Pfadnamen zu erhalten, der der Pfadname der aktuellen Datei ist.Das wäre also das Ziel des Symlinks. Es ist nicht eigentlich kritisch, dass die Spur beim Löschen erfolgt, genau dass das Symlink-> Ziel aufgenommen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top