Erstellen Sie eine .sh, die einen neuen Benutzernamen, Hostnamen und ein neues Kennwort festlegt

9

Ich verteile eine VM an meine Schüler für einen Programmierkurs für Anfänger. Anstatt sie dazu zu bringen, Ubuntu von Grund auf neu zu installieren, plane ich, ihnen ein vollständig eingerichtetes Image zu geben, das sie einfach ausführen können.

Um es einzurichten, habe ich ihm einen Opfer-Hostnamen, einen Benutzernamen und ein Passwort gegeben. Was ist der sauberste Weg, dies für die Schüler zu ändern, wenn sie in Betrieb sind?

Ich bin bis zu diesem Kern gekommen , der einige unzuverlässige Fortschritte mit dem Hostnamen hat, aber der Benutzername widersetzt sich mir, ihn zu ändern.

Ich möchte, dass es so schmerzlos wie möglich ist, wie dies in ihrem ersten Labor geschehen soll.

Es ist durchaus möglich, dass ich einen völlig anderen Ansatz wählen sollte. Ich bin offen für alle Vorschläge.

#!/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

Ein Screenshot des Ausgabefortschritts

Ben
quelle
1
Vielleicht irre ich mich, aber ich habe immer nur expecteinen interaktiven Prozess durchgeführt und ihn nicht interaktiv gemacht. Grundsätzlich erstellen Sie ein Skript, das expectbestimmte Ausgaben und die Antwort bereits im Skript bekannt. Ben möchte auf Benutzereingaben warten und einen darauf basierenden Befehl ausführen. Zugegeben, ich irre mich mindestens einmal am Tag, also könnte dies der Fall sein.
Eigentlich bin ich gut für den Teil, der Benutzereingaben nimmt. Sobald ich Hostname und Benutzername gesammelt habe, werden sie als Variablen gespeichert. Das bisschen, das lästig ist, ist danach. Dh vom Kommentar abwärts.
Ben
1
Diese Methode weist einige Mängel auf. Erstens können Sie den aktuellen Benutzerpfad nicht ändern, es ist nicht möglich. Die Bash-Eingabeaufforderung wird nicht aktualisiert, wenn sich der Hostname ändert. Sie wird nur einmal gelesen, wenn das Terminal geöffnet wird. Sie könnten, exec bashaber es wird technisch ein verschachteltes Terminal öffnen.
Um Ihr Problem mit dem Hostnamen zu beheben, würde ich Ihr Problem durch Folgendes ersetzen sed. sudo sed -i "s/127.0.1.1/& $compname/" /etc/hostsDadurch wird die Zeile 127.0.1.1 aktualisiert und der neue Host einfach an das angehängt, was sich dort befindet. Der alte Host bleibt an Ort und Stelle, es ist jedoch konform, wenn einer IP mehrere Hosts zugewiesen sind. Dadurch wird das unlösbare Problem mit Ihrem anderen sudoBefehl verhindert, bei dem der Hostname geändert wird.

Antworten:

8

Warum nicht einfach eine OEM-Installation dafür verwenden? Es ist nicht so hübsch, aber es erledigt den Job. Wenn Sie diesen Weg gehen möchten, lesen Sie die ausgezeichnete Antwort von izx auf diese Frage: Wie installiere ich Ubuntu für jemanden vor (OEM-Installation)?

Grundsätzlich fordert das System den Benutzer (beim ersten Start) auf, eine Reihe von Informationen einzugeben, um seinen Computer zu personalisieren. Dies umfasst die Sprache, den Speicherort, den Benutzernamen, den Hostnamen, das Kennwort usw. Grundsätzlich alles, was Ihr Computer normalerweise zu einer Installation auffordert.

Dies ist genau das, was OEM Bilder für gemeint sind, und sie haben einen tollen Job gemacht. Außerdem geben Sie Ihren Schülern einen kleinen Einblick in die Erfahrung von "Ubuntu installieren". Ubuntu-Installationen sind jedoch nicht gerade schmerzhaft. Sie können dies wahrscheinlich in einer einzelnen Klasse tun und Ihren Schülern einige Hausaufgaben geben, um ihre VM zu personalisieren und zu erkunden. Außerdem macht das Partitionieren schmerzhaften Spaß!


