Come ottenere il nome host da un server DHCP


Risposte:


6

C'è un modo per farlo con un piccolo script per un hook dhcp come descritto qui .

Crea un nuovo file:

sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname

e incolla il seguente codice:

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

Sostituisci eth0e wlan0con i nomi delle interfacce da cui desideri ottenere il nome host. Nella maggior parte dei casi eth0e wlan0dovrebbe rimanere lo stesso.

Assicurati che sia leggibile ...

chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname

È tutto. Alla prossima risposta dhcp il tuo nome host si aggiornerà automaticamente.


questo script utilizza effettivamente una query DNS (utilizzando il hostcomando) per estrarre il nome host associato all'indirizzo IP assegnato. I server DHCP possono effettivamente impostare esplicitamente un'opzione del nome host (opzione 12), che può potenzialmente essere diversa dal nome host ottenuto da una query DNS sull'IP (ciò potrebbe potenzialmente fallire, se non esiste alcun record PTR per l'IP sul DNS )
Ale,


3

La risposta di d_inevitable ha quasi risolto il mio problema, ma non del tutto. Il problema era che sebbene:

  1. Il server DHCP stava inviando un nome host (aggiungendo il

    option host name 'client1' 
    

    nel file dhcpd.conf) e l'ho verificato verificando e analizzando i contenuti dell'offerta DHCP con WireShark

  2. Il client DHCP si aspettava il nome host dal server DHCP (aggiungendo

    request host-name 
    

    in dhclient.conf)

Il client non stava ottenendo un nuovo nome host (facilmente verificabile digitando

hostname

nel terminale e ottenere il vecchio nome host o nessun nome host se avessi eliminato il contenuto / file). Di conseguenza, la soluzione proposta da d_inevitable stava solo copiando una stringa vuota.

Per risolverlo, ho applicato una soluzione rozza, che generalmente non dovrebbe essere seguita a meno che tu non sia disperato di farlo funzionare, come me.

Innanzitutto, aprire con funzionalità di modifica lo script di controllo client DHCP:

sudo vi /sbin/dhclient-script

Lì, dovrai individuare la funzione

set_hostname()

Basta usare la ricerca e dovrebbe venire subito. Ora, almeno sul mio computer, questa funzione ha tre condizioni if-then-else, incapsulate tra loro:

# set nome host set_hostname () {local current_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 }

Ora, ciò di cui hai bisogno è forzare l'assegnazione del nuovo nome host al tuo host, qualunque cosa accada. Quindi vuoi commentare i due if-then-else incapsulati. Il risultato dovrebbe assomigliare a:

# set nome host set_hostname () {local current_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 }

Ora il d_inevitable o questo dovrebbe funzionare come previsto. Spero che ti aiuti se sei in una frustrazione disperata simile a me.


3

La risposta di Oli è evidentemente falsa ("Non ottieni il tuo nome host dal server DHCP"), come evidenziato dalle altre risposte qui, e anche dalla mia recente esperienza su un sistema RHEL7. Tale sistema ha ottenuto il nome host dal server DHCP.

E, in effetti, ci sono cose nei file di configurazione DHCP che dovrebbero realizzarlo. Per esempio:

host host4 {   # verified                                                                                                                                                                                                                   
  hardware ethernet  41:88:22:11:33:22;
  fixed-address 192.168.0.4;                                                                                                                                                                                 
  option host-name "host4";
}

Dovrebbe dire a quell'host che il suo nome è host4.

A quanto pare, il dhclient di isc NON APPARE A SUPPORTO DI QUESTO!

Tuttavia, dhcpcd5 lo fa, fuori dalla scatola. Interrompi dhclient, installa dhcpcd5, esegui dhcpcd, rinnova il contratto di locazione, e poof, il nome host sul client DHCP è impostato sul nome inviato dal server DHCP. Niente dhclient-exit-hooks.dscript, niente hack rc.local, niente.

Come nota finale, ho passato molto tempo a cercare di farlo funzionare usando il dhclient di ISC. Assolutamente no gioia, anche quando il server invia il nome host.

