• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Links auslesen

Ich habe ungefähr 50 Samba User. Diese User haben in Ihrem Home Verzeichnis einige Verzeichnisse stehen.

Beispiel : /home/User/schreiben

In dem Verzeichnis stehen symbolische Links um verschiedene Zugriffe auf verschiedene Ordner zu geben

Beispiel eines symbolischen Links:

-> /samba/gruppen/Dokumente

Diese Links würde ich gerne auslesen und in eine Liste schreiben.
Hintergrund ist der, dass eine Umstellung erfolgt und ich würde mir gerne die Tipparbeit sparen, denn bei jedem User stehen ungefähr 10-20 Links darin und diese müsste man erneut eingeben.

Bin für jeden Tipp dankbar

Gruß
 
A

Anonymous

Gast
Code:
find . -type l -ls
( l ist ein kleines L )
den Anfang der Zeilen kannst du ja noch mit cut wegschneiden
wenn er dich stört.

robi
 
Hatte ich mir auch schon gedacht, aber das dumme ist nachher herauszufinden, zu wem welcher Link gehört. Ich habe zwar eine Liste mit vielen Links, aber wer zu welchem ist schon schwieriger. Hab auch schon Listen mit blanken Shell befehlen erstellt, eben mit echo den Namen hinein geschrieben, da die Links in deren Homeverzeichnissen stehen, Aber man muss für jeden einzelnen das Skriptlein ausführen.

Möglicherweise kann man es mit einem Skript ausführen?

Danke
 
was bedeutet "zu wem welcher Link gehört"? verstehe ich das so richtig:

IST SO AUF DER PLATTE:
Code:
/home/
         |-foo1/
         |        -bar1/
         |                |-link1
         |                |-link2
         |                |-link3
         |        -bar2/
         |                |-link1
         |                |-link2
         |                |-link3
         |-foo2/
         |        -bar1/
         |                |-link1
         |                |-link2
         |                |-link3
         |        -bar2/
         |                |-link1
         |                |-link2
         |                |-link3

ziel: eine Abbildung

foo1 hat
* in bar1 link1 bis n
* in bar2 link1 bis m
foo2 hat
* in bar1 link1 bis j
* in bar2 link1 bis k

dann kannst Du dasn schon alles mit find erschlagen, wechsel ins Verzsichnis /home und führ den Befehl aus:

Code:
$ find . -type l
./foo1/bar1/link1
./foo1/bar1/link2
./foo1/bar2/link2
./foo2/bar2/link1
./foo2/bar1/link2

das speicherst Du und später kannst Du diese Datei leicht parsen und die User (fooI) die Verzeichnisse (barI) und die Links wiederherstellen, wenn Du zusätzlich noch das Linkziel speichern willst, dann mach einfach ein
Code:
find . -type l -exec ls -l {} \;
dabei wird dann für jeden gefundenen Link eine lange Verzeichnisausgabe generiert:
Code:
lrwxrwxrwx  1 user group date time ./foo1/bar1/link1 -> /somewhere/link/destination
und da stecken alle Infos drin
 
Sorry, konnte mich nicht eher melden. In diesem Fall, wie bei dir dargestellt, wären die Ordner bar1 und 2 die Sambaordner, die mit Rechten versehen sind. Darin stehen dann die Links auf verschiedene Verzeichnisse, für die die Rechtevergabe ebenfalls gilt. Ich probier es mal aus. Könnte klappen.

Danke

Gruß
 
ansonsten solltest Du mal ein konkretes Bsp posten, um was für ein seltsames Konstrukt es bei Dir geht...
 
OK. Es ist im Prinzip ganz einfach.

Es gibt zwei Sambaordner. lesen und schreiben. Auf dem einen Sambaordner hat man Lese Rechte und auf dem anderen Schreib Rechte.

In beiden Ordner stehen links die auf verschiedene Verzeichnisse verweisen. Die Links in den Sambaordnern bzw. die gelinkten Verzeichnisse haben die gleichen Rechte.

Hintergrund ist, dass ein alter Server ersetzt werden muss und die Links sollen auf dem Neuen Server genauso wieder vorhanden sein.

Hintergrund ist ebenfalls noch, dass keine ACLs verwendet werden, sondern eben die Zugriffsrechte über die Sambaordner vergeben werden.


Bsp. /home/user1/lesen
-> /Dokumente/Berichte/MAI05

Er hat im Ordner Mai05 nur Leserechte

/home/user1/schreiben
-> /Dokumente/Berichte/MAI05

Er hat im gleichen Ordner Schreibrechte

Die Sambaverzeichnisse werden per Netzlaufwerk bzw. IP verbunden.

Bsp. \\192.168.1.2\lesen
\\192.168.1.2\schreiben

Somit kann ich in das jeweilige Sambaverzeichnis einen Link setzen und der User hat dementsprechend Zugriff auf das gewünschte Verzeichnis ohne ACLs zu verwenden.

