Ich möchte, dass Ubuntu den Hostnamen und den DNS-Namen von einem DHCP- Client erhält . Die Standardinstallation von Ubuntu 11.10 (Oneiric Ocelot) macht das nicht.
Dieselbe Frage wurde gestellt und ist in den Ubuntu-Foren ungelöst .
Ich möchte, dass Ubuntu den Hostnamen und den DNS-Namen von einem DHCP- Client erhält . Die Standardinstallation von Ubuntu 11.10 (Oneiric Ocelot) macht das nicht.
Dieselbe Frage wurde gestellt und ist in den Ubuntu-Foren ungelöst .
Antworten:
Es gibt eine Möglichkeit, dies mit einem kleinen Skript für einen DHCP-Hook zu tun, wie hier beschrieben .
Erstellen Sie eine neue Datei:
sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname
und füge den folgenden Code ein:
#!/bin/sh
# Filename: /etc/dhcp/dhclient-exit-hooks.d/hostname
# Purpose: Used by dhclient-script to set the hostname of the system
# to match the DNS information for the host as provided by
# DHCP.
#
# Do not update hostname for virtual machine IP assignments
if [ "$interface" != "eth0" ] && [ "$interface" != "wlan0" ]
then
return
fi
if [ "$reason" != BOUND ] && [ "$reason" != RENEW ] \
&& [ "$reason" != REBIND ] && [ "$reason" != REBOOT ]
then
return
fi
echo dhclient-exit-hooks.d/hostname: Dynamic IP address = $new_ip_address
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -r 's/((.*)[^\.])\.?/\1/g' )
echo $hostname > /etc/hostname
hostname $hostname
echo dhclient-exit-hooks.d/hostname: Dynamic Hostname = $hostname
Ersetzen Sie eth0
und wlan0
durch die Namen der Schnittstellen, von denen Sie den Hostnamen erhalten möchten. In den meisten Fällen eth0
und wlan0
sollte gleich bleiben.
Stellen Sie sicher, dass es lesbar ist ...
chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname
Das ist alles. Bei der nächsten DHCP-Antwort wird Ihr Hostname automatisch aktualisiert.
Sie können Ihren Hostnamen von Ihrem DHCP-Server beziehen - er ist Teil der DHCP-Spezifikation.
https://tools.ietf.org/html/rfc1533#section-3.14
"Diese Option gibt den Namen des Clients an"
Die Antwort von d_inevitable hat mein Problem fast gelöst, aber nicht vollständig. Das Problem war, dass obwohl:
Der DHCP - Server hat einen Hostnamen gesendet (durch Hinzufügen des
option host name 'client1'
in der dhcpd.conf) und ich überprüfte es tatsächlich, indem ich den Inhalt des DHCP-Angebots mit wireshark aufzeichnete und analysierte
Der DHCP - Client erwartete den Hostnamen vom DHCP - Server (durch Hinzufügen von
request host-name
in der dhclient.conf)
Der Client hat keinen neuen Hostnamen erhalten (leicht durch Eingabe zu überprüfen)
hostname
im Terminal und erhalte den alten Hostnamen oder keinen Hostnamen, wenn ich den Inhalt / die Datei gelöscht habe). Infolgedessen kopierte die von d_inevitable vorgeschlagene Lösung nur eine leere Zeichenfolge.
Um das zu lösen, habe ich eine grobe Lösung angewendet, die im Allgemeinen nicht befolgt werden sollte, es sei denn, Sie möchten unbedingt, dass es funktioniert, wie ich es war.
Öffnen Sie zunächst mit Bearbeitungsfunktion das DHCP-Client-Steuerungsskript:
sudo vi /sbin/dhclient-script
Dort müssen Sie die Funktion suchen
set_hostname()
Verwenden Sie einfach die Suche und es sollte richtig kommen. Zumindest auf meinem Computer hat diese Funktion drei If-Then-else-Bedingungen, die ineinander gekapselt sind:
# set host name set_hostname () {lokaler aktueller_hostname
if [ -n "$new_host_name" ]; then current_hostname=$(hostname) # current host name is empty, '(none)' or 'localhost' or differs from new one from DHCP if [ -z "$current_hostname" ] || [ "$current_hostname" = '(none)' ] || [ "$current_hostname" = 'localhost' ] || [ "$current_hostname" = "$old_host_name" ]; then if [ "$new_host_name" != "$old_host_name" ]; then hostname "$new_host_name" fi fi fi }
Nun müssen Sie die Zuweisung des neuen Hostnamens zu Ihrem Host erzwingen, egal was passiert. Aus diesem Grund möchten Sie die beiden gekapselten If-Then-else auskommentieren. Das Ergebnis sollte ungefähr so aussehen:
# set host name set_hostname () {lokaler aktueller_hostname
if [ -n "$new_host_name" ]; then current_hostname=$(hostname) # current host name is empty, '(none)' or 'localhost' or differs from new one from DHCP #if [ -z "$current_hostname" ] || # [ "$current_hostname" = '(none)' ] || # [ "$current_hostname" = 'localhost' ] || # [ "$current_hostname" = "$old_host_name" ]; then # if [ "$new_host_name" != "$old_host_name" ]; then hostname "$new_host_name" # fi #fi fi }
Jetzt sollte das d_inevitable's oder das wie erwartet funktionieren. Hoffe das hilft, wenn du in einer ähnlichen verzweifelten Frustration bist wie ich.
Die Antwort von Oli ist nachweislich falsch ("Sie erhalten Ihren Hostnamen nicht vom DHCP-Server"), wie die anderen Antworten hier und auch meine jüngsten Erfahrungen mit einem RHEL7-System belegen. Das System hat seinen Hostnamen vom DHCP-Server erhalten.
In der Tat gibt es in den DHCP-Konfigurationsdateien Dinge, die dies ermöglichen sollen. Beispielsweise:
host host4 { # verified
hardware ethernet 41:88:22:11:33:22;
fixed-address 192.168.0.4;
option host-name "host4";
}
Soll dem Host mitteilen, dass er host4 heißt.
Wie sich herausstellt, scheint der dhclient von isc DIESES NICHT ZU UNTERSTÜTZEN!
Dhcpcd5 ist jedoch sofort einsatzbereit. Stoppen Sie dhclient, installieren Sie dhcpcd5, führen Sie dhcpcd aus, erneuern Sie Ihre Lease und puffen Sie, Ihr Hostname auf Ihrem DHCP-Client wird auf den vom DHCP-Server gesendeten Namen gesetzt. Kein dhclient-exit-hooks.d
Scripting, keine Hacks rc.local
, nichts.
Abschließend habe ich viel Zeit darauf verwendet, dies mit dem dhclient von ISC zum Laufen zu bringen. Absolut keine Freude, auch wenn der Server den Hostnamen sendet.
Meine anfängliche Lösung für das Problem bestand darin, einen niedlichen Code rc.local
zu schreiben , um zu erkennen, wann das Netzwerk hochgefahren wurde, und eine (in meinem Fall) Suche nach /etc/hosts
zu erzwingen , um den Hostnamen abzurufen und dann hostname
mit diesem Hostnamen zu starten. Es funktioniert, aber bis zum Aufrufen des Netzwerks ist Ihr Hostname wahrscheinlich falsch (wenn Sie einen Host zum ersten Mal bereitstellen, entferne ich ihn /etc/hostname
, sodass der Hostname so lange angezeigt wird, localhost
bis ich ihn nach dem /etc/init.d/hostname.sh start
Aufrufen des Netzwerks ausführen kann. Wenn Sie also zum ersten Mal einen neuen Namen erhalten, müssen Sie booten zweimal - einmal, um Ihren Hostnamen zu erhalten und einmal, um diesen Namen verfügbar zu haben, wenn alles startet ...).
Sie erhalten Ihren Hostnamen nicht vom DHCP-Server.
Sie können Ihren Hostnamen an den Server senden , wodurch sich die zugewiesene IP möglicherweise ändert. Sie können den gesendeten Namen ändern, indem Sie entweder Ihre Network Manager-Verbindung bearbeiten (das Feld heißt DHCP-Client-ID) oder (als Root) bearbeiten /etc/dhcp/dhclient.conf
. Suchen Sie nach der Zeile, in der steht:
send host-name "<hostname>";
... und ändern Sie <hostname>
nach Belieben.
Standardmäßig erhält Ubuntu seine DNS-Einstellungen vom Router (wenn er sie sendet), aber ich vermute, Sie sprechen von lokalem DNS / mDNS, bei dem Sie über ihren Hostnamen auf andere Computer zugreifen können. Dies wird in Ubuntu Ahavi oder Zeroconf genannt und ist standardmäßig installiert.
Sie sollten über auf Ihren Computer zugreifen können <hostname>.local
hostname
und Domäne durch Eingabe zu sehen hostname -d
. also sollte es fqdn hostname.domain sein
send host-name "example.com";
um eine bestimmte IP - Adresse zu erhalten, können Sie genauso gut fordern eine mit request host-name;
.
Wenn dies gefunden wird, kann dies ein Fehler in den dhcpclient-Skripten sein. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
Versuchen Sie, $ old_host_name bei der IP-Erneuerung zu bereinigen
echo unset old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname
Auch die statische Datei / etc / hostname scheint Vorrang vor der DHCP-Antwort zu haben, lassen Sie sie also leer
> / etc / hostname
Getestet auf Ubuntu 14.04 und DNSMASQ Server.
Beachten Sie, dass bei Verwendung von Ubuntu 18.04 die Einbindungsskripte nicht mehr erforderlich sind. Wenn der Hostname der Installation localhost
im /etc/hostname
DHCP-Client auf eingestellt ist, wird der Hostname beim Start automatisch unter Verwendung des von DHCP ausgegebenen Namens festgelegt, sofern vorhanden. Wenn hostnamectl
es ausgeführt wird, wird es localhost
als permanenter Hostname aufgeführt, und was auch immer DHCP als vorübergehender Hostname ausgibt.
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
Die Antwort hängt davon ab, ob Sie statische Leases auf Ihrem DHCP-Server verwenden oder nicht. In diesem Fall ist es nicht erforderlich, den Hostnamen vom DNS abzurufen. Sie können diese Zeile in der Lösung von d_inevitable ändern
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
zu
hostname=${new_host_name}
Dies sollte jedoch automatisch geschehen, wenn Ihr Hostname ursprünglich localhost.localdomain lautet, sodass Sie kein Skript schreiben müssen. Wenn Sie jedoch den Hostnamen auf den FQDN setzen möchten, müssen Sie das Skript von d_inevitable in ändern
hostname=${new_host_name}.${new_domain_name}
Auch dies funktioniert nur, wenn Sie statische Leases verwenden.
Ich habe nicht genug Reputation, um einen Kommentar abzugeben, aber ich würde gerne auf die vorherige Antwort zurückgreifen, da dies das Problem für mich mit einem Dhclient-Hook fast gelöst hätte.
Ich habe festgestellt, dass bei Verwendung des Standard-ISC-DHCP-Servers aus irgendeinem Grund der oben genannte Hook einen Hostnamen mit einem '.' Punkt am Ende des Hostnamens aus irgendeinem Grund.
In der vorherigen Antwort müssen Sie möglicherweise die äußere Periode mit einem sed "ausschneiden":
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
Würde werden:
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
host
Befehls), um den Hostnamen zu extrahieren, der der zugewiesenen IP-Adresse zugeordnet ist. DHCP-Server können tatsächlich explizit eine Hostnamenoption festlegen (Option 12), die sich möglicherweise von dem Hostnamen unterscheidet, den Sie bei einer DNS-Abfrage der IP erhalten (dies kann möglicherweise auch fehlschlagen, wenn im DNS kein PTR-Eintrag für die IP vorhanden ist) )