Estoy distribuyendo una VM a mis alumnos para un curso de programación para principiantes. En cuanto a la velocidad, en lugar de hacer que instalen Ubuntu desde cero, planeo darles una imagen completamente configurada que puedan ejecutar.
Para configurarlo, le he dado un nombre de host, nombre de usuario y contraseña sacrificados. ¿Cuál es la forma más limpia de cambiar esto para los estudiantes cuando se ponen en marcha?
Llegué a esta esencia , que tiene un progreso poco confiable con el nombre de host, pero el nombre de usuario se resiste a cambiarlo.
Me gustaría que fuera un proceso tan indoloro como sea posible, ya que se supone que esto suceda en su primer laboratorio.
Es completamente posible que haya un enfoque completamente diferente que deba adoptar. Estoy abierto a todas las sugerencias.
#!/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
tomar un proceso interactivo y hacerlo no interactivo. Básicamente, hacer un script queexpect
tenga cierta salida y tener la respuesta ya conocida en el script. Ben quiere esperar la entrada del usuario y ejecutar un comando basado en él. De acuerdo, me equivoco al menos una vez al día, así que este podría ser el caso.exec bash
pero técnicamente abrirá una terminal anidada.sed
con algo como esto ...sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts
que actualizará la línea 127.0.1.1 y simplemente agregará el nuevo host a lo que está allí. Dejará el host anterior en su lugar, pero es compatible con tener varios hosts asignados a una IP. Eso evitará el problema irresoluble con su otrosudo
comando, cambiando el nombre de host.Respuestas:
¿Por qué no usar una instalación OEM para esto? No es tan bonito, pero hace el trabajo. Si desea seguir esta ruta, vea la excelente respuesta de izx a esta pregunta: ¿Cómo preinstalo Ubuntu para alguien (instalación OEM)?
Básicamente, el sistema (en el primer arranque) solicitará al usuario mucha información para personalizar su máquina. Esto incluye el idioma, la ubicación, el nombre de usuario, el nombre de host, la contraseña, etc. Básicamente, todo lo que su computadora generalmente le solicitará para una instalación.
Esto es exactamente para lo que están hechas las imágenes OEM, y hacen un gran trabajo al respecto. Además, les dará a sus alumnos una pequeña muestra de la experiencia de "instalar Ubuntu". Sin embargo, las instalaciones de Ubuntu no son exactamente dolorosas. Probablemente pueda hacerlo en una sola clase y darles a sus alumnos tareas para personalizar y explorar su VM. Además, la partición es
unadiversióndolorosa.Volviendo al problema en cuestión (y una respuesta a su pregunta real ) .....
Veamos
man usermod
para obtener una explicación de lo que está sucediendo:Básicamente, esto solo significa que no podemos cambiar el UID de un usuario, su nombre de usuario, directorio de inicio, ni nada por el estilo si el usuario ha iniciado sesión.
Entonces, podemos hacer algunas cosas divertidas para configurar esto en el próximo arranque del sistema. En lugar de que su guión haga el trabajo, hacemos que su guión haga otro guión para hacer todo el trabajo pesado y la manipulación. Un ejemplo de esto:
Básicamente, al hacer esto, estás "haciendo cola" para ejecutar eventos en el próximo arranque del sistema. Esto se ejecutará antes de que ocurra el área de usuario, por lo que el sistema ejecutará estos comandos como root. Por lo tanto, el
ben
usuario no iniciará sesión y el sistema no se quejará.Es posible que aún necesite agregar comandos adicionales a esta cosa para permitir una mayor personalización (como configurar el nombre real, etc.). Sin embargo, esto es opcional y solo debe hacerse si desea que tenga lugar durante el script de configuración.
Sin embargo, puede ser una buena idea crear un nuevo usuario para los estudiantes por completo, y luego mantener su cuenta de sacrificio existente en su lugar. De esta manera, si sucede algo, puede entrar y reparar / administrar su máquina si es necesario. Por supuesto, si le está dando a sus estudiantes acceso de administrador a su VM, este es un punto discutible ya que podrían eliminar al usuario "instructor" porque son estudiantes.
fuente
En la pantalla de inicio de sesión, haga que presionen ctrlaltF2e inicien sesión
ben
desde el terminal que se abre y ejecutaY deles la misma contraseña para root, es decir, el número del curso, de modo que si algo se rompe, puede ingresar y arreglarlo. Luego
exit
haga que cierren la sesión escribiendo e inicien sesión como root con su nueva contraseña de root y ejecuten el script (puede que tenga que modificarlo para que altere alben
usuario y no al root).O bien, haga que inicien sesión como ben desde la terminal presionando ctrlaltF2(como antes) en la pantalla de inicio de sesión y pídales que ejecuten el script desde allí. Esto podría funcionar porque, como señalaron Muru y Kaz Wolfe en la respuesta anterior, el usuario no puede ejecutar ningún proceso, y el inicio de sesión a través del terminal no debería iniciar ningún proceso, como
X
uUbuntu-Desktop
, u otros procesos de usuario que interfieranusermod
. (No sé si esto funciona, no lo he probado, pero vale la pena intentarlo).fuente