Voglio che Ubuntu ottenga il nome host e il nome DNS da un client DHCP . L'installazione predefinita di Ubuntu 11.10 (Oneiric Ocelot) non lo fa.
La stessa domanda è stata posta e non è stata risolta nei forum di Ubuntu .
Voglio che Ubuntu ottenga il nome host e il nome DNS da un client DHCP . L'installazione predefinita di Ubuntu 11.10 (Oneiric Ocelot) non lo fa.
La stessa domanda è stata posta e non è stata risolta nei forum di Ubuntu .
Risposte:
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 eth0
e wlan0
con i nomi delle interfacce da cui desideri ottenere il nome host. Nella maggior parte dei casi eth0
e wlan0
dovrebbe 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.
È possibile ottenere il vostro nome host dal server DHCP - è parte della specifica DHCP.
https://tools.ietf.org/html/rfc1533#section-3.14
"Questa opzione specifica il nome del client"
La risposta di d_inevitable ha quasi risolto il mio problema, ma non del tutto. Il problema era che sebbene:
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
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.
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.d
script, 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.local
per rilevare quando la rete è arrivata e forzare una (nel mio caso) ricerca /etc/hosts
per ottenere il nome host e quindi in esecuzione hostname
con 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 è localhost
fino a quando non posso essere eseguito /etc/init.d/hostname.sh start
una 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 ...).
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
hostname
e dominio digitando hostname -d
. quindi è fqdn dovrebbe essere hostname.domain
send host-name "example.com";
per ottenere un indirizzo IP specifico, è possibile richiederne uno anche con request host-name;
.
Se trovato che può essere un bug di script dhcpclient. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
Prova a pulire $ old_host_name al rinnovo ip
echo unset old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname
Anche statico / etc / hostname sembra avere priorità rispetto alla risposta dhcp, quindi lascialo vuoto
> / etc / hostname
Testato su ubuntu 14.04 e server dnsmasq.
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 localhost
nel /etc/hostname
client DHCP, il nome host verrà impostato automaticamente all'avvio utilizzando il nome emesso da DHCP, se presente. Durante l'esecuzione hostnamectl
verrà elencato localhost
come nome host permanente e qualsiasi cosa DHCP emetta come nome host transitorio.
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
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.
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")
host
comando) 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 )