/etc/skel für bestehende Benutzer kopieren

Datum: 2001-03-21
Quelle: suse-linux

Worum ging es?

Die Dateien unter /etc/skel sind dafür gedacht, ein Gerüst für neu angelegte Benutzer (Konfigurationsdateien diverser Anwendungen) zu bilden. Was macht man nun, wenn dies - z. B. nach Änderungen - für alle existierenden Benutzer nachgeholt werden soll?
Das nachfolgende Script entstand in einem Dialog in der Liste und lieferte gleich (sozusagen als "spin off") ein paar andere Ideen mit (siehe Zugriffsrechte für Dateien setzen und Programme versionsabhängig starten).

Code
# Username, UID, GID, HOME
cut -d: -f1,3,4,6 /etc/passwd | sed 's/:/ /g' | \
  while read user u_id g_id home; do
    # UID pruefen: keine System-Accounts, kein nobody / check UID: no system accounts, no "nobody"
    test $u_id -lt 500 -o $user = "nobody" && continue
    # Verzeichnisse kopieren (Modus von /etc/skel mitnehmen) / copy directories (take mode from /etc/skel)
    find /etc/skel -type d -mindepth 1 -printf "%m %P\n" | \
      while read d_mode dir; do
        test ! -d $home/$dir && \
          install -d -o $user -g $g_id -m $d_mode $home/$dir
      done
    # Dateien kopieren (Modus von /etc/skel mitnehmen) / copy files (take mode from /etc/skel)
    find /etc/skel -type f -printf "%m %P\n" | \
      while read f_mode f_name; do
        if test ! -f $home/$f_name; then
          install -o $user -g $g_id -m $f_mode \
                  /etc/skel/$f_name $home/$f_name
        else
        ## z.B.:
        ## backup (mit install -b -S SUFFIX) machen oder als .new oder .default installieren...
        ## backup file (using install -b -S SUFFIX) or install as .new or .default ...
        fi
      done
  done
Beschreibung

Die im Beispiel genutzte printf-Option des find gibt es leider nur in der GNU-Version. Wer portabel bleiben will oder muss, der hat hier ein Problem. Ein Lösungsansatz ist, die normale print-Ausgabe zu nutzen und dann die Rechte separat zu ermitteln.
Es kam noch der Hinweis, dass es unter Umständen besser ist, die zu bearbeitenden User nicht aus /etc/passwd zu ermitteln, sondern eine vorgegebene Liste von Verzeichnissen abzuklappern. Das macht z. B. dann Sinn, wenn es viele "Pseudo-User" gibt, die keine Shell haben (ftp u. ä.). Der vorgeschlagene Schleifenstart sieht so aus:

HOMES="/home:/export/homes:/ftp/homes"
OLDIFS=$IFS; IFS=':'; eval set -- "$HOMES"
for homeroot in $@; do
  for user in `cd $homeroot && ls -d * | grep -v lost+found`; do
    if cut -d: -f1 /etc/passwd | grep "^$user$"
    # ...

Zuerst wird eine Liste der zu durchsuchenden Basisverzeichnisse definiert, jedes dieser Verzeichnisse wird anschließend nach Benutzerverzeichnissen durchsucht.