ubuntuusers.de

hostname per sh-skript ändern

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

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

1
2
3
4
#!/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

Avatar von 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 Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Mit sed würde das ungefähr so aussehen:

1
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

Avatar von 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:

1
2
3
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:

1
2
3
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

1
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

Avatar von 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

1
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

Avatar von 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 Team-Icon

Moderator
Avatar von Thomas_Do

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 Team-Icon

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:

1
2
3
4
5
6
7
8
#!/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: 
Antworten |