Haga un .sh que establezca un nuevo nombre de usuario, nombre de host y contraseña

9

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

una captura de pantalla del progreso de salida

Ben
fuente
1
Tal vez estoy equivocado, pero solo solía expecttomar un proceso interactivo y hacerlo no interactivo. Básicamente, hacer un script que expecttenga 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.
En realidad, soy bueno para la parte que toma la entrada del usuario. Una vez que he reunido el nombre de host y el nombre de usuario, se almacenan como variables. Lo que es problemático es después de eso. Es decir, desde el comentario abajo.
Ben
1
Hay algunos defectos en este método. Uno, no puede cambiar la ruta de los usuarios actuales, no es posible. La solicitud de bash no se actualiza cuando cambia el nombre de host, solo se lee una vez cuando se abre el terminal. Podría, exec bashpero técnicamente abrirá una terminal anidada.
Para solucionar su problema de nombre de host, lo reemplazaría sedcon 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 otro sudocomando, cambiando el nombre de host.

Respuestas:

8

¿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 una diversión dolorosa .


Volviendo al problema en cuestión (y una respuesta a su pregunta real ) .....

Veamos man usermodpara obtener una explicación de lo que está sucediendo:

CUEVAS
   Debe asegurarse de que el usuario nombrado no esté ejecutando
   se procesa cuando se ejecuta este comando si el valor numérico del usuario
   ID de usuario, el nombre del usuario o el directorio de inicio del usuario
   cambiado usermod verifica esto en Linux, pero solo verifica si el usuario está
   conectado de acuerdo con utmp en otras arquitecturas.

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:

# 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

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 benusuario 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.

Kaz Wolfe
fuente
Tenía la intención de sugerir 'hacer una instalación OEM', y luego encontré esta respuesta :-)
sudodus
Gracias por responder la pregunta raíz de cómo lograr mi objetivo, voy a ir con una instalación OEM.
Ben
0

En la pantalla de inicio de sesión, haga que presionen ctrlaltF2e inicien sesión bendesde el terminal que se abre y ejecuta

sudo passwd

Y 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 exithaga 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 al benusuario 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 Xu Ubuntu-Desktop, u otros procesos de usuario que interfieran usermod. (No sé si esto funciona, no lo he probado, pero vale la pena intentarlo).

Thomas Bodrey
fuente