Danke hab es schon mal ausprobiert klappt denk ich. Ich meld mich nochmal muss noch weitere Sachen ausprobieren.

Gruß
 
dann hab ich das richtig verstanden und die foo_i wären die user und bar1=lesen und bar2=schreiben.

wenn das auf lesen und schreiben eingeschränkt werden kann, kannst Du den findbefehel noch optimieren:

Code:
find . -type l -path "*lesen*" -or -path "*schreiben*" -exec ls -l {} \;
damit werden nur die genommen, die in dem kompletten Pfad lesen oder schreiben haben
 
Dankeschön, das war ein guter TIPP. Hättest du vielleicht noch einen Tipp wie ich es auf den neuen wieder aufspielen kann. Der Pfad ist fast genauso bis auf Benutzername, aber denn kann ich ja ohne weiteres ändern.

Danke
 
erst mal da war noch ein kleiner Fehler drin :( durch das -or musst Du da mehrfach basteln (zumindest fällt mir z.zt. da keine Klammer alternative ein, also besser:
Code:
find . -type l -path "*lesen*" -exec ls -l -n {} \; -or -type l -path "*schreiben*" -exec ls -l -n {} \;

dabei gelten die Einschränkungen und Cmds für alles.

jetzt Zu Deinem Ziel:

alte Daten sichern:
Code:
$ cd /home
$ find . -type l -path "*lesen*" -exec ls -l {} \; -or -type l -path "*schreiben*" -exec ls -l {} \; > /tmp/links
jetzt hast Du in /tmp/links eine Liste aller Links mit Pfaden relativ von home.

2. Schritt: in dieser Liste den alten Usernamen durch einen neuen ersetzen, d.h. die Zeile lautet:
Code:
lrwxrwxrwx  1 foo1 foo1 16 2005-06-09 15:35 ./foo1/lesen/link1 -> /tmp/destination
daraus ein:
Code:
lrwxrwxrwx  1 foo1 foo1 16 2005-06-09 15:35 ./bar1/lesen/link1 -> /tmp/destination
machen (also alt foo1 ist neu bar1)

jetzt ein kleines Script auf diese Datei anwenden:
Code:
$ sh newlinks.sh /tmp/links
wobei newlinks.sh so aussieht:
Code:
#!bin/bash

cd /home

while read LINE
do
  LINK=`echo "$LINE" | awk '{print $8}'`
  LINKSOURCE=`echo "$LINE" | awk '{print $10}'`
  
  ln -s "$LINKSOURCE" "$LINK"
  
done < $1
 
Zum Verständnis: Was ist jetzt der Unterschied mit diesem or ? Sucht er jetzt alle Links. Ich bräuchte nur die von den Homeverzeichnissen?

Noch eine Frage, sorry: Woher weiß das Skript den neuen Benutzer Namen?
 
nein, das -or verknüpft 2 verschiedene Parameterfolgen, hier geht es um
find . == suche vom aktuellen Verzeichnis rekursiv in die Tiefe, da ich ja gesagt ahbe, gehe in das Verzeichnis /home passt das schon
-type l == finde Links
-path "*schreiben*" == bei denen im kompletten Pfad das Wort schreiben vorkommt
-exec ls -l {} \; == führe für die Suchergebnisse ls -l aus
-or == oder den folgenden Sermon
-type l == finde Links
-path "*lesen*" == bei denen im kompletten Pfad das Wort lesen vorkommt
-exec ls -l {} \; == führe für die Suchergebnisse ls -l aus

die neuen Usernamen musst Du selber in die Datei basteln (einfach editieren, entweder manuell oder über ein Script)
[/quote]
 
Ich hatte einen Unfall und konnte mich nicht eher melden, da ich im Krankenhaus war. Hammerhart!

Auf jeden Fall habe ich folgende Probleme:

1. Bei uns sind die Links symbolisch also habe ich anstatt -type l -type ln -s gemacht.

2. Nach dem Ausführen des Befehls springt die Konsole in die nächste Zeile und zeigt mir nur dieses Zeichen ">" wie als wenn er ein Ziel sucht. Ich kann aber hinter diesem Zeichen etwas eingeben.

Ich habe es auch schon mit dem Original versucht -type l und bin leider zu keinem Ergebnis gekommen.

Weißt du woran das liegen könnte.

Gruß
 
Chipsie schrieb:
1. Bei uns sind die Links symbolisch also habe ich anstatt -type l -type ln -s gemacht.
ein unfall entschuldigt kein manpage-nicht-lesen :(

es gibt kein -type ln -s ...

2. Nach dem Ausführen des Befehls springt die Konsole in die nächste Zeile und zeigt mir nur dieses Zeichen ">" wie als wenn er ein Ziel sucht. Ich kann aber hinter diesem Zeichen etwas eingeben.

da ist ein String nicht geschlossen.
 
Ja, du hast recht. Sorry.

Es hat gestern Abend noch geklappt. War ein bisschen zu schnell.

Trotzdem Danke.

Aber den Typ ln -s gibt es.

Gruß
 
Oben