Wie kann ich das Löschen und Zurücksetzen des Home-Verzeichnisses eines Linux-Benutzers auf einen Standardwert automatisieren?


8

Ich helfe, nächste Woche zwei Unix-Kurse zu unterrichten. Benutzern wird ein Konto auf einem RHEL 5-Computer gewährt. Während dieser Zeit fügen sie Dateien zu ihrem /homeOrdner hinzu, aktualisieren ihre .bashrcund andere Punktedateien und führen andere allgemeine Probleme aus, die bereinigt werden müssen.

Die Schüler der zweiten Sitzung verwenden die Benutzerkonten der Personen in der ersten Sitzung wieder. Ich möchte die Bereinigung ihrer Konten automatisieren, damit neue Benutzer neu beginnen können.

Ich bin sicher, ich könnte ein Shell-Skript schreiben, das a su -u $USER_IDausführt und einen "ursprünglichen" Satz guter Dateien in ihrem Homedir ablegt und alles andere entfernt, was es findet. Gibt es andere Tools, die mir bei diesem Bereinigungs- / Rücksetzvorgang helfen? Ich habe keine Erfahrung mit Puppen, Köchen oder anderen Werkzeugen. Wären sie hilfreich, um so etwas zu tun?

Um einen Überblick über das Problem zu geben, gibt es ungefähr 30 Benutzerkonten, ich kenne alle Benutzer-IDs / Kennwörter und sie werden alle auf derselben RHEL-Box erstellt.


Wenn Sie es unterrichten, werden Sie es wahrscheinlich bereits wissen, aber Linux ist nicht Unix. Der Name stammt von Linus, ist aber auch ein Akronym für [L] inux [i] s [n] ot [U] ni [x].
Mailq

Wahr genug. Ich habe den Titel geändert, um ihn wiederzugeben.
Matthewsteele

Antworten:


12

Es gibt viele Möglichkeiten, die helfen würden:

  • Entfernen Sie das vollständige Home-Verzeichnis und kopieren Sie alle Dateien von /etc/skelzurück in das Homedir. Ändern Sie anschließend die Berechtigungen.
  • Stellen Sie das System in eine virtuelle Maschine, erstellen Sie einen Snapshot und kehren Sie nach Lektion 1 zum Snapshot zurück
  • Finden Sie so etwas wie einen Kiosk-Modus in RHEL. Ubuntu hat so etwas, das das Haus beim Abmelden automatisch wiederherstellt
  • Stellen Sie das Haus auf ein btrfs-Dateisystem, machen Sie einen Schnappschuss und kehren Sie nach Lektion 1 zurück
  • tar das Home-Verzeichnis vor dem Unterricht, löschen Sie das Home danach, stellen Sie es wieder her tar
  • ...

Und andere Werkzeuge wie Puppet / Chef zu lernen ist ein bisschen zu viel, wenn Sie nächste Woche Ergebnisse erzielen möchten.


Vielen Dank. Ich werde wahrscheinlich a ausführen tarund wiederherstellen und versuchen, ein Tool wie Puppet zu lernen, wenn ich nicht in einer Zeitkrise bin.
Matthewsteele

4

Nehmen wir an, alle Ihre Schüler hatten eine UID zwischen 1000 und 65000

Ein schneller Einzeiler wie dieser würde funktionieren. Awk druckt für jeden Benutzer im Bereich einen rsync-Befehl und einen chown-Befehl aus. Wenn Sie die Ausgabe des awk in bash senden, werden alle Befehle zum Zurücksetzen von Verzeichnissen und Berechtigungen ausgeführt.

# see what will happen.
awk 'BEGIN{FS=":"} $3 >= 1000 && $3 <=65000 { print "rsync --delete -v -r /etc/skel/ " $6 "/ ; chown -R " $1 ":" $1 " " $6;}' /etc/passwd

# actually run the commands to reset all users matched by awk.
bash <( awk 'BEGIN{FS=":"} $3 >= 1000 && $3 <=65000 { print "rsync --delete -v -r /etc/skel/ " $6 "/ ; chown -R " $1 ":" $1 " " $6;}' /etc/passwd )

2

Wenn Sie gdm für Ihren Anmeldemanager verwenden, können Sie Folgendes hinzufügen: / etc / gdm / PostSession / Default

#!/bin/sh

if [[ "$USER" != "" ]]; then
   rm -rf /home/$USER
   cp -r /etc/skel /home/$USER
   chown -R $USER:$USER /home/$USER
fi

1

Die "ursprünglichen" Kontodateien befinden sich in Unix-Systemen normalerweise unter / etc / skel.

Abgesehen davon kenne ich kein Tool zur Automatisierung der Bereinigung. Am Ende würde ich wahrscheinlich ein einfaches Bash-Skript schreiben.


1

Versuche dies

#!/bin/bash

BASEDIR=/home

# error codes
E_OK=0
E_NOK=1

function handle_error
{

CODE=$1
ACTION=$2
INV=$3

# INV means to invert the handling logic

if [ -z $INV ]; then
  if [ $CODE -ne 0 ]; then
    echo "error: $ACTION"
    exit $E_NOK
  fi
else
 if [ $CODE -eq 0 ]; then
    echo "error: $ACTION"
    exit $E_NOK
  fi
fi

  return $E_OK
}


function print_usage()
{

  echo "usage: reset-homedir.sh USERNAME"

}
# target user and target dir
TUSER=$1
TDIR=$BASEDIR/$TUSER

if [ -z $TUSER ]; then
  print_usage
  exit 0
fi

getent passwd $TUSER >& /dev/null
RC=$?
handle_error $RC "user $TUSER does not exist"

TGROUP="`id -gn $1`"

if [ ! -d $TDIR ]; then
  echo "error: target directory $TDIR does not exist"
  exit 1
fi

# you don't want to delete user mounted stuff do you?
MOUNTS="`mount |grep $TDIR`" >& /dev/null
RC=$?
handle_error $RC "there are mounted filesystems below $TDIR" TRUE


ps -u $TUSER >& /dev/null
RC=$?
handle_error $RC "user $TUSER is logged in" TRUE

echo
echo "$TDIR will be reset to the default state - ALL DATA WILL BE LOST"
echo
echo "-- press ENTER to continue or CTRL+C to abort --"
read dummy

# we did our best to check for unwanted situations
rm -rf $TDIR
# creates a new one
cp -R /etc/skel $TDIR
chown -R $TUSER:"$TGROUP" $TDIR

echo Done.

0

Es mag ein nettes Tool geben, das helfen wird, aber ich würde wahrscheinlich nur (a) das gewünschte Zeug in ein Git-Repo einfügen und (b) ein Skript schreiben, das über die Benutzer iteriert und das gewünschte Zeug rm und aus dem Git-Repo zieht .


-2

Dies funktioniert für Ubuntu-Gnome: pico /usr/local/bin/cleanup.sh

rm -rf / home / user / Downloads / *

Machen Sie dasselbe, wenn Sie Dokumente entfernen möchten

Beenden Sie chmod 511 /usr/local/bin/cleanup.sh

pico / etc / gdm / PostSession / Default

! / bin / bash

/usr/local/bin/cleanup.sh exit 0

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.