
Irgendein Trottel hat chown -R username
. im /home-Ordner auf unserem Webserver ausgeführt und dachte, er sei im gewünschten Ordner. Es ist unnötig zu erwähnen, dass der Server viele Wackler macht.
Wir haben über 200 Websites und ich möchte sie nicht alle einzeln chownen. Deshalb versuche ich, ein Skript zu erstellen, das den Besitzer aller Ordner in den Ordnernamen ohne den abschließenden / ändert.
Das ist alles, was ich bisher habe. Wenn ich das / entfernen kann, ist alles in Ordnung. Ich möchte aber auch prüfen, ob die Datei ein . enthält. Wenn nicht, führen Sie den Befehl aus, andernfalls fahren Sie mit dem nächsten fort.
#!/bin/bash
for f in *
do
test=$f;
#manipluate the test variable
chown -R $test $f
done
Jede Hilfe wäre großartig!
Dank im Voraus!
Antwort1
Vorausgesetzt, dassalleOrdner im Verzeichnis /home/ stellen Benutzernamen dar. Sie können Folgendes verwenden:
for dir in /home/*/; do
# strip trailing slash
homedir="${dir%/}"
# strip all chars up to and including the last slash
username="${homedir##*/}"
case $username in
*.*) continue ;; # skip name with a dot in it
esac
chown -R "$username" "$dir"
done
Ich empfehle, vorher eine Testschleife auszuführen und zu prüfen, ob der Benutzername tatsächlich mit einem Home-Verzeichnis übereinstimmt.
Dieser AWK-Befehl ruft das Home-Verzeichnis für einen bestimmten Benutzer ab.
awk -F: -v user="$username" '{if($1 == user){print $6}}' < /etc/passwd
Für den Leser ist es eine Übung, dieses Ergebnis mit dem vorhandenen Home-Verzeichnis zu vergleichen.
Antwort2
Du kannst den ... benutzenBasisnameBefehl zum Bereitstellen der letzten Komponente eines Pfads
for dir in /home/*
do
if [ -d "$dir" ]
then
username=$(basename "$dir")
chown -R "$username" "$dir"
fi
done
obwohl ich es zunächst als ausführen würde
for dir in /home/*
do
if [ -d "$dir" ]
then
username=$(basename "$dir")
echo "chown -R $username $dir"
fi
done
um sicherzugehen, dass es vernünftig war.