La mia soluzione iniziale al problema era scrivere un codice carino rc.localper rilevare quando la rete è arrivata e forzare una (nel mio caso) ricerca /etc/hostsper ottenere il nome host e quindi in esecuzione hostnamecon quel nome host. Funziona, ma fino a quando la rete non viene visualizzata il tuo nome host è probabilmente errato (al momento della prima distribuzione di un host, rimuovo /etc/hostname, quindi il nome host è localhostfino a quando non posso essere eseguito /etc/init.d/hostname.sh startuna volta che la rete si attiva - quindi quando prima ottieni un nuovo nome devi avviare due volte - una volta per ottenere il tuo nome host e una volta per avere quel nome disponibile quando tutto si avvia ...).


1

Non ottieni il tuo nome host dal server DHCP.

Puoi inviare il tuo nome host al server, che potrebbe cambiare l'IP che ti è stato assegnato. È possibile modificare il nome inviato modificando la connessione di Network Manager (il campo si chiama ID client DHCP) oppure è possibile modificare (come root) /etc/dhcp/dhclient.conf. Cerca la riga che dice:

send host-name "<hostname>";

... e cambia <hostname>come preferisci.


Di default Ubuntu riceverà le sue impostazioni DNS dal router (se le invia) ma sospetto che tu stia parlando di DNS / mDNS ocale dove puoi accedere ad altri computer con il loro nome host. Questo si chiama Ahavi o Zeroconf in Ubuntu ed è installato di default.

Dovresti essere in grado di accedere al tuo computer entro <hostname>.local


Ho server dns e dhcp (windows 2008) sulla mia rete. Ant assegna il nome host e il nome DNS a ciascun IP, ma Ubuntu non aggiorna il nome host e il nome DNS. Dovrei essere in grado di vedere questo nome host assegnato digitando hostnamee dominio digitando hostname -d. quindi è fqdn dovrebbe essere hostname.domain
Oguz Bilgic,

AFAIR se il client non è unito al dominio Windows, il server DHCP di Windows non aggiornerà dinamicamente le voci DNS di Windows. Non sono sicuro però ... dipende dalla configurazione DHCP / DNS di Windows
oddfellow

Per impostazione predefinita, 12.04 ha questa riga "send host-name = gethostname ();" e puoi vedere quel valore digitando "hostname" sulla riga di comando. Per impostazione predefinita, ciò non avrà alcun effetto su una rete Windows. Secondo la domanda originale.
Móż il

Sebbene zeroconf sia installato di default, è orribilmente inaffidabile. Sono sinceramente sorpreso quando funziona, dato che il ping hostname o hostname.local raramente ha successo, anche se nulla è cambiato sulla mia rete da mesi.
Cerin,

1
Questo non è del tutto vero. Sebbene sia possibile inviare il nome host al server DHCP send host-name "example.com";per ottenere un indirizzo IP specifico, è possibile richiederne uno anche con request host-name;.
Dmitry Grigoryev il


1

Si noti che quando si utilizza Ubuntu 18.04 gli script tie-in non sono più necessari. Se il nome host dell'installazione è impostato su localhostnel /etc/hostnameclient DHCP, il nome host verrà impostato automaticamente all'avvio utilizzando il nome emesso da DHCP, se presente. Durante l'esecuzione hostnamectlverrà elencato localhostcome nome host permanente e qualsiasi cosa DHCP emetta come nome host transitorio.

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname

0

La risposta dipende dal fatto che si stiano utilizzando o meno i lease statici sul server DHCP. In tal caso, non è necessario ottenere il nome host da DNS. È possibile modificare questa riga nella soluzione di d_inevitable

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

per

hostname=${new_host_name}

Ma questo dovrebbe accadere automaticamente se il tuo hostname era originariamente impostato su localhost.localdomain, quindi non devi scrivere uno script. Tuttavia, se si desidera impostare il nome host sul nome di dominio completo, è necessario modificare lo script di d_inevitable in

hostname=${new_host_name}.${new_domain_name}

Ancora una volta, tutto questo funziona solo se si utilizzano contratti di locazione statici.


0

Non ho abbastanza reputazione per commentare, ma mi piacerebbe ripercorrere la risposta precedente in quanto ha quasi risolto il problema per me usando un hook dhclient.

Ho scoperto che utilizzando il server DHCP ISC standard per qualche motivo, il suddetto hook genera un nome host con un '.' carattere punto alla fine del nome host per qualche motivo.

Quindi, nella risposta precedente potresti aver bisogno di "tagliare" il periodo estraneo con un sed:

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

Potrebbe diventare:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.