PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : skript für schleifen in verzeichnissystem



morpheus666
26-11-2001, 10:15
Hallo Ihr vom Linux-Forum,

habe da eine kleines Problem:

Ich soll ein Shell-Skript schreiben, welches Schleifen im Verzeichnissystem findet, die durch Softlinks entstehen. Mein Skript sucht zuerst zu einem angegeben Verzeichnis Softlinks, die darauf zeigen.

Wenn ein SL auf ein Verzeichnis gefunden wird, soll in einer Funktion geprüft werden, ob eine Schleife vorliegt. Übergabeparamter an die Funktion:

- Verzeichnis auf das der SL zeigt
- Inodenummer des Softlinks.

Wie muß ich die Rekursion aufbauen, damit ich Schleifen finde?

Danke für Eure Hilfe schon jetzt.

Gruß morpheus666

jgbauman
26-11-2001, 10:34
Zuerst noch ein paar Frage zur Klärung:

Soll es fuer einen kompletten Baum die Schleifen finden,
oder nur fuer ein Verzeichnis sagen ob es Teil einer Schleife ist?

Muss es wirklich ein shell (?bash?) script sein?

melody lee
26-11-2001, 10:52
Weitere Frage zum Verständniss:
Eine Schleife im Dateisystem ist ist ein Link auf einen Link, der auf den ersten Link verweist?

jgbauman
26-11-2001, 11:04
Oder allgemeiner:
Eine Schleife im Dateisystem hab ich dann gefunden, wenn ich beim direkten Abstieg innerhalb eines Verzeichnisbaums an einer Stelle rauskomme, an der ich schon war. Und somit an dieser Stelle ein Zyklus einsetzen kann (wenn ich den bisherigen Weg (mehrmals, ?unendlich?) wiederhole).

morpheus666
27-11-2001, 08:51
Zu den Fragen:

1) es muß leider ein shellskript sein

2) es soll überprüft werden, ob bei der suche nach SL eine endlosschleife ausgelöst wird, weil der link auf ein verzeichnis zeigt (schleife also nicht für den ganzen baum, sondern nur für das entsprechende verzeichnis)

3) schleife entsteht, wenn man beispielsweise folgendes macht:

mkdir dir1
ln -s dir1 dir2 --> legt in dir1 einen SL dir2 an, der auf dir1 zeigt
==> ein suchprogramm nach SL bleibt an dieser stelle in einer endlosschleife hängen. (ähnlich dem ls-Komando wenn man es zwingt den SL zu folgen ls-L dir1 ==> endet mit fehler, da zuviele links in der ebene)

hoffe ich habe ein wenig helfen können, das problem zu beschreiben.

vielen dank für die mühe, die ihr euch macht.

gruß morpheus666

jgbauman
27-11-2001, 13:39
Tja mein Vorschlag wäre folgendes:
Baue im Speicher einen Baum mit der Struktur der echten Verzeichnisse.
Füge danach die symbolischen Links ein, worauf Du nun einen allgemienen gerichteten Graphen mit einem Wurzelknoten hast.
Klettere nun durch den Baum (depth first) und markiere die Knoten auf dem Weg von dem aktuellen Knoten bis zur Wurzel. (sprich: beim Abstieg den knoten Markieren beim Wiederaufstieg Markeireun löschen). Triffst Du beim Abstieg auf einen markierten Knoten hast du einen Zyklus gefunden.

Probleme:
1. In obiger Formulierung findet der Algorithmus keine hard link Schleifen.

2. Bäume/Graphen in shellskripten:
Die bash bietet arrays als Datenstrukur an. Damit leisen sich ueber ein paar Umwege auch Bäume im Speicher realisieren. Aber wozu der Aufwand, wenn das Dateisystem den Graphen frei haus liefert.
Bleib nur noch das Problem die Markierung und der Position wahrend des abstiegs. Die Position ist einfach in lokalen Variablen in der rekursiven Funktion zu hinterlegen (bash buitlin: local). Die Markierung kann in jedem Verzeichnis als Datei hinterlassen werden (.mark) oder aber z.b. in einem speziellen Verzeichnis (/tmp/$$) für jedes markierte Verzeichnis eine entsprechende vorhandene Datei (identifiziert über die inode number "ls -id .", findet dann auch hard link cycles). Bei mehreren Dateisystemem ist die inode number allein nicht mehr eindeutig. Eventuellen sollte auch manche Dateisysteme/Dateisystemarten (nfs, smb) nicht mit berücksichtigt werden.
Da das Skript evtl als root laufen muss (um auch allen Verzeichnisses folgen zu können) sollte man sich auch vor deterministischen Dateinamen für temporäre Datein hüten (race condition exploits).
Auch ist die Frage offen wie das ganze beim mount/umount während eines Laufs reagiert.

viel spass

morpheus666
27-11-2001, 14:30
Danke für deine hilfe,

ich denke ich bekomms hin

gruß morpheus666