如何自动清除并将 Linux 用户的主目录重置为默认值?

如何自动清除并将 Linux 用户的主目录重置为默认值?

下周我将帮助教授两门 Unix 课程。用户将在 RHEL 5 机器上获得一个帐户,在此期间他们将向文件夹添加文件/home、更新他们.bashrc和其他点文件,并执行其他需要清理的一般杂乱工作。

第二期的学生将重复使用第一期学生的用户帐户。我想自动清理他们的帐户,以便新用户可以重新开始。

我确信我可以编写一个 shell 脚本,运行su -u $USER_ID并在其主目录中放置一组“原始”的好文件,并删除它找到的所有其他文件。还有其他工具可以帮助我完成这个清理/重置操作吗?我没有使用过 Puppet、Chef 或其他工具。它们对做这样的事情有帮助吗?

为了提供问题的范围,大约有 30 个用户帐户,我知道所有的用户 ID/密码,并且它们都是在同一个 RHEL 框上创建的。

答案1

有很多方法可以提供帮助:

  • 删除整个主目录并将所有文件复制/etc/skel回主目录。然后更改权限。
  • 将系统放入虚拟机,制作快照,并在第 1 课后恢复到快照
  • 在 RHEL 中找到类似 kiosk 模式的东西。Ubuntu 有类似的东西,它会在注销时自动恢复主页
  • 将主目录放在 btrfs 文件系统上,制作快照,并在第 1 课后恢复
  • tar课前的主目录,课后删除主目录,从中恢复tar
  • ...

如果您想在下周获得结果,那么学习 Puppet/Chef 等其他工具就有点太多了。

答案2

假设所有学生的 UID 都在 1000 到 65000 之间

像这样的快速单行命令就可以了。Awk 将为范围内的每个用户打印出 rsync 命令和 chown 命令。将 awk 的输出发送到 bash 将运行所有命令来重置目录和权限。

# 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 )

答案3

如果你使用 gdm 作为登录管理器,你可以添加类似这样的文件:/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

答案4

尝试这个

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

相关内容