Créez un .sh qui définit le nouveau nom d'utilisateur, le nom d'hôte et le mot de passe

9

Je distribue une VM à mes étudiants pour un cours de programmation pour débutants. Pour la vitesse, au lieu de leur faire installer Ubuntu à partir de zéro, je prévois de leur donner une image entièrement configurée qu'ils peuvent simplement exécuter.

Afin de le configurer, je lui ai donné un nom d'hôte, un nom d'utilisateur et un mot de passe sacrificiels. Quelle est la façon la plus propre de changer cela pour les élèves lorsqu'ils se lèvent et courent?

J'ai aussi loin que ce point essentiel , qui a des progrès peu fiables avec le nom d' hôte, mais le nom d' utilisateur me résistais changer.

Je voudrais que ce soit un processus aussi indolore que possible car cela est censé se produire dans leur premier laboratoire.

Il est tout à fait possible qu'il y ait une approche complètement différente que je devrais adopter. Je suis ouvert à toutes les suggestions.

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

une capture d'écran de la progression de la sortie

Ben
la source
1
Je me trompe peut-être, mais je n'ai jamais utilisé expectqu'un processus interactif pour le rendre non interactif. Fondamentalement, faire un script qui sort expectcertain et avoir la réponse déjà connue dans le script. Ben veut attendre l'entrée de l'utilisateur et exécuter une commande basée sur celle-ci. Certes, je me trompe au moins une fois par jour, donc cela pourrait être le cas.
En fait, je suis bon pour la partie qui prend les commentaires des utilisateurs. Une fois que j'ai rassemblé le nom d'hôte et le nom d'utilisateur, ils sont stockés sous forme de variables. Le morceau qui est gênant est après cela. C'est à dire du commentaire vers le bas.
Ben
1
Il y a quelques défauts dans cette méthode. Premièrement, vous ne pouvez pas modifier le chemin d'accès des utilisateurs actuels, ce n'est pas possible. L'invite bash n'est pas mise à jour lorsque le nom d'hôte change, elle n'est lue qu'une seule fois lorsque le terminal est ouvert. Vous pourriez exec bashmais cela ouvrira techniquement un terminal imbriqué.
Pour résoudre votre problème de nom d'hôte, je remplacerais le vôtre sedpar quelque chose comme ceci sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts . Il laissera l'ancien hôte en place, mais il est compatible d'avoir plusieurs hôtes affectés à une IP. Cela évitera le problème insoluble avec votre autre sudocommande, en changeant le nom d'hôte.

Réponses:

8

Pourquoi ne pas simplement utiliser une installation OEM pour cela? Ce n'est pas aussi joli, mais ça fait le travail. Si vous souhaitez emprunter cette voie, consultez l'excellente réponse d'izx à cette question: comment pré-installer Ubuntu pour quelqu'un (installation OEM)?

Fondamentalement, le système demandera (au premier démarrage) à l'utilisateur un tas d'informations pour personnaliser sa machine. Cela inclut la langue, l'emplacement, le nom d'utilisateur, le nom d'hôte, le mot de passe, etc. Fondamentalement, tout ce que votre ordinateur vous demandera généralement pour une installation.

C'est exactement à cela que les images OEM sont destinées, et elles font un excellent travail. De plus, vous donnerez à vos étudiants un petit avant-goût de l'expérience «installer Ubuntu». Cependant, les installations Ubuntu ne sont pas vraiment douloureuses. Vous pouvez probablement le faire dans une seule classe et donner à vos élèves des devoirs pour personnaliser et explorer leur machine virtuelle. De plus, le partitionnement est un plaisir douloureux !


Revenons au problème en question (et une réponse à votre question réelle ) .....

Regardons man usermodpour avoir une explication de ce qui se passe:

CAVEATS
   Vous devez vous assurer que l'utilisateur nommé n'exécute aucun
   traite lorsque cette commande est en cours d'exécution si l'utilisateur numérique
   l'ID utilisateur, le nom de l'utilisateur ou le répertoire personnel de l'utilisateur est en cours
   modifié. usermod vérifie cela sous Linux, mais vérifie seulement si l'utilisateur est
   connecté selon utmp sur d'autres architectures.

Fondamentalement, cela signifie simplement que nous ne pouvons pas modifier l'UID d'un utilisateur, son nom d'utilisateur, son répertoire personnel ou quoi que ce soit de ce genre si l'utilisateur est connecté.

Donc, nous pouvons faire des choses amusantes pour configurer cela au prochain démarrage du système. Au lieu que votre script fasse le travail, nous faisons en sorte que votre script crée un autre script pour faire tout le gros du travail et la manipulation. Un exemple de ceci:

# 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

Fondamentalement, en faisant cela, vous "mettez en file d'attente" les événements à exécuter au prochain démarrage du système. Cela s'exécutera avant que l'espace utilisateur ne se produise, donc le système exécutera ces commandes en tant que root. Par conséquent, l' benutilisateur ne sera pas connecté et le système ne se plaindra pas.

Vous devrez peut-être encore ajouter des commandes supplémentaires à cette chose pour permettre plus de personnalisation (comme définir le nom réel, etc.). Cependant, cela est facultatif et ne doit être effectué que si vous souhaitez que cela ait lieu pendant le script de configuration.

Cependant, il peut être judicieux de créer un nouvel utilisateur entièrement pour les étudiants, puis de conserver votre compte sacrificiel existant en place. De cette façon, si quelque chose se passe, vous pouvez aller réparer et administrer leur machine si nécessaire. Bien sûr, si vous donnez à vos étudiants un accès administrateur à leur machine virtuelle, il s'agit en quelque sorte d'un point discutable car ils pourraient très bien supprimer l'utilisateur "instructeur" car ils sont étudiants.

Kaz Wolfe
la source
J'avais l'intention de suggérer 'de faire une installation OEM', puis j'ai trouvé cette réponse :-)
sudodus
Merci d'avoir répondu à la question fondamentale de savoir comment atteindre ma fin, je vais aller avec une installation OEM.
Ben
0

À l'écran de connexion, demandez-leur d'appuyer sur ctrlaltF2et de se connecter à benpartir du terminal qui s'ouvre et s'exécute

sudo passwd

Et donnez-leur tous le même mot de passe pour root, c'est-à-dire le numéro du cours, donc si quelque chose se casse, vous pouvez aller le réparer. Demandez-leur ensuite de se déconnecter en tapant exitet de se connecter en tant que root avec leur nouveau mot de passe root et d'exécuter le script (vous devrez peut-être le modifier pour qu'il modifie l' benutilisateur et non root).

Ou, demandez-leur de se connecter en tant que ben à partir du terminal en appuyant sur ctrlaltF2(comme avant) sur l'écran de connexion et demandez-leur d'exécuter le script à partir de là. Cela pourrait fonctionner car, comme Muru et Kaz Wolfe l'ont souligné dans la réponse précédente, l'utilisateur ne peut exécuter aucun processus, et la connexion via le terminal ne doit pas démarrer de processus, tels que Xou Ubuntu-Desktop, ou d'autres processus de l'espace utilisateur qui interfèrent avec usermod. (Je ne sais pas si cela fonctionne, je ne l'ai pas essayé, mais ça vaut le coup d'essayer).

Thomas Bodrey
la source