Por que não apenas usar uma instalação OEM para isso? Não é tão bonito, mas faz o trabalho. Se você quiser seguir esse caminho, veja a excelente resposta do izx a essa pergunta: Como faço para pré-instalar o Ubuntu para alguém (instalação OEM)?
Basicamente, o sistema irá (na primeira inicialização) solicitar ao usuário um monte de informações para personalizar sua máquina. Isso inclui o idioma, o local, o nome de usuário, o nome do host, a senha e assim por diante. Basicamente, tudo o que seu computador normalmente solicitará para uma instalação.
Isto é exatamente para o que as imagens OEM são destinadas, e elas fazem um ótimo trabalho. Além disso, você dará aos seus alunos uma pequena amostra da experiência "instalar o Ubuntu". Porém, o Ubuntu instala não é exatamente doloroso. Você provavelmente pode fazer isso em uma única aula e dar aos seus alunos um pouco de lição de casa para personalizar e explorar sua VM. Além disso, o particionamento é doloroso divertido!
Voltar para o problema em questão (e uma resposta à sua pergunta atual ) .....
Vamos analisar man usermod
para obter uma explicação sobre o que está acontecendo:
CAVEATS You must make certain that the named user is not executing any processes when this command is being executed if the user's numerical user ID, the user's name, or the user's home directory is being changed. usermod checks this on Linux, but only check if the user is logged in according to utmp on other architectures.
Basicamente, isso significa que não podemos alterar o UID de um usuário, seu nome de usuário, diretório pessoal ou qualquer coisa do tipo, se o usuário estiver logado.
Então, podemos fazer algumas coisas divertidas para configurar isso na próxima inicialização do sistema. Em vez de o seu script fazer o trabalho, fazemos com que o seu script crie outro script para fazer todo o trabalho pesado e manipulação. Um exemplo disso:
# Make the first-run script
touch /etc/init.d/firstrun-setup.sh
# Add in user modifier
echo "usermod -d /home/$username -m -g $username -l $username ben" >> /etc/init.d/firstrun-setup.sh
# Add in group rename
echo "groupmod -n $username ben" >> /etc/init.d/firstrun-setup.sh
# Add in password expiry
echo "passwd -e $username" >> /etc/init.d/firstrun-setup.sh
# Add in file self-destruct
echo "rm /etc/init.d/firstrun-setup.sh" >> /etc/init.d/firstrun-setup.sh
# Mark the file as executable
chmod a+x /etc/init.d/firstrun-setup.sh
# Reboot the computer
reboot
Basicamente, ao fazer isso, você está "enfileirando" eventos para executar na próxima inicialização do sistema. Isso será executado antes que o userland aconteça, portanto o sistema executará esses comandos como root. Portanto, o usuário ben
não estará logado e o sistema não irá reclamar.
Você ainda pode precisar adicionar comandos adicionais para isso para permitir mais personalização (como definir o nome real, etc). No entanto, isso é opcional e só precisa ser feito se você quiser que ocorra durante o script de configuração.
No entanto, pode ser uma boa ideia apenas criar um novo usuário para os alunos e manter sua conta sacrificial em vigor. Desta forma, se algo acontecer, você pode entrar e reparar / administrar sua máquina se for necessário. É claro que, se você está dando aos seus alunos acesso de administrador às VMs, isso é um ponto discutível, já que eles podem excluir o usuário "instrutor" porque são estudantes.