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
expect
- admin-magazine.com/Articles/Automating-with-Expect-Scriptsexpect
qu'un processus interactif pour le rendre non interactif. Fondamentalement, faire un script qui sortexpect
certain 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.exec bash
mais cela ouvrira techniquement un terminal imbriqué.sed
par quelque chose comme cecisudo 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 autresudo
commande, en changeant le nom d'hôte.Réponses:
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
unplaisirdouloureux!Revenons au problème en question (et une réponse à votre question réelle ) .....
Regardons
man usermod
pour avoir une explication de ce qui se passe: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:
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'
ben
utilisateur 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.
la source
À l'écran de connexion, demandez-leur d'appuyer sur ctrlaltF2et de se connecter à
ben
partir du terminal qui s'ouvre et s'exécuteEt 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
exit
et 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'ben
utilisateur 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
X
ouUbuntu-Desktop
, ou d'autres processus de l'espace utilisateur qui interfèrent avecusermod
. (Je ne sais pas si cela fonctionne, je ne l'ai pas essayé, mais ça vaut le coup d'essayer).la source