Come posso automatizzare la cancellazione e il ripristino della directory principale di un utente Linux su un valore predefinito?


8

Sto aiutando ad insegnare due corsi Unix la prossima settimana. Agli utenti verrà concesso un account su un computer RHEL 5, durante il quale aggiungeranno file alla loro /homecartella, aggiorneranno i loro .bashrce altri dotfile ed eseguiranno altri disordini generali che devono essere ripuliti.

Gli studenti della seconda sessione useranno gli account utente delle persone nella prima sessione. Vorrei automatizzare la pulizia dei loro account, in modo che i nuovi utenti possano ricominciare da capo.

Sono sicuro di poter scrivere uno script di shell che esegue un su -u $USER_IDe stabilisce un set "originale" di buoni file nel loro homedir, e rimuove qualsiasi altra cosa trovi. Ci sono altri strumenti che mi aiuteranno in questa operazione di pulizia / ripristino? Non ho alcuna esperienza con Puppet, Chef o altri strumenti. Sarebbero utili per fare qualcosa del genere?

Per fornire una portata del problema, ci sono circa 30 account utente, conosco tutti gli userid / le password e sono tutti creati nella stessa casella RHEL.


Se lo insegni probabilmente lo saprai già, ma Linux non è Unix. Il nome deriva da Linus, ma è anche un acronimo di [L] inux [i] s [n] ot [U] ni [x].
mailq,

Abbastanza vero. Ho cambiato il titolo per rifletterlo.
Matthewsteele,

Risposte:


12

Esistono molti modi per aiutare:

  • rimuovere la home directory completa e copiare tutti i file dal /etc/skelback in homedir. Cambia autorizzazioni in seguito.
  • inserire il sistema in una macchina virtuale, creare un'istantanea e ripristinare l'istantanea dopo la lezione 1
  • trova qualcosa come una modalità kiosk in RHEL. Ubuntu ha qualcosa del genere, che ripristina automaticamente la casa durante la disconnessione
  • metti la home su un filesystem btrfs, crea un'istantanea e ripristina dopo la lezione 1
  • tar la home directory prima della lezione, elimina home dopo, ripristina da tar
  • ...

E imparare altri strumenti come Puppet / Chef è un po 'troppo se vuoi risultati la prossima settimana.


Grazie. Probabilmente eseguirò un tarripristino e proverò ad imparare uno strumento come Puppet quando non sono in crisi di tempo.
Matthewsteele,

4

Supponiamo che tutti i tuoi studenti abbiano avuto un UID tra 1000 e 65000

Un veloce one-liner come questo avrebbe funzionato. Awk stamperà un comando rsync e un comando chown per ogni utente nell'intervallo. L'invio dell'output di awk in bash eseguirà tutti i comandi per ripristinare le directory e le autorizzazioni.

# 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

Se stai usando gdm per il tuo gestore degli accessi puoi aggiungere qualcosa come questo file: / 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

Il set "originale" di file di account si trova di solito sotto / etc / skel nei sistemi unix.

A parte questo, non conosco nessuno strumento per automatizzare la pulizia. Probabilmente finirei per scrivere qualche semplice script bash.


1

Prova questo

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

Potrebbe esserci qualche strumento utile che aiuterà, ma probabilmente vorrei solo (a) mettere le cose desiderate in un repository git, e (b) scrivere uno script che scorre sugli utenti e rm è la cosa desiderata e estrae dal repository git .


-2

Questo funziona con Ubuntu gnome: pico /usr/local/bin/cleanup.sh

rm -rf / home / utente / Download / *

fare lo stesso se si desidera rimuovere i documenti

esci da chmod 511 /usr/local/bin/cleanup.sh

pico / etc / gdm / PostSession / Default

! / Bin / bash

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.