So erhalten Sie den Hostnamen von einem DHCP-Server

Antworten:

6

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 eth0und wlan0durch die Namen der Schnittstellen, von denen Sie den Hostnamen erhalten möchten. In den meisten Fällen eth0und wlan0sollte 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.

d_inevitable
quelle
Dieses Skript verwendet tatsächlich eine DNS-Abfrage (mithilfe des hostBefehls), 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) )
Ale
4

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"

Dave Morris
quelle
3
Wie lässt du den Server es senden?
Olathe
3

Die Antwort von d_inevitable hat mein Problem fast gelöst, aber nicht vollständig. Das Problem war, dass obwohl:

  1. 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

  2. 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.

George
quelle
3

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.dScripting, 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.localzu schreiben , um zu erkennen, wann das Netzwerk hochgefahren wurde, und eine (in meinem Fall) Suche nach /etc/hostszu erzwingen , um den Hostnamen abzurufen und dann hostnamemit 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, localhostbis ich ihn nach dem /etc/init.d/hostname.sh startAufrufen 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 ...).

RustyCar
quelle
1

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

Oli
quelle
Ich habe DNS und DHCP (Windows 2008) Server in meinem Netzwerk. Und es weist jeder IP-Adresse einen Hostnamen und einen DNS-Namen zu, aber Ubuntu aktualisiert seinen Hostnamen und DNS-Namen nicht. Ich sollte in der Lage sein, diesen zugewiesenen Hostnamen durch Eingabe hostnameund Domäne durch Eingabe zu sehen hostname -d. also sollte es fqdn hostname.domain sein
Oguz Bilgic
AFAIR: Wenn der Client nicht der Windows-Domäne angehört, aktualisiert der Windows-DHCP-Server die Windows-DNS-Einträge nicht dynamisch. Ich bin mir allerdings nicht sicher ... hängt von der Windows-DHCP / DNS-Konfiguration ab
oddfellow
Standardmäßig hat 12.04 diese Zeile "send host-name = gethostname ();" und Sie können diesen Wert sehen, indem Sie "hostname" in die Befehlszeile eingeben. Standardmäßig hat dies keine Auswirkungen auf ein Windows-Netzwerk. Laut der ursprünglichen Frage.
22.
Obwohl zeroconf standardmäßig installiert ist, ist es schrecklich unzuverlässig. Ich bin ehrlich gesagt überrascht, wenn es funktioniert, da das Pingen von hostname oder hostname.local selten zum Erfolg führt, obwohl sich in meinem Netzwerk seit Monaten nichts geändert hat.
Cerin
1
Das ist nicht ganz richtig. Während Sie können senden Sie Ihren Hostnamen zu DHCP - Server mit , send host-name "example.com";um eine bestimmte IP - Adresse zu erhalten, können Sie genauso gut fordern eine mit request host-name;.
Dmitry Grigoryev
1

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.

Adam
quelle
1

Beachten Sie, dass bei Verwendung von Ubuntu 18.04 die Einbindungsskripte nicht mehr erforderlich sind. Wenn der Hostname der Installation localhostim /etc/hostnameDHCP-Client auf eingestellt ist, wird der Hostname beim Start automatisch unter Verwendung des von DHCP ausgegebenen Namens festgelegt, sofern vorhanden. Wenn hostnamectles ausgeführt wird, wird es localhostals 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
Justin Scott
quelle
0

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.

user248850
quelle
0

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")
Michael R. Hines
quelle