9 votes

Faites un fichier .sh qui définit un nouveau nom d'utilisateur, nom d'hôte et mot de passe

Je distribue une machine virtuelle à mes étudiants pour un cours de programmation pour débutants. Pour gagner du temps, au lieu de leur demander d'installer Ubuntu à partir de zéro, je prévois de leur donner une image entièrement configurée qu'ils pourront simplement exécuter.

Pour la configurer, j'ai attribué un nom d'hôte, un nom d'utilisateur et un mot de passe sacrifiables. Quel est le moyen le plus propre de le changer pour les étudiants lorsqu'ils seront opérationnels?

Je suis allé jusqu'à ce gist, qui a quelques progrès peu fiables avec le nom d'hôte, mais le nom d'utilisateur me résiste pour le changement.

Je voudrais que ce processus soit aussi indolore que possible car cela doit se faire lors de leur premier laboratoire.

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

#!/bin/bash
clear
toilet  "     CODE1161     "  --metal --font future
echo    ""
toilet  "Commençons!"  --metal --font future
echo    ""
echo    "Nous devons faire de cet ordinateur le VÔTRE"
echo    "Nous avons besoin d'un nom pour vous et votre ordinateur, faites-le court sinon cela prendra beaucoup de place."
echo    "Mon ordinateur s'appelle um et je m'appelle ben, donc j'obtiens ben@um:~$ comme invite de commande."
echo    ""
read -p "Entrez un nom pour votre ordinateur:"  compname
read -p "Entrez votre nom : "  username
echo    ""
toilet  "$username@$compname~$"  --gay --font wideterm
echo    ""
echo    "Qu'en pensez-vous? Si vous détestez, appuyez sur ctrl+c et recommencez"
read -p "sinon, appuyez juste sur Entrée." sacrificial

# définir le nom d'hôte, à des millions d'endroits, pour une raison inconnue.
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

8voto

Kaz Wolfe Points 32777

Pourquoi ne pas simplement utiliser une installation OEM pour cela? Ce n'est pas aussi joli, mais cela fait l'affaire. Si vous voulez suivre cette voie, consultez l'excellente réponse de izx à cette question : Comment puis-je pré-installer Ubuntu pour quelqu'un (installation OEM)?

Fondamentalement, le système va (au premier démarrage) demander à l'utilisateur une série 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, et ainsi de suite. Fondamentalement, tout ce que votre ordinateur vous demande habituellement lors d'une installation.

C'est exactement à quoi servent les images OEM, et elles font du bon travail. De plus, vous donnerez à vos étudiants un petit aperçu de l'expérience "installer Ubuntu". Bien que les installations Ubuntu ne soient pas exactement pénibles. Vous pouvez probablement le faire en une seule classe, et donner à vos étudiants des devoirs pour personnaliser et explorer leur VM. De plus, le partitionnement est pénible amusant !


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

Regardons man usermod pour obtenir une explication de ce qui se passe :

AVIS Vous devez vous assurer que l'utilisateur nommé n'exécute aucun processus lorsque cette commande est exécutée si l'ID utilisateur numérique de l'utilisateur, le nom de l'utilisateur, ou le répertoire d'accueil de l'utilisateur est modifié. usermod vérifie cela sur Linux, mais ne vérifie que si l'utilisateur est connecté selon utmp sur d'autres architectures.

Fondamentalement, cela signifie simplement que nous ne pouvons pas changer l'UID d'un utilisateur, leur nom d'utilisateur, leur répertoire d'accueil, ou quoi que ce soit du genre si l'utilisateur est connecté.

Nous pouvons donc faire quelques 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 effectuer tout le travail lourd et la manipulation. Un exemple :

# Créer le script de première exécution
touch /etc/init.d/firstrun-setup.sh

# Ajouter le modificateur utilisateur
echo "usermod -d /home/$username -m -g $username -l $username ben" >> /etc/init.d/firstrun-setup.sh

# Ajouter le renommage du groupe
echo "groupmod -n $username ben" >> /etc/init.d/firstrun-setup.sh

# Ajouter l'expiration du mot de passe
echo "passwd -e $username" >> /etc/init.d/firstrun-setup.sh

# Ajouter l'auto-destruction du fichier 
echo "rm /etc/init.d/firstrun-setup.sh" >> /etc/init.d/firstrun-setup.sh

# Marquer le fichier comme exécutable
chmod a+x /etc/init.d/firstrun-setup.sh

# Redémarrer l'ordinateur
reboot

En faisant cela, vous "planifiez" les événements pour s'exécuter au prochain démarrage du système. Cela se déroulera avant l'interface utilisateur, donc le système exécutera ces commandes en tant que root. Par conséquent, l'utilisateur ben ne sera pas connecté, et le système ne se plaindra pas.

Vous devrez peut-être ajouter des commandes supplémentaires à cette chose pour permettre une plus grande personnalisation (comme définir le nom réel, etc). Cependant, c'est facultatif et ne doit être fait que si vous voulez que cela se déroule pendant le script de configuration.

Cela dit, il peut être judicieux de simplement créer un nouvel utilisateur pour les étudiants en entier, et de conserver votre compte sacrifié existant en place. De cette façon, si quelque chose se passe, vous pouvez intervenir et réparer/administrer leur machine si nécessaire. Bien sûr, si vous donnez à vos étudiants un accès administratif à leur VM, cela devient un peu futile car ils pourraient très bien supprimer l'utilisateur "instructeur" car ce sont des étudiants.

0voto

Thomas Bodrey Points 41

Sur l'écran de connexion, demandez-leur d'appuyer sur ctrlaltF2 et de se connecter en tant que ben à partir du terminal qui s'ouvre et d'exécuter

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 ne fonctionne pas, vous pouvez y accéder et le réparer. Ensuite, demandez-leur 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'utilisateur ben et non root).

Ou, demandez-leur de se connecter en tant que ben depuis le terminal en appuyant sur ctrlaltF2 (comme avant) sur l'écran de connexion et demandez-leur ensuite d'exécuter le script à partir de là. Cela pourrait fonctionner car comme l'ont souligné Muru et Kaz Wolfe dans la réponse précédente, l'utilisateur ne peut pas exécuter de processus, et se connecter via le terminal ne devrait pas non plus démarrer de processus tels que X ou Ubuntu-Desktop, ou d'autres processus 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).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X