Como automatizar a limpeza e a redefinição do diretório inicial de um usuário Linux para um padrão?

8

Estou ajudando a ministrar dois cursos Unix na próxima semana. Será concedida aos usuários uma conta em uma máquina RHEL 5, durante a qual eles adicionarão arquivos à sua /homepasta, atualizarão seus .bashrce outros arquivos de pontos e realizarão outra confusão geral que precisa ser limpa.

Os alunos da segunda sessão reutilizarão as contas de usuário das pessoas na primeira sessão. Gostaria de automatizar a limpeza de suas contas, para que novos usuários possam começar de novo.

Tenho certeza de que poderia escrever um script de shell que execute su -u $USER_IDe estabeleça um conjunto "original" de bons arquivos em sua casa e remova qualquer outra coisa que encontrar. Existem outras ferramentas que me ajudarão nessa operação de limpeza / redefinição? Eu não tenho nenhuma experiência com Puppet, Chef ou outras ferramentas. Eles seriam úteis para fazer algo assim?

Para fornecer um escopo do problema, existem cerca de 30 contas de usuário, conheço todas as IDs de usuário / senhas e todas elas são criadas na mesma caixa RHEL.

matthewsteele
fonte
Se você ensiná-lo, provavelmente já o saberá, mas o Linux não é o Unix. O nome vem de Linus, mas também é um acrônimo para [L] inux [i] s [n] ot [U] ni [x].
mailq
É verdade. Eu mudei o título para refleti-lo.
matthewsteele

Respostas:

12

Há muitas maneiras de ajudar:

  • remova o diretório inicial completo e copie todos os arquivos de /etc/skelvolta para o homedir. Altere as permissões posteriormente.
  • coloque o sistema em uma máquina virtual, faça uma captura instantânea e reverta para a captura instantânea após a lição 1
  • encontre algo como um modo de quiosque no RHEL. O Ubuntu tem algo assim, que restaura automaticamente a casa durante o logoff
  • coloque a casa em um sistema de arquivos btrfs, faça um instantâneo e reverta após a lição 1
  • tar o diretório inicial antes da lição, exclua o arquivo inicial depois, restaure de tar
  • ...

E aprender outras ferramentas como Puppet / Chef é um pouco demais se você deseja resultados na próxima semana.

mailq
fonte
Obrigado. Provavelmente, executarei tare restaurarei e tentarei aprender uma ferramenta como o Puppet quando não estiver com problemas de tempo.
matthewsteele
4

Digamos que todos os seus alunos tenham um UID entre 1000 e 65000

Uma linha rápida como essa funcionaria. O Awk imprimirá um comando rsync e um comando chown para todos os usuários no intervalo. Enviar a saída do awk para o bash executará todos os comandos para redefinir diretórios e permissões.

# 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 )
Zoredache
fonte
2

Se você estiver usando o gdm para o seu gerenciador de login, poderá adicionar algo como este arquivo: / 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
Andrew Case
fonte
1

O conjunto "original" de arquivos de conta geralmente está localizado em / etc / skel em sistemas unix.

Além disso, não conheço nenhuma ferramenta para automatizar a limpeza. Eu provavelmente acabaria escrevendo um script bash simples.

user683887
fonte
1

Tente isto

#!/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.
memogh
fonte
0

Pode haver alguma ferramenta interessante que ajude, mas eu provavelmente (a) colocaria o material desejado em um repositório git e (b) escrevia um script que itera sobre os usuários e rm é o material desejado e extrai do repositório git .

Kevin Beam
fonte
-2

Isso funciona para o gnome do Ubuntu: pico /usr/local/bin/cleanup.sh

rm -rf / home / user / Downloads / *

faça o mesmo se quiser remover o Documents

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

pico / etc / gdm / PostSession / Padrão

! / bin / bash

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

kongwu
fonte