Comment automatiser l'effacement et la réinitialisation du répertoire personnel d'un utilisateur Linux à sa valeur par défaut?


8

J'aide à enseigner deux cours Unix la semaine prochaine. Les utilisateurs se verront accorder un compte sur une machine RHEL 5, pendant laquelle ils ajouteront des fichiers à leur /homedossier, .bashrcmettront à jour leur fichier et d'autres fichiers dot et effectueront d'autres tâches générales qui doivent être nettoyées.

Les étudiants de la deuxième session réutiliseront les comptes d'utilisateurs des gens de la première session. J'aimerais automatiser le nettoyage de leurs comptes, afin que les nouveaux utilisateurs puissent recommencer à zéro.

Je suis sûr que je pourrais écrire un script shell qui exécute un su -u $USER_IDet établit un ensemble "original" de bons fichiers dans leur homedir, et supprime tout ce qu'il trouve. Y a-t-il d'autres outils qui m'aideront dans cette opération de nettoyage / réinitialisation? Je n'ai aucune expérience avec Puppet, Chef ou d'autres outils. Seraient-ils utiles pour faire quelque chose comme ça?

Pour fournir une étendue du problème, il y a environ 30 comptes d'utilisateurs, je connais tous les ID utilisateur / mots de passe, et ils sont tous créés sur la même boîte RHEL.


Si vous l'enseignez, vous le saurez probablement déjà, mais Linux n'est pas Unix. Le nom vient de Linus, mais c'est aussi un acronyme pour [L] inux [i] s [n] ot [U] ni [x].
mailq

Assez vrai. J'ai changé le titre pour le refléter.
matthewsteele

Réponses:


12

Il existe de nombreuses façons qui pourraient aider:

  • supprimez le répertoire personnel complet et copiez tous les fichiers de /etc/skelretour dans le répertoire d' origine. Modifiez ensuite les autorisations.
  • placer le système dans une machine virtuelle, créer un instantané et revenir à l'instantané après la leçon 1
  • trouver quelque chose comme un mode kiosque dans RHEL. Ubuntu a quelque chose comme ça, qui restaure automatiquement la maison lors de la déconnexion
  • mettre la maison sur un système de fichiers btrfs, faire un instantané et revenir après la leçon 1
  • tar le répertoire d'origine avant la leçon, supprimer le répertoire d'origine après, restaurer à partir de tar
  • ...

Et apprendre d'autres outils comme Puppet / Chef est un peu trop si vous voulez des résultats la semaine prochaine.


Merci. Je vais probablement exécuter un taret restaurer, et essayer d'apprendre un outil comme Puppet quand je ne suis pas dans un temps critique.
matthewsteele

4

Disons que tous vos élèves avaient un UID entre 1000 et 65000

Un one-liner rapide comme celui-ci fonctionnerait. Awk imprimera une commande rsync et une commande chown pour chaque utilisateur de la plage. L'envoi de la sortie de awk dans bash exécutera toutes les commandes pour réinitialiser les répertoires et les autorisations.

# 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

Si vous utilisez gdm pour votre gestionnaire de connexion, vous pouvez ajouter quelque chose comme ce fichier: / 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

L'ensemble "original" des fichiers de compte se trouve généralement sous / etc / skel dans les systèmes Unix.

En dehors de cela, je ne connais aucun outil pour automatiser le nettoyage. Je finirais probablement par écrire un simple script bash.


1

Essaye ça

#!/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

Il peut y avoir un bon outil qui vous aidera, mais je voudrais probablement juste (a) mettre les trucs désirés dans un dépôt git, et (b) écrire un script qui itère sur les utilisateurs et rm est le truc désiré et tire du dépôt git .


-2

Cela fonctionne pour le gnome Ubuntu: pico /usr/local/bin/cleanup.sh

rm -rf / home / utilisateur / Téléchargements / *

faites de même si vous souhaitez supprimer des documents

quitter chmod 511 /usr/local/bin/cleanup.sh

pico / etc / gdm / PostSession / Default

! / bin / bash

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.