TrofiLi
Anmeldungsdatum: 17. Dezember 2010
Beiträge: 130
|
Hallo, ich bin am Erstellen eines Skriptes für den Erststart von neuen Rechnern. Das Betriebssystem wird per Image ausgeteilt, auch mit aktueller Software. Nach dem Verteilen des Images haben alle den selben Namen, das möchte ich per Skript ändern: Der User startet das Skript, das nebenbei die aktuellen Updates installiert .. letzteres bekomme ich hin, beim Namen bin ich auf der Spur: Ich habe schon einiges dazu gefunden, die Datei "hostname" kriege ich mit
| #!/bin/bash
echo Bitte jetzt neuen Hostnamen angeben:
read neuer_hostname
echo $neuer_hostname > /etc/hostname
|
hin. Davor sollte jedoch die Datei /etc/hosts angepasst werden ... und genau da stoße ich an meine Grenzen: Wie kann ich den alten Hostnamen am Ende der ersten Zeile "127.0.0.1 localhost MeinPC" durch die Variable "neuer_hostname" aus obigem Beispiel ersetzen? Bin ich mit "sed" auf der richtigen Spur? Für Euch sicher ein Klacks, für mich ein Problem. Danke Euch.
LG TrofiLi
|
elektronenblitz63
Anmeldungsdatum: 16. Januar 2007
Beiträge: 29307
Wohnort: NRW
|
Hallo, grundsätzlich geht das, es muss aber die /etc/hosts und die /etc/hostname entsprechend angepasst werden. Zudem sollte man besser sicherstellen, dass eine bestimmte Syntax eingehalten wird, also eine Plausibilitätsüberprüfung. Ansonsten wird das wahrscheinlich bei einigen „in die Hose gehen“, oder man gibt zunächst einen entsprechenden Hilfetext den man bestätigen muss aus und geht ein gewisses Risiko ein, die Installation wiederholen oder manuell nacharbeiten zu müssen.
der Name darf nicht länger als 63 Zeichen sein bestimmte Sonderzeichen dürfen nicht am Anfang stehen keine Leerzeichen enthalten und z.B. auch nicht localhost sein identische Namen wären durch Zufall möglich
Wenn Du das über hostname änderst, dann werden schon ein paar Dinge geprüft, allerdings nicht alles, und die genannten Dateien müssen auch manuell (über sed) angepasst werden. Bei Fehlern würde auch einfach ein Abbruch erfolgen ohne den Namen zu ändern.
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Mit sed würde das ungefähr so aussehen:
| sed -i 's/<alter_Hostname>/<neuer_Hostname>/g' /etc/hosts /etc/hostname
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11243
Wohnort: München
|
Man könnte auch einfach hostnamectl dafür nutzen, dann muss man sich nicht groß verkünsteln: http://manpages.ubuntu.com/manpages/trusty/man1/hostnamectl.1.html
|
elektronenblitz63
Anmeldungsdatum: 16. Januar 2007
Beiträge: 29307
Wohnort: NRW
|
Eine Idee wäre noch den Hostnamen automatisch zu vergeben und die MAC-Adresse der Ethernetkarte dabei zu verwenden. Der Name wäre dann einmalig, Fehler ausgeschlossen und eindeutig einem bestimmten Rechner zuzuordnen. Beispielsweise so:
hostname host-$(ip a | grep ether | head -n1 | awk '{print $2}' | tr -d ':')
# oder auch
hostname host-$(ip a | grep ether | head -n1 | awk '{print $2}' | tr : -)
# aus MAC- und IPv4-Adresse
hostname host-$(ip a | grep ether | head -n1 | awk '{print $2}' | tr : -)-$( ip a | grep ether -A2 | grep inet | awk '{print $2}' | tr ./ -)
|
TrofiLi
(Themenstarter)
Anmeldungsdatum: 17. Dezember 2010
Beiträge: 130
|
Hey, super, Eure Antworten helfen mir alle weiter. Vielen Dank.
Hab schon ein bissel gestestet ... ! # seahawk1986 "hostnamectl" ersetzt den statischen Hostname in "/etc/hostname, nicht aber den in "/etc/hosts" - keine Ahnung warum. Beide sind vor dem Skriptablauf identisch, habs mehrfach getestet. Das wäre ansonsten eine sehr bequeme und einfache Lösung ... ! Ach ja, "pretty" funktioniert auch ... ! # elektronenblitz63 Die Sache mit den MAC-Adressen ist clever, es sollten aber "sprechende" Namen rauskommen. Insofern scheidet diese Option aus. Ist trotzdem eine gute Lösung, vielleicht an anderer Stelle - ich behalts mal im Hinterkopf. Mit sed hab ich auch experimentiert, der alte Hostname wird in beiden Dateien durch einen neuen statisch eingegebenen ersetzt. Wenn dieser neue per Variable vom Benutzer abgefragt wird, dann steht als Hostname der Name der Variablen (in meinem Falle "$hostname") drin. Hab hier mal den Teil meines Skriptes rauskopiert, der dafür zuständig ist: | echo -n Der PC soll so heißen:' '
read hostname
sed -i 's/pc001/$hostname/g' /etc/hosts /etc/hostname
|
Und genau so stehts auch nachher in der Datei hostname oder in hosts drin: | 127.0.0.0 $hostname
::1 localhost
... usw
|
Das Problem ist offensichtlich, es wird der Name der Variablen eingetragen und nicht der neu eingegebene gewünschte PC-Name. Die Variable ist korrekt gefüllt: Mit dem Code | echo ' 'Deine Antwort war: $hostname
|
wird der zuvor eingegebene Hostname korrekt ausgegeben. Ich habe auch schon mit Hochkommata und Anführungszeichen rumprobiert, hat aber nix gebracht. Was mach ich hier falsch?
|
egi@lubuntu
Anmeldungsdatum: 25. November 2015
Beiträge: Zähle...
|
Hallo TrofuLi, Du verwendest in Deinem sed-Muster Hochkommata.
sed -i 's/pc001/$hostname/g' /etc/hosts /etc/hostname
Dadurch wird die Variable $hostname nicht expandiert. Verwende stattdessen normale Anführungszeichen. Dann wird $hostname expandiert. Aber Achtung: wenn ein Benutzer genügend Fantasie hat, kann er Deine Variable $hostname so belegen, dass sed problematisch wird. Es kann ein sed-Kommando dabei rauskommen. Gruß
egi
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11243
Wohnort: München
|
TrofiLi schrieb: # seahawk1986 "hostnamectl" ersetzt den statischen Hostname in "/etc/hostname, nicht aber den in "/etc/hosts" - keine Ahnung warum. Beide sind vor dem Skriptablauf identisch, habs mehrfach getestet. Das wäre ansonsten eine sehr bequeme und einfache Lösung ... ! Ach ja, "pretty" funktioniert auch ... !
Wann nutzt man denn schon den Hostname, um vom gleichen Rechner auf localhost zuzugreifen? Das ist funktionell gesehen eigentlich vor allem Kosmetik 😉 Zu deinem sed-Befehl: Da musst du doppelte statt einfache Anführungszeichen benutzen, wenn die Shell vorab die Variable ersetzen soll.
|
TrofiLi
(Themenstarter)
Anmeldungsdatum: 17. Dezember 2010
Beiträge: 130
|
Super, Danke.
Ich probiers gleich.
|
TrofiLi
(Themenstarter)
Anmeldungsdatum: 17. Dezember 2010
Beiträge: 130
|
So, habs getestet und mit | sudo sed -i "s/test/$name/g" /etc/hosts /etc/hostname
|
das gewünschte Ergebnis erhalten.
Wann nutzt man denn schon den Hostname, um vom gleichen Rechner auf localhost zuzugreifen? Das ist funktionell gesehen eigentlich vor allem Kosmetik 😉
Ist natürlich so, klar, Du hast absolut recht. Insofern kann ich auch mit "hostnamectl" arbeiten. Es gibt wohl keinen wirklichen Unterschied zwischen den beiden Wegen, per "sed" oder eben "hostnamectl".
Aber Achtung: wenn ein Benutzer genügend Fantasie hat, kann er Deine Variable $hostname so belegen, dass sed problematisch wird. Es kann ein sed-Kommando dabei rauskommen.
Danke für den Hinweis. Kann ich die Eingabe des Namens irgendwie im Skript bei der Abfrage kontrollieren? Ich dachte an die Verwendung von Kleinbuchstaben, bestenfalls noch Zahlen mit einem maximal zwei Wörtern. Z. B.: "armins computer", "pc 01", "hans dampf" oder irgend sowas ... Das ist aber ein Luxusproblem, mir reicht im Grunde genommen schon das Erreichte - Danke Euch allen schon mal dafür. Selbst wenn ein sed-Kommando rauskommt, die User (Jugendliche mit wenig Ahnung von Skripten und Linux generell) zerschießen ihr eigenes System aus dem USB Stick, um das geht es letztendlich hierbei ... !
|
elektronenblitz63
Anmeldungsdatum: 16. Januar 2007
Beiträge: 29307
Wohnort: NRW
|
TrofiLi schrieb: Danke für den Hinweis. Kann ich die Eingabe des Namens irgendwie im Skript bei der Abfrage kontrollieren? Ich dachte an die Verwendung von Kleinbuchstaben, bestenfalls noch Zahlen mit einem maximal zwei Wörtern. Z. B.: "armins computer", "pc 01", "hans dampf" oder irgend sowas ...
Hallo, dass ist ja genau das was ich oben bereits angeführt habe. Du solltest schon eine Prüfung des Namens durchführen. Leerzeichen, Umlaute wie üäö, ß und Unterstriche dürfen z.B. nicht verwendet werden, und sollten direkt ersetzt werden. Die Wahrscheinlichkeit dass das vorkommt ist sehr hoch. Bevor Du die Eingabe an hostnamectl/sed weiterreichst, führe im einfachsten Fall eine Ersetzung/Löschung bestimmter Zeichen mit tr (s.o.) durch und zeige den dadurch entstandenen Namen, so dass der Anwender noch einmal korrigieren kann. Trotzdem würde ich dann z.B. automatisch noch die letzten beiden Digits der genannten MAC-Adresse anhängen um doppelte Hostnamen zu umgehen.
|
Thomas_Do
Moderator
Anmeldungsdatum: 24. November 2009
Beiträge: 8808
|
TrofiLi schrieb: Danke für den Hinweis. Kann ich die Eingabe des Namens irgendwie im Skript bei der Abfrage kontrollieren?
Du könntest Du die Variable erst einmal (evtl. auch transient mit) hostnamectl setzen. Dann kannst Du bei einem Fehler eine erneute Nutzerabfrage durchführen und ansonsten im Skript fortfahren.
|
TrofiLi
(Themenstarter)
Anmeldungsdatum: 17. Dezember 2010
Beiträge: 130
|
Sorry, dass ich mich erst heute wieder melde. Danke schonmal für Eure Hilfe, auch Dir Thomas_Do für Deinen letzten post, den ich offen gestanden nicht so recht durchdringe: Thomas_Do schrieb:
Du könntest Du die Variable erst einmal (evtl. auch transient mit) hostnamectl setzen. Dann kannst Du bei einem Fehler eine erneute Nutzerabfrage durchführen und ansonsten im Skript fortfahren.
Wie (konkret) lasse ich die Nutzerabfrage bei einem Fehler erneut durchlaufen? (Sorry, bin mit Shellprogrammierung noch etwas schwach auf der Brust ... )
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13168
|
TrofiLi schrieb:
Thomas_Do schrieb:
Du könntest Du die Variable erst einmal (evtl. auch transient mit) hostnamectl setzen. Dann kannst Du bei einem Fehler eine erneute Nutzerabfrage durchführen und ansonsten im Skript fortfahren.
Wie (konkret) lasse ich die Nutzerabfrage bei einem Fehler erneut durchlaufen? (Sorry, bin mit Shellprogrammierung noch etwas schwach auf der Brust ... )
Ungefähr so: | #!/bin/bash
read -p 'Bitte jetzt neuen Hostnamen angeben: ' neuer_hostname
until hostnamectl --set-hostname "$neuer_hostname"; do
echo "FEHLER. Noch einmal:"
read -p 'Bitte einen gültigen Namen eingeben: ' neuer_hostname
done
|
|
TrofiLi
(Themenstarter)
Anmeldungsdatum: 17. Dezember 2010
Beiträge: 130
|
... vielen Dank für den Code.
Ich teste ihn "rauf und runter", aber leider ohne erfolg. Welche Namen würden denn funktionieren? Ich bekomme immer - egal was ich eingebe - Fehlermeldungen 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | Bitte jetzt neuen Hostnamen angeben:
hostnamectl: Unbekannte Option »--set-hostname«
FEHLER. Noch einmal:
Bitte einen gültigen Namen eingeben: di da do
hostnamectl: Unbekannte Option »--set-hostname«
FEHLER. Noch einmal:
Bitte einen gültigen Namen eingeben: debian
hostnamectl: Unbekannte Option »--set-hostname«
FEHLER. Noch einmal:
Bitte einen gültigen Namen eingeben: debian_pc
hostnamectl: Unbekannte Option »--set-hostname«
FEHLER. Noch einmal:
Bitte einen gültigen Namen eingeben: debian-pc
hostnamectl: Unbekannte Option »--set-hostname«
FEHLER. Noch einmal:
Bitte einen gültigen Namen eingeben:
|
|