ich hab ganze alte Profil-Verzeichnisse aus Samba, die in den Jahren von meinen Ex-Kollegen einfach mit chmod 777 versehen wurden, weil sie wohl irgendwo an andren Stellen Zugriffsprobleme bekamen (oder warum auch immer). Ich möchte im Zuge einer Umstrukturierung diese wie folgt abändern und korrigieren. Da ich keine Lust habe jeden einzelnen Ordner zu bearbeiten, möchte ich das mit einem Skript erledigen. Das sollte einfach zu lösen sein, denn den usernamen, den ich für "chown" verwenden möchte, kann ich einfach anhand des Verzeichnisnamens auslesen. Hier wie der Ordner aussieht, alles dadrunter möchte ich verarbeiten:
Die Unterordner davon sind wirr-warr, da stimmen die Owner und Gruppen nicht, auch die modes sind ganz verschieden.# ls -l /profiles
[...]
drwxrwxrwx 14 max Domain Users 4096 1.Feb. 2009 max
drwxrwxrwx 13 max grupp2 4096 1.Feb. 2009 max.V2
drwxrwxrwx 12 hans grupxyz 4096 1.Feb. 2005 hans
drwxrwxrwx 15 sibylle Domain Users 4096 1.Feb. 2005 sibylle.V2
drwxrwxrwx 14 foobar kostbar 4096 1.Feb. 2005 foobar
drwxr-x--x 11 moritz looser 4096 2.Feb. 2004 habakuk
[...]
Diese Befehle möchte ich anwenden, ich würde also anfangen und folgendes ausführen:
Für den ersten Ordner:
Code: Alles auswählen
chown -R max:'Domain Users' max
Für den zweiten Ordner, ist wieder max sein Ordner, das .V2 ist der Profilordner der für windows7 Maschinen gilt:
Code: Alles auswählen
chown -R max:'Domain Users' max.V2
Für den dritten Ordner:
Code: Alles auswählen
chown -R hans:'Domain Users' hans
Für die ersten zwei hätte ich ja auch einfach
Code: Alles auswählen
chown -R max:'Domain Users' max*
Das letzte Verzeichnis heißt "habakuk" und es gibt jedoch keinen User namens "habakuk". Wenn also der geskriptete "chown xyz..." Befehl einen Fehler ausgibt (errorlevel <> 0), dann heißt das ja dass der User nicht vorhanden war und der chmod nicht angewandt werden konnte. In dem Fall soll einfach aus Sicherheitsgründen dieser Ordner und Unterordner mit "chown -R root. habakuk" versehen werden.
Ganz am Ende möchte ich dann per "chmod" die modes setzen und zwar kann ich das einfach mit diesen zwei Zeilen bewerkstelligen:
Code: Alles auswählen
find /profiles -type d -exec chmod 700 {} +
find /profiles -type d -exec chmod 600 {} +
Nun frage ich mich, auch zu Lernzwecken, wie man das so einfach wie möglich (evtl. Einzeiler?) bewerkstelligen könnte. Wie würdet ihr da rangehen? Könnte ich da irgendwie die Variable $(ls) verwenden, muss ich eine Schleife bilden, oder gar mit sed bzw. awk? Ich freue mich auf eure Vorschläge, so kann ich mir Gedanken dazu machen und sehen,wie man das sogar optimieren kann. Sowenig Code wie möglich ist mir am Liebsten (zu Lernzwecken).
Danke an Alle.
EDIT: Mein bisheriges Skript sieht so aus, aber ich bin mir sicher, dass es seeeehr stark verbesserungswürdig ist
Code: Alles auswählen
#!/bin/bash
verz=/profiles
for name in $(ls $verz | sed 's/\(.*\)\..*/\1/')
do
if id -u $name >/dev/null 2>&1; then
chown -R $name:'Domain Users' $name $name.V2 >/dev/null 2>&1
else
chown -R root. $name $name.V2 >/dev/null 2>&1
fi
done
find $verz -type d -exec chmod 700 {} \;
find $verz -type f -exec chmod 600 {} \;