Crie um .sh que defina novo nome de usuário, nome de host e senha

9

Estou distribuindo uma VM para meus alunos para um curso de programação para iniciantes. Por velocidade, em vez de fazê-los instalar o Ubuntu a partir do zero, planejo dar a eles uma imagem totalmente configurada que eles possam executar.

Para configurá-lo, eu dei a ele um nome de host sacrificial, nome de usuário e senha. Qual é a maneira mais limpa de mudar isso para os alunos quando eles começam a trabalhar?

Eu tenho tanto quanto esta essência , que tem algum progresso confiável com o nome do host, mas o nome de usuário está me resistindo mudá-la.

Eu gostaria que fosse o processo o menos doloroso possível, como deveria acontecer no primeiro laboratório.

É perfeitamente possível que exista uma abordagem completamente diferente que eu deva adotar. Estou aberto a todas as sugestões.

#!/bin/bash
clear
toilet  "     CODE1161     "  --metal --font future
echo    ""
toilet  "Let's get started!"  --metal --font future
echo    ""
echo    "We need to make this computer be YOURS"
echo    "We need a name for you and your computer, make it short or it'll take up a lot of space."
echo    "My computer is called um and my name is ben, so I get ben@um:~$ as my command prompt."
echo    ""
read -p "Enter a name for your computer:"  compname
read -p "Enter your name: "  username
echo    ""
toilet  "$username@$compname~$"  --gay --font wideterm
echo    ""
echo    "What do you think? If you hate it, press ctrl+c and do this again"
read -p "otherwise, just press enter." sacrificial

# set the host name, in a million places, for some unknown reason.
echo "1"
sed -i "/127\.0\.1\.1\s*vc/ { c \
127.0.1.1   $compname
}" /etc/hosts
echo "2"
sudo hostname -b $compname
echo "3"
sudo hostnamectl set-hostname $compname
echo "4"
sudo groupadd $username
echo "5"
sudo usermod -d /home/$username -m -g $username -l $username ben

uma captura de tela do progresso da saída

Ben
fonte
11
Talvez eu esteja errado, mas só usei expectum processo interativo para torná-lo não interativo. Basicamente, criar um script com expectcerta saída e ter a resposta já conhecida no script. Ben quer esperar pela entrada do usuário e executar um comando com base nela. É verdade que estou errado pelo menos uma vez por dia, então esse pode ser o caso.
Na verdade, sou bom com a parte que recebe a entrada do usuário. Depois de reunir o nome do host e o nome do usuário, eles são armazenados como variáveis. O que é problemático é depois disso. Ou seja, do comentário para baixo.
Ben
11
Existem algumas falhas neste método. Primeiro, você não pode alterar o caminho do usuário atual, não é possível. O prompt do bash não é atualizado quando o nome do host é alterado, é lido apenas uma vez quando o terminal é aberto. Você poderia, exec bashmas tecnicamente abrirá um terminal aninhado.
Para corrigir o problema do seu nome de host, eu o substituiria sedpor algo assim. sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts O que atualizará a linha 127.0.1.1 e anexará o novo host ao que está lá. Ele deixará o host antigo no lugar, mas é compatível com vários hosts atribuídos a um IP. Isso evitará o problema não resolvível com seu outro sudocomando, alterando o nome do host.

Respostas:

8

Por que não usar apenas uma instalação OEM para isso? Não é tão bonito, mas faz o trabalho. Se você quiser seguir esse caminho, consulte a excelente resposta da izx para esta pergunta: Como pré-instalo o Ubuntu para alguém (instalação OEM)?

Basicamente, o sistema (na primeira inicialização) solicita ao usuário várias informações para personalizar sua máquina. Isso inclui o idioma, local, nome de usuário, nome do host, senha e assim por diante. Basicamente, tudo o que seu computador normalmente solicita uma instalação.

É exatamente para isso que as imagens OEM são destinadas, e elas fazem um ótimo trabalho. Além disso, você dará a seus alunos uma pequena amostra da experiência de "instalação do Ubuntu". Porém, as instalações do Ubuntu não são exatamente dolorosas. Provavelmente, você pode fazer isso em uma única aula e dar aos alunos algum dever de casa para personalizar e explorar a VM deles. Além disso, o particionamento é divertido e doloroso !


De volta ao problema em questão (e uma resposta à sua pergunta real ) .....

Vejamos man usermodpara obter uma explicação do que está acontecendo:

RESSALVAS
   Você deve garantir que o usuário nomeado não esteja executando nenhum
   processa quando este comando está sendo executado se o código numérico do usuário
   ID do usuário, nome do usuário ou diretório inicial do usuário
   mudou. usermod verifica isso no Linux, mas apenas verifique se o usuário está
   logado de acordo com o utmp em outras arquiteturas.

Basicamente, isso significa que não podemos alterar o UID de um usuário, seu nome de usuário, diretório inicial ou qualquer coisa do tipo se o usuário estiver conectado.

Portanto, 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 ele 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 a terra do usuário aconteça, portanto o sistema executará esses comandos como root. Portanto, o benusuário não estará logado e o sistema não irá reclamar.

Você ainda pode precisar adicionar comandos adicionais a esse item para permitir mais personalização (como definir o nome real, etc.). No entanto, isso é opcional e só precisa ser feito se você desejar que ocorra durante o script de instalação.

No entanto, pode ser uma boa idéia criar apenas um novo usuário para os alunos e manter sua conta sacrificial existente. Dessa forma, se algo acontecer, você poderá entrar e reparar / administrar sua máquina, se necessário. Obviamente, se você estiver dando acesso de administrador aos alunos à VM deles, isso é meio que discutível, pois eles podem muito bem excluir o usuário "instrutor" porque são estudantes.

Kaz Wolfe
fonte
I pretende sugerir 'fazer uma instalação OEM', e então eu encontrei esta resposta :-)
sudodus
Obrigado por responder à pergunta-raiz de como atingir meu objetivo, vou instalar um OEM.
21417 Ben
0

Na tela de login, pressione-os ctrlaltF2e faça login a benpartir do terminal que abrir e executar

sudo passwd

E forneça a eles a mesma senha para root, ou seja, o número do curso; portanto, se algo acontecer, você poderá entrar e consertá-lo. Depois, faça o logout digitando exite faça o login como root com a nova senha de root e execute o script (talvez seja necessário modificá-lo para alterar o benusuário e não o root).

Ou faça com que eles efetuem login como ben no terminal pressionando ctrlaltF2(como antes) na tela de login e depois execute o script a partir daí. Isso pode funcionar porque, como Muru e Kaz Wolfe apontaram na resposta anterior, o usuário não pode estar executando nenhum processo, e o login através do terminal não deve iniciar nenhum processo, como Xou Ubuntu-Desktopou outros processos da área do usuário que interfiram usermod. (Não sei se isso funciona, não tentei, mas vale a pena tentar).

Thomas Bodrey
fonte