Crea un .sh che imposta nuovo nome utente, nome host e password


9

Sto distribuendo una VM ai miei studenti per un corso di programmazione per principianti. Per velocità, invece di far loro installare Ubuntu da zero, sto pensando di dare loro un'immagine completamente configurata che possono semplicemente eseguire.

Per configurarlo, gli ho assegnato un nome host, un nome utente e una password sacrificali. Qual è il modo più pulito di cambiarlo per gli studenti quando si alzano e funzionano?

Sono arrivato a questo punto , che ha alcuni progressi inaffidabili con il nome host, ma il nome utente mi sta resistendo cambiando.

Vorrei che fosse un processo il più indolore possibile come dovrebbe accadere nel loro primo laboratorio.

È del tutto possibile che debba adottare un approccio completamente diverso. Sono aperto a tutti i suggerimenti.

#!/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 schermata dell'avanzamento dell'output



1
Forse mi sbaglio, ma ho sempre usato solo expectun processo interattivo e renderlo non interattivo. Fondamentalmente, creare uno script che produce un expectdeterminato output e avere la risposta già nota nello script. Ben vuole attendere l'input dell'utente ed eseguire un comando basato su di esso. Certo, mi sbaglio almeno una volta al giorno, quindi potrebbe essere così.

In realtà, sono bravo per la parte che richiede l'input dell'utente. Dopo aver raccolto il nome host e il nome utente, vengono memorizzati come variabili. Il peggio è dopo. Vale a dire dal commento in basso.
Ben

1
Ci sono alcuni difetti in questo metodo. Uno, non puoi cambiare il percorso degli utenti attuali, non è possibile. Il prompt di bash non viene aggiornato quando cambia il nome host, viene letto solo una volta quando viene aperto il terminale. Potresti, exec bashma tecnicamente aprirà un terminale nidificato.

Per risolvere il problema del tuo nome host, lo sostituirei sedcon qualcosa del genere .. sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts Che aggiornerà la riga 127.0.1.1 e aggiungerebbe semplicemente il nuovo host a quello che c'è. Lascia il vecchio host al suo posto, ma è conforme avere più host assegnati a un solo IP. Ciò impedirà il problema irrisolvibile con l'altro sudocomando, modificando il nome host.

Risposte:


8

Perché non usare solo un'installazione OEM per questo? Non è così carino, ma fa il lavoro. Se vuoi seguire questa strada, vedi l'eccellente risposta di izx a questa domanda: come posso preinstallare Ubuntu per qualcuno (installazione OEM)?

Fondamentalmente, il sistema (al primo avvio) richiederà all'utente una serie di informazioni per personalizzare la propria macchina. Ciò include lingua, posizione, nome utente, nome host, password e così via. Fondamentalmente, tutto ciò che il tuo computer ti richiederà di solito per un'installazione.

Questo è esattamente ciò a cui sono destinate le immagini OEM e fanno un ottimo lavoro. Inoltre, darai ai tuoi studenti un piccolo assaggio dell'esperienza "installa Ubuntu". Tuttavia, le installazioni di Ubuntu non sono esattamente dolorose. Probabilmente puoi farlo in una sola classe e dare ai tuoi studenti alcuni compiti per personalizzare ed esplorare la loro VM. Inoltre, il partizionamento è doloroso divertente!


Torna al problema attuale (e una risposta alla tua vera domanda) .....

Diamo un'occhiata man usermodper ottenere una spiegazione per quello che sta succedendo:

CAVEATS
   È necessario accertarsi che l'utente nominato non stia eseguendo alcuno
   elabora quando questo comando viene eseguito se l'utente è numerico
   ID utente, nome dell'utente o home directory dell'utente
   cambiato. usermod controlla questo su Linux, ma controlla solo se l'utente lo è
   effettuato l'accesso secondo utmp su altre architetture.

Fondamentalmente, questo significa che non possiamo modificare l'UID di un utente, il suo nome utente, la home directory o qualcosa del genere se l'utente ha effettuato l'accesso.

Quindi, possiamo fare alcune cose divertenti per configurarlo al prossimo avvio del sistema. Invece che la tua sceneggiatura faccia il lavoro, facciamo in modo che la tua sceneggiatura crei un'altra sceneggiatura per fare tutto il lavoro pesante e manipolazione. Un esempio di questo:

# 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

Fondamentalmente, facendo questo, stai "accodando" gli eventi da eseguire al prossimo avvio del sistema. Questo verrà eseguito prima che si verifichi l'area utente, quindi il sistema eseguirà questi comandi come root. Pertanto, l' benutente non avrà effettuato l'accesso e il sistema non si lamenterà.

Potrebbe essere necessario aggiungere ulteriori comandi a questa cosa per consentire una maggiore personalizzazione (come l'impostazione del nome effettivo, ecc.). Tuttavia, questo è facoltativo e deve essere eseguito solo se si desidera che avvenga durante lo script di installazione.

Tuttavia, potrebbe essere una buona idea creare un nuovo utente per gli studenti interamente e quindi mantenere il tuo account sacrificale esistente sul posto. In questo modo, se succede qualcosa, puoi entrare e riparare / amministrare la loro macchina, se necessario. Naturalmente, se stai dando ai tuoi studenti l'accesso come amministratore alla loro VM, questo è una specie di punto controverso in quanto potrebbero eliminare l'utente "istruttore" perché sono studenti.


Intendevo suggerire "fai un'installazione OEM", e poi ho trovato questa risposta :-)
sudodus,

Grazie per aver risposto alla domanda principale su come raggiungere il mio scopo, vado con un'installazione OEM.
Ben

0

Nella schermata di accesso, fai premere ctrlaltF2e accedi come bendal terminale che si apre ed esegue

sudo passwd

E dai loro la stessa password per root, ovvero il numero del corso, quindi se qualcosa si rompe, puoi entrare e risolverlo. Quindi esegui la disconnessione digitando exite accedi come root con la nuova password di root ed esegui lo script (potresti doverlo modificare in modo da alterare l' benutente e non root).

Oppure, fai in modo che accedano come ben dal terminale premendo ctrlaltF2(come prima) nella schermata di accesso e fai in modo che eseguano lo script da lì. Ciò potrebbe funzionare perché, come indicato da Muru e Kaz Wolfe nella risposta precedente, l'utente non può eseguire alcun processo e l'accesso tramite il terminale non dovrebbe avviare alcun processo, come Xo Ubuntu-Desktop, o altri processi utente che interferiscono con usermod. (Non so se funziona, non l'ho provato, ma vale la pena provare).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.