Zurück zum eigentlichen Problem (und eine Antwort auf Ihre eigentliche Frage) .....

Schauen wir uns an man usermod, um eine Erklärung dafür zu erhalten, was los ist:

CAVEATS
   Sie müssen sicherstellen, dass der benannte Benutzer keine ausführt
   verarbeitet, wenn dieser Befehl ausgeführt wird, wenn der Benutzer numerisch ist
   Benutzer-ID, der Name des Benutzers oder das Ausgangsverzeichnis des Benutzers wird angezeigt
   geändert. usermod überprüft dies unter Linux, überprüft jedoch nur, ob der Benutzer dies ist
   angemeldet nach utmp auf anderen Architekturen.

Grundsätzlich bedeutet dies nur, dass wir die UID eines Benutzers, seinen Benutzernamen, sein Ausgangsverzeichnis oder ähnliches nicht ändern können, wenn der Benutzer angemeldet ist.

Wir können also ein paar lustige Dinge tun, um dies beim nächsten Start des Systems einzurichten. Anstatt dass Ihr Skript die Arbeit erledigt, lassen wir Ihr Skript ein anderes Skript erstellen, um all das schwere Heben und Manipulieren zu erledigen. Ein Beispiel dafür:

# 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

Grundsätzlich stellen Sie auf diese Weise Ereignisse in die Warteschlange, die beim nächsten Start des Systems ausgeführt werden sollen. Dies wird ausgeführt, bevor das Benutzerland auftritt, sodass das System diese Befehle als root ausführt. Daher wird der benBenutzer nicht angemeldet und das System beschwert sich nicht.

Möglicherweise müssen Sie diesem Element noch zusätzliche Befehle hinzufügen, um eine stärkere Personalisierung zu ermöglichen (z. B. Festlegen des tatsächlichen Namens usw.). Dies ist jedoch optional und muss nur durchgeführt werden, wenn dies während des Setup-Skripts erfolgen soll.

Es kann jedoch eine gute Idee sein, nur einen neuen Benutzer für die Schüler zu erstellen und dann Ihr vorhandenes Opferkonto beizubehalten. Auf diese Weise können Sie, wenn etwas passiert, den Computer bei Bedarf reparieren / verwalten. Wenn Sie Ihren Schülern Administratorzugriff auf ihre VM gewähren, ist dies natürlich eine Art Streitpunkt, da sie den Benutzer "Ausbilder" möglicherweise sehr gut löschen, weil sie Schüler sind.

Kaz Wolfe
quelle
Ich wollte vorschlagen, 'eine OEM-Installation zu machen', und dann fand ich diese Antwort :-)
Sudodus
Vielen Dank für die Beantwortung der Grundfrage, wie ich mein Ziel erreichen kann. Ich werde mich für eine OEM-Installation entscheiden.
Ben
0

Lassen Sie sie auf dem ctrlaltF2Anmeldebildschirm benvon dem Terminal aus drücken und sich anmelden , das geöffnet und ausgeführt wird

sudo passwd

Und geben Sie allen das gleiche Passwort für root, dh die Kursnummer. Wenn also etwas kaputt geht, können Sie es reparieren. Lassen Sie sie sich dann durch Eingabe abmelden exitund als root mit ihrem neuen root-Passwort anmelden und das Skript ausführen (möglicherweise müssen Sie es so ändern, dass es den benBenutzer und nicht root verändert).

Oder lassen Sie sie sich vom Terminal aus als ben anmelden, indem Sie ctrlaltF2(wie zuvor) auf dem Anmeldebildschirm drücken, und lassen Sie sie dann das Skript von dort aus ausführen. Dies könnte funktionieren, da der Benutzer, wie Muru und Kaz Wolfe in der vorherigen Antwort betonten, keine Prozesse ausführen kann und die Anmeldung über das Terminal keine Prozesse wie Xoder Ubuntu-Desktopoder andere Userland-Prozesse starten sollte , die stören usermod. (Ich weiß nicht, ob das funktioniert, ich habe es nicht ausprobiert, aber es ist einen Versuch wert).

Thomas Bodrey
